x86/efi-bgrt: Use efi_mem_reserve() to avoid copying image data
authorMatt Fleming <matt@codeblueprint.co.uk>
Thu, 23 Jun 2016 10:36:32 +0000 (11:36 +0100)
committerMatt Fleming <matt@codeblueprint.co.uk>
Fri, 9 Sep 2016 15:08:38 +0000 (16:08 +0100)
efi_mem_reserve() allows us to permanently mark EFI boot services
regions as reserved, which means we no longer need to copy the image
data out and into a separate buffer.

Leaving the data in the original boot services region has the added
benefit that BGRT images can now be passed across kexec reboot.

Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Tested-by: Dave Young <dyoung@redhat.com> [kexec/kdump]
Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> [arm]
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Peter Jones <pjones@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Josh Boyer <jwboyer@fedoraproject.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Môshe van der Sterre <me@moshe.nl>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
arch/x86/platform/efi/efi-bgrt.c

index 6a2f5691b1ab57261809617ca9a9b375adfe135e..6aad870e89620974a685c40300f77cb7694a6f93 100644 (file)
@@ -82,21 +82,12 @@ void __init efi_bgrt_init(void)
        }
        bgrt_image_size = bmp_header.size;
 
-       bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL | __GFP_NOWARN);
+       bgrt_image = memremap(bgrt_tab->image_address, bmp_header.size, MEMREMAP_WB);
        if (!bgrt_image) {
-               pr_notice("Ignoring BGRT: failed to allocate memory for image (wanted %zu bytes)\n",
-                      bgrt_image_size);
-               return;
-       }
-
-       image = memremap(bgrt_tab->image_address, bmp_header.size, MEMREMAP_WB);
-       if (!image) {
                pr_notice("Ignoring BGRT: failed to map image memory\n");
-               kfree(bgrt_image);
                bgrt_image = NULL;
                return;
        }
 
-       memcpy(bgrt_image, image, bgrt_image_size);
-       memunmap(image);
+       efi_mem_reserve(bgrt_tab->image_address, bgrt_image_size);
 }