On Tue, Dec 24, 2019 at 4:15 AM Andy Lutomirski <l...@amacapital.net> wrote:
>
>
>
> > On Dec 24, 2019, at 7:53 PM, christophe leroy <christophe.le...@c-s.fr> 
> > wrote:
> >
> > 
> >
> >> Le 24/12/2019 à 03:27, Andy Lutomirski a écrit :
> >>> On Mon, Dec 23, 2019 at 6:31 AM Christophe Leroy
> >>> <christophe.le...@c-s.fr> wrote:
> >>>
> >>> On powerpc, __arch_get_vdso_data() clobbers the link register,
> >>> requiring the caller to set a stack frame in order to save it.
> >>>
> >>> As the parent function already has to set a stack frame and save
> >>> the link register to call the C vdso function, retriving the
> >>> vdso data pointer there is lighter.
> >> I'm confused.  Can't you inline __arch_get_vdso_data()?  Or is the
> >> issue that you can't retrieve the program counter on power without
> >> clobbering the link register?
> >
> > Yes it can be inlined (I did it in V1 
> > https://patchwork.ozlabs.org/patch/1180571/), but you can't do it without 
> > clobbering the link register, because the only way to get the program 
> > counter is to do to as if you were calling another function but you call to 
> > the address which just follows where you are, so that it sets LR which the 
> > simulated return address which corresponds to the address following the 
> > branch.
> >
> > static __always_inline
> > const struct vdso_data *__arch_get_vdso_data(void)
> > {
> >    void *ptr;
> >
> >    asm volatile(
> >        "    bcl    20, 31, .+4;\n"
> >        "    mflr    %0;\n"
> >        "    addi    %0, %0, __kernel_datapage_offset - (.-4);\n"
> >        : "=b"(ptr) : : "lr");
> >
> >    return ptr + *(unsigned long *)ptr;
> > }
> >
> >> I would imagine that this patch generates worse code on any
> >> architecture with PC-relative addressing modes (which includes at
> >> least x86_64, and I would guess includes most modern architectures).
> >
> > Why ? Powerpc is also using PC-relative addressing for all calls but 
> > indirect calls.
>
> I mean PC-relative access for data.  The data page is at a constant, known 
> offset from the vDSO text.
>
> I haven’t checked how much x86_64 benefits from this, but at least the 
> non-array fields ought to be accessible with a PC-relative access.
>
> It should be possible to refactor a little bit so that the compiler can still 
> see what’s going on.  Maybe your patch actually does this. I’d want to look 
> at the assembly.  This also might not matter much on x86_64 in particular, 
> since x86_64 can convert a PC-relative address to an absolute address with a 
> single instruction with no clobbers.
>
> Does power have PC-relative data access?  If so, I wonder if the code can be 
> arranged so that even the array accesses don’t require computing an absolute 
> address at any point.

Indeed the x86 code is also suboptimal, but at least the unnecessary
absolute address calculation is cheap on x86_64.  Ideally we'd pass
around offsets into the vdso data instead of passing pointers, and
maybe the compiler will figure it out.  I can try to play with this in
the morning.

Reply via email to