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-afa0c79e9...@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-afa0c79e9...@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