diff mbox series

efi/x86: Only copy the compressed kernel image in efi_relocate_kernel()

Message ID 20201011142012.96493-1-nivedita@alum.mit.edu
State Accepted
Commit 688eb28211abdf82a3f51e8997f1c8137947227d
Headers show
Series efi/x86: Only copy the compressed kernel image in efi_relocate_kernel() | expand

Commit Message

Arvind Sankar Oct. 11, 2020, 2:20 p.m. UTC
The image_size argument to efi_relocate_kernel() is currently specified
as init_size, but this is unnecessarily large. The compressed kernel is
much smaller, in fact, its image only extends up to the start of _bss,
since at this point, the .bss section is still uninitialized.

Depending on compression level, this can reduce the amount of data
copied by 4-5x.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
---
 drivers/firmware/efi/libstub/x86-stub.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Arvind Sankar Oct. 25, 2020, 4:19 p.m. UTC | #1
On Sun, Oct 11, 2020 at 10:20:12AM -0400, Arvind Sankar wrote:
> The image_size argument to efi_relocate_kernel() is currently specified

> as init_size, but this is unnecessarily large. The compressed kernel is

> much smaller, in fact, its image only extends up to the start of _bss,

> since at this point, the .bss section is still uninitialized.

> 

> Depending on compression level, this can reduce the amount of data

> copied by 4-5x.

> 

> Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>


Ping

> ---

>  drivers/firmware/efi/libstub/x86-stub.c | 5 ++++-

>  1 file changed, 4 insertions(+), 1 deletion(-)

> 

> diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c

> index 3672539cb96e..f14c4ff5839f 100644

> --- a/drivers/firmware/efi/libstub/x86-stub.c

> +++ b/drivers/firmware/efi/libstub/x86-stub.c

> @@ -715,8 +715,11 @@ unsigned long efi_main(efi_handle_t handle,

>  	    (IS_ENABLED(CONFIG_X86_32) && buffer_end > KERNEL_IMAGE_SIZE)    ||

>  	    (IS_ENABLED(CONFIG_X86_64) && buffer_end > MAXMEM_X86_64_4LEVEL) ||

>  	    (image_offset == 0)) {

> +		extern char _bss[];

> +

>  		status = efi_relocate_kernel(&bzimage_addr,

> -					     hdr->init_size, hdr->init_size,

> +					     (unsigned long)_bss - bzimage_addr,

> +					     hdr->init_size,

>  					     hdr->pref_address,

>  					     hdr->kernel_alignment,

>  					     LOAD_PHYSICAL_ADDR);

> -- 

> 2.26.2

>
Ard Biesheuvel Oct. 25, 2020, 4:28 p.m. UTC | #2
On Sun, 25 Oct 2020 at 17:19, Arvind Sankar <nivedita@alum.mit.edu> wrote:
>

> On Sun, Oct 11, 2020 at 10:20:12AM -0400, Arvind Sankar wrote:

> > The image_size argument to efi_relocate_kernel() is currently specified

> > as init_size, but this is unnecessarily large. The compressed kernel is

> > much smaller, in fact, its image only extends up to the start of _bss,

> > since at this point, the .bss section is still uninitialized.

> >

> > Depending on compression level, this can reduce the amount of data

> > copied by 4-5x.

> >

> > Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>

>

> Ping

>


I'll pick this up as a fix once the merge window closes.

> > ---

> >  drivers/firmware/efi/libstub/x86-stub.c | 5 ++++-

> >  1 file changed, 4 insertions(+), 1 deletion(-)

> >

> > diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c

> > index 3672539cb96e..f14c4ff5839f 100644

> > --- a/drivers/firmware/efi/libstub/x86-stub.c

> > +++ b/drivers/firmware/efi/libstub/x86-stub.c

> > @@ -715,8 +715,11 @@ unsigned long efi_main(efi_handle_t handle,

> >           (IS_ENABLED(CONFIG_X86_32) && buffer_end > KERNEL_IMAGE_SIZE)    ||

> >           (IS_ENABLED(CONFIG_X86_64) && buffer_end > MAXMEM_X86_64_4LEVEL) ||

> >           (image_offset == 0)) {

> > +             extern char _bss[];

> > +

> >               status = efi_relocate_kernel(&bzimage_addr,

> > -                                          hdr->init_size, hdr->init_size,

> > +                                          (unsigned long)_bss - bzimage_addr,

> > +                                          hdr->init_size,

> >                                            hdr->pref_address,

> >                                            hdr->kernel_alignment,

> >                                            LOAD_PHYSICAL_ADDR);

> > --

> > 2.26.2

> >
Arvind Sankar Oct. 25, 2020, 5:24 p.m. UTC | #3
On Sun, Oct 25, 2020 at 05:28:06PM +0100, Ard Biesheuvel wrote:
> On Sun, 25 Oct 2020 at 17:19, Arvind Sankar <nivedita@alum.mit.edu> wrote:

> >

> > On Sun, Oct 11, 2020 at 10:20:12AM -0400, Arvind Sankar wrote:

> > > The image_size argument to efi_relocate_kernel() is currently specified

> > > as init_size, but this is unnecessarily large. The compressed kernel is

> > > much smaller, in fact, its image only extends up to the start of _bss,

> > > since at this point, the .bss section is still uninitialized.

> > >

> > > Depending on compression level, this can reduce the amount of data

> > > copied by 4-5x.

> > >

> > > Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>

> >

> > Ping

> >

> 

> I'll pick this up as a fix once the merge window closes.


Thanks!

> 

> > > ---

> > >  drivers/firmware/efi/libstub/x86-stub.c | 5 ++++-

> > >  1 file changed, 4 insertions(+), 1 deletion(-)

> > >

> > > diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c

> > > index 3672539cb96e..f14c4ff5839f 100644

> > > --- a/drivers/firmware/efi/libstub/x86-stub.c

> > > +++ b/drivers/firmware/efi/libstub/x86-stub.c

> > > @@ -715,8 +715,11 @@ unsigned long efi_main(efi_handle_t handle,

> > >           (IS_ENABLED(CONFIG_X86_32) && buffer_end > KERNEL_IMAGE_SIZE)    ||

> > >           (IS_ENABLED(CONFIG_X86_64) && buffer_end > MAXMEM_X86_64_4LEVEL) ||

> > >           (image_offset == 0)) {

> > > +             extern char _bss[];

> > > +

> > >               status = efi_relocate_kernel(&bzimage_addr,

> > > -                                          hdr->init_size, hdr->init_size,

> > > +                                          (unsigned long)_bss - bzimage_addr,

> > > +                                          hdr->init_size,

> > >                                            hdr->pref_address,

> > >                                            hdr->kernel_alignment,

> > >                                            LOAD_PHYSICAL_ADDR);

> > > --

> > > 2.26.2

> > >
diff mbox series

Patch

diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index 3672539cb96e..f14c4ff5839f 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -715,8 +715,11 @@  unsigned long efi_main(efi_handle_t handle,
 	    (IS_ENABLED(CONFIG_X86_32) && buffer_end > KERNEL_IMAGE_SIZE)    ||
 	    (IS_ENABLED(CONFIG_X86_64) && buffer_end > MAXMEM_X86_64_4LEVEL) ||
 	    (image_offset == 0)) {
+		extern char _bss[];
+
 		status = efi_relocate_kernel(&bzimage_addr,
-					     hdr->init_size, hdr->init_size,
+					     (unsigned long)_bss - bzimage_addr,
+					     hdr->init_size,
 					     hdr->pref_address,
 					     hdr->kernel_alignment,
 					     LOAD_PHYSICAL_ADDR);