Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1732974

Re: [RFC PATCH 3/4] x86/asm: Make alternative macro interfaces more clear and consistent

From Josh Poimboeuf <jpoimboe@redhat.com>
Newsgroups linux.kernel
Subject Re: [RFC PATCH 3/4] x86/asm: Make alternative macro interfaces more clear and consistent
Date 2017-09-15 19:30 +0200
Message-ID <uq2Bb-61b-15@gated-at.bofh.it> (permalink)
References <ukyu5-6Gt-5@gated-at.bofh.it> <ukyu5-6Gt-7@gated-at.bofh.it> <ukAmd-7Ri-9@gated-at.bofh.it> <ukBrY-4T-13@gated-at.bofh.it> <uq2Bb-61b-17@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Fri, Sep 15, 2017 at 07:53:46PM +0300, Andrey Ryabinin wrote:
> 
> 
> On 08/31/2017 08:25 PM, Josh Poimboeuf wrote:
> >
> > There have been a few other ideas which have *almost* worked:
> > 
> > 1) Make the 'register void *__sp asm(_ASM_SP)' a global variable instead
> >    of a local one.  This works for GCC and doesn't break clang.  However
> >    it resulted in a lot of changed code on the GCC side.  It looked like
> >    some optimizations had been disabled, even in functions which
> >    shouldn't have been affected.
> > 
> 
> (For those who wasn't following previous discussion there is the patch - http://lkml.kernel.org/r/<75850bb7-a60e-057d-d88b-afa0c79e94a0@gmail.com>
> But, Josh discovered that the patch causes regression in .text size with gcc > 7.x
> http://lkml.kernel.org/r/<20170721132452.ihpws67e3e7ym3al@treble> )
> 
> I'm not so sure that this is disabled optimization. I assume that global rsp makes
> changes something in gcc's register allocation logic, or something like that leading
> to subtle changes in generated code.
> 
> But what I recently find out, is that this "regression" sometimes is actually improvement in .text size.
> It all depends on .config, e.g:
> 
> 
> allnoconfig:
>                text    data     bss     dec     hex filename
> patched	       938094  207700 1215752 2361546  2408ca allnoconfig_p/vmlinux
> unpatched      938768  211796 1215752 2366316  241b6c allnoconfig/vmlinux                                                                                                                                                         
> 
> 
> defconfig:
>                text    data     bss     dec     hex filename
> patched	       10691469        4882856  876544 16450869         fb0535 defconfig_p/vmlinux
> unpatched      10691035        4882856  876544 16450435         fb0383 defconfig/vmlinux
> 
> allyesconfig:
>                text    data     bss     dec     hex filename
> patched	       159216239       153294411       49692672        362203322       1596c8ba        allyesconfig_p/vmlinux
> unpatched      159224951       153294387       49692672        362212010       1596eaaa        allyesconfig/vmlinux
> 
> 
> So there is regression with Josh's config and defconfig, but allnoconfig and allyesconfig shows improvement.
> Note that sometimes there is the difference in .data size too, don't ask me why.
> 
> Given that, perhaps the best thing to do here would be asking gcc devs why is generated code changed.
> And if such changes are harmless (as I suspect) we can just fix the problem with this simple patch http://lkml.kernel.org/r/<75850bb7-a60e-057d-d88b-afa0c79e94a0@gmail.com> ?
> Despite the increased .text on some configs.

Can you change all the other code sites in a similar way, and then run
the numbers again?

  $ git grep __sp |grep register |grep void
  arch/x86/include/asm/alternative.h:	register void *__sp asm(_ASM_SP);				      \
  arch/x86/include/asm/mshyperv.h:	register void *__sp asm(_ASM_SP);
  arch/x86/include/asm/mshyperv.h:	register void *__sp asm(_ASM_SP);
  arch/x86/include/asm/paravirt_types.h:	register void *__sp asm("esp")
  arch/x86/include/asm/paravirt_types.h:	register void *__sp asm("rsp")
  arch/x86/include/asm/preempt.h:	register void *__sp asm(_ASM_SP);			\
  arch/x86/include/asm/preempt.h:	register void *__sp asm(_ASM_SP);				\
  arch/x86/include/asm/processor.h:	register void *__sp asm(_ASM_SP);
  arch/x86/include/asm/rwsem.h:	register void *__sp asm(_ASM_SP);		\
  arch/x86/include/asm/uaccess.h:	register void *__sp asm(_ASM_SP);				\
  arch/x86/include/asm/xen/hypercall.h:	register void *__sp asm(_ASM_SP);
  arch/x86/kvm/emulate.c:	register void *__sp asm(_ASM_SP);
  arch/x86/kvm/vmx.c:	register void *__sp asm(_ASM_SP);
  arch/x86/mm/fault.c:		register void *__sp asm("rsp");

-- 
Josh

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

Re: [RFC PATCH 3/4] x86/asm: Make alternative macro interfaces more  clear and consistent Josh Poimboeuf <jpoimboe@redhat.com> - 2017-09-15 19:30 +0200

csiph-web