On Mon, Dec 23, 2019 at 6:31 AM Christophe Leroy
<christophe.leroy@xxxxxx> wrote:
On powerpc, VDSO functions and syscalls cannot be implemented in C
because the Linux kernel ABI requires that CR[SO] bit is set in case
of error and cleared when no error.
As this cannot be done in C, C VDSO functions and syscall'based
fallback need a trampoline in ASM.
By moving the fallback calls out of the common code, arches like
powerpc can implement both the call to C VDSO and the fallback call
in a single trampoline function.
Maybe the issue is that I'm not a powerpc person, but I don't
understand this. The common vDSO code is in C. Presumably this means
that you need an asm trampoline no matter what to call the C code. Is
the improvement that, with this change, you can have the asm
trampoline do a single branch, so it's logically:
ret = [call the C code];
if (ret == 0) {
set success bit;
} else {
ret = fallback;
if (ret == 0)
set success bit;
else
set failure bit;
}
return ret;
instead of:
ret = [call the C code, which includes the fallback];
if (ret == 0)
set success bit;
else
set failure bit;
It's not obvious to me that the former ought to be faster.
The two advantages are:
- No need play back and forth with CR[SO] and negative return value.
- No stack frame is required in VDSO C functions for the fallbacks.
How is no stack frame required? Do you mean that the presence of the
fallback causes worse code generation? Can you improve the fallback
instead?