Re: [RFT PATCH] efi: map memreserve table before first use

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 21/11/2018 09:56, Jan Glauber wrote:
On Tue, Nov 20, 2018 at 06:35:42PM +0100, Ard Biesheuvel wrote:
Mapping the MEMRESERVE EFI configuration table from an early initcall
is too late: the GICv3 ITS code that creates persistent reservations
for the boot CPU's LPI tables is invoked from init_IRQ(), which runs
much earlier than the handling of the initcalls.

So instead, move the initialization performed by the initcall into
efi_mem_reserve_persistent() itself.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
---
 drivers/firmware/efi/efi.c | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index fad7c62cfc0e..40de2f6734cc 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -967,15 +967,23 @@ bool efi_is_table_address(unsigned long phys_addr)
 }

 static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
-static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
+static struct linux_efi_memreserve *efi_memreserve_root;

 int efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
 {
        struct linux_efi_memreserve *rsv;

-       if (!efi_memreserve_root)
+       if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
                return -ENODEV;

+       if (!efi_memreserve_root) {
+               efi_memreserve_root = memremap(efi.mem_reserve,
+                                              sizeof(*efi_memreserve_root),
+                                              MEMREMAP_WB);
+               if (WARN_ON_ONCE(!efi_memreserve_root))
+                       return -ENOMEM;
+       }
+
        rsv = kmalloc(sizeof(*rsv), GFP_ATOMIC);
        if (!rsv)
                return -ENOMEM;
@@ -991,20 +999,6 @@ int efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
        return 0;
 }

-static int __init efi_memreserve_root_init(void)
-{
-       if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
-               return -ENODEV;
-
-       efi_memreserve_root = memremap(efi.mem_reserve,
-                                      sizeof(*efi_memreserve_root),
-                                      MEMREMAP_WB);
-       if (!efi_memreserve_root)
-               return -ENOMEM;
-       return 0;
-}
-early_initcall(efi_memreserve_root_init);
-
 #ifdef CONFIG_KEXEC
 static int update_efi_random_seed(struct notifier_block *nb,
                                  unsigned long code, void *unused)
--
2.17.1

Hi Ard,

thanks for the patch, it works fine for me.

If you want:
Tested-by: Jan Glauber <jglauber@xxxxxxxxxx>

FWIW, the splat is gone:

Tested-by: John Garry <john.garry@xxxxxxxxxx>


--Jan







[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux