Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI fix from Ingo Molnar:
"An arm64 warning fix"

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
efi: Prevent GICv3 WARN() by mapping the memreserve table before first use

+26 -10
+26 -10
drivers/firmware/efi/efi.c
··· 969 969 static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); 970 970 static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init; 971 971 972 - int efi_mem_reserve_persistent(phys_addr_t addr, u64 size) 972 + static int __init efi_memreserve_map_root(void) 973 + { 974 + if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 975 + return -ENODEV; 976 + 977 + efi_memreserve_root = memremap(efi.mem_reserve, 978 + sizeof(*efi_memreserve_root), 979 + MEMREMAP_WB); 980 + if (WARN_ON_ONCE(!efi_memreserve_root)) 981 + return -ENOMEM; 982 + return 0; 983 + } 984 + 985 + int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) 973 986 { 974 987 struct linux_efi_memreserve *rsv; 988 + int rc; 975 989 976 - if (!efi_memreserve_root) 990 + if (efi_memreserve_root == (void *)ULONG_MAX) 977 991 return -ENODEV; 992 + 993 + if (!efi_memreserve_root) { 994 + rc = efi_memreserve_map_root(); 995 + if (rc) 996 + return rc; 997 + } 978 998 979 999 rsv = kmalloc(sizeof(*rsv), GFP_ATOMIC); 980 1000 if (!rsv) ··· 1013 993 1014 994 static int __init efi_memreserve_root_init(void) 1015 995 { 1016 - if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 1017 - return -ENODEV; 1018 - 1019 - efi_memreserve_root = memremap(efi.mem_reserve, 1020 - sizeof(*efi_memreserve_root), 1021 - MEMREMAP_WB); 1022 - if (!efi_memreserve_root) 1023 - return -ENOMEM; 996 + if (efi_memreserve_root) 997 + return 0; 998 + if (efi_memreserve_map_root()) 999 + efi_memreserve_root = (void *)ULONG_MAX; 1024 1000 return 0; 1025 1001 } 1026 1002 early_initcall(efi_memreserve_root_init);