On Fri, 19 Apr 2019 23:03:43 +0300 Alexey Dobriyan <adobri...@gmail.com> wrote:

> Get "current_pt_regs" pointer right before usage.
> 
> Space savings on x86_64:
> 
>       add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-180 (-180)
>       Function                           old     new   delta
>       load_elf_binary                   5806    5626    -180 !!!

-256 bytes with my setup.

> --- a/fs/binfmt_elf.c
> +++ b/fs/binfmt_elf.c
> @@ -704,12 +704,12 @@ static int load_elf_binary(struct linux_binprm *bprm)
>       unsigned long start_code, end_code, start_data, end_data;
>       unsigned long reloc_func_desc __maybe_unused = 0;
>       int executable_stack = EXSTACK_DEFAULT;
> -     struct pt_regs *regs = current_pt_regs();
>       struct {
>               struct elfhdr elf_ex;
>               struct elfhdr interp_elf_ex;
>       } *loc;
>       struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
> +     struct pt_regs *regs;
>  
>       loc = kmalloc(sizeof(*loc), GFP_KERNEL);
>       if (!loc) {
> @@ -1159,6 +1159,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
>                               MAP_FIXED | MAP_PRIVATE, 0);
>       }
>  
> +     regs = current_pt_regs();
>  #ifdef ELF_PLAT_INIT
>       /*
>        * The ABI may specify that certain registers be set up in special

Why the heck does this make such a difference?

Reply via email to