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

Pull EFI fixes from Ingo Molnar:
"Misc fixes: two warning splat fixes, a leak fix and persistent memory
allocation fixes for ARM"

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
efi: Permit calling efi_mem_reserve_persistent() from atomic context
efi/arm: Defer persistent reservations until after paging_init()
efi/arm/libstub: Pack FDT after populating it
efi/arm: Revert deferred unmap of early memmap mapping
efi: Fix debugobjects warning on 'efi_rts_work'

Changed files
+48 -15
arch
arm64
kernel
drivers
include
linux
+1
arch/arm64/kernel/setup.c
··· 313 313 arm64_memblock_init(); 314 314 315 315 paging_init(); 316 + efi_apply_persistent_mem_reservations(); 316 317 317 318 acpi_table_upgrade(); 318 319
+4
drivers/firmware/efi/arm-init.c
··· 265 265 (params.mmap & ~PAGE_MASK))); 266 266 267 267 init_screen_info(); 268 + 269 + /* ARM does not permit early mappings to persist across paging_init() */ 270 + if (IS_ENABLED(CONFIG_ARM)) 271 + efi_memmap_unmap(); 268 272 } 269 273 270 274 static int __init register_gop_device(void)
+1 -1
drivers/firmware/efi/arm-runtime.c
··· 110 110 { 111 111 u64 mapsize; 112 112 113 - if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { 113 + if (!efi_enabled(EFI_BOOT)) { 114 114 pr_info("EFI services will not be available.\n"); 115 115 return 0; 116 116 }
+24 -13
drivers/firmware/efi/efi.c
··· 592 592 593 593 early_memunmap(tbl, sizeof(*tbl)); 594 594 } 595 + return 0; 596 + } 595 597 598 + int __init efi_apply_persistent_mem_reservations(void) 599 + { 596 600 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) { 597 601 unsigned long prsv = efi.mem_reserve; 598 602 ··· 967 963 } 968 964 969 965 static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); 966 + static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init; 970 967 971 968 int efi_mem_reserve_persistent(phys_addr_t addr, u64 size) 972 969 { 973 - struct linux_efi_memreserve *rsv, *parent; 970 + struct linux_efi_memreserve *rsv; 974 971 975 - if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 972 + if (!efi_memreserve_root) 976 973 return -ENODEV; 977 974 978 - rsv = kmalloc(sizeof(*rsv), GFP_KERNEL); 975 + rsv = kmalloc(sizeof(*rsv), GFP_ATOMIC); 979 976 if (!rsv) 980 977 return -ENOMEM; 981 - 982 - parent = memremap(efi.mem_reserve, sizeof(*rsv), MEMREMAP_WB); 983 - if (!parent) { 984 - kfree(rsv); 985 - return -ENOMEM; 986 - } 987 978 988 979 rsv->base = addr; 989 980 rsv->size = size; 990 981 991 982 spin_lock(&efi_mem_reserve_persistent_lock); 992 - rsv->next = parent->next; 993 - parent->next = __pa(rsv); 983 + rsv->next = efi_memreserve_root->next; 984 + efi_memreserve_root->next = __pa(rsv); 994 985 spin_unlock(&efi_mem_reserve_persistent_lock); 995 - 996 - memunmap(parent); 997 986 998 987 return 0; 999 988 } 989 + 990 + static int __init efi_memreserve_root_init(void) 991 + { 992 + if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 993 + return -ENODEV; 994 + 995 + efi_memreserve_root = memremap(efi.mem_reserve, 996 + sizeof(*efi_memreserve_root), 997 + MEMREMAP_WB); 998 + if (!efi_memreserve_root) 999 + return -ENOMEM; 1000 + return 0; 1001 + } 1002 + early_initcall(efi_memreserve_root_init); 1000 1003 1001 1004 #ifdef CONFIG_KEXEC 1002 1005 static int update_efi_random_seed(struct notifier_block *nb,
+3
drivers/firmware/efi/libstub/arm-stub.c
··· 75 75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID; 76 76 efi_status_t status; 77 77 78 + if (IS_ENABLED(CONFIG_ARM)) 79 + return; 80 + 78 81 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv), 79 82 (void **)&rsv); 80 83 if (status != EFI_SUCCESS) {
+4
drivers/firmware/efi/libstub/fdt.c
··· 158 158 return efi_status; 159 159 } 160 160 } 161 + 162 + /* shrink the FDT back to its minimum size */ 163 + fdt_pack(fdt); 164 + 161 165 return EFI_SUCCESS; 162 166 163 167 fdt_set_fail:
+3
drivers/firmware/efi/memmap.c
··· 118 118 119 119 void __init efi_memmap_unmap(void) 120 120 { 121 + if (!efi_enabled(EFI_MEMMAP)) 122 + return; 123 + 121 124 if (!efi.memmap.late) { 122 125 unsigned long size; 123 126
+1 -1
drivers/firmware/efi/runtime-wrappers.c
··· 67 67 } \ 68 68 \ 69 69 init_completion(&efi_rts_work.efi_rts_comp); \ 70 - INIT_WORK_ONSTACK(&efi_rts_work.work, efi_call_rts); \ 70 + INIT_WORK(&efi_rts_work.work, efi_call_rts); \ 71 71 efi_rts_work.arg1 = _arg1; \ 72 72 efi_rts_work.arg2 = _arg2; \ 73 73 efi_rts_work.arg3 = _arg3; \
+7
include/linux/efi.h
··· 1167 1167 extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); 1168 1168 1169 1169 extern bool efi_is_table_address(unsigned long phys_addr); 1170 + 1171 + extern int efi_apply_persistent_mem_reservations(void); 1170 1172 #else 1171 1173 static inline bool efi_enabled(int feature) 1172 1174 { ··· 1186 1184 static inline bool efi_is_table_address(unsigned long phys_addr) 1187 1185 { 1188 1186 return false; 1187 + } 1188 + 1189 + static inline int efi_apply_persistent_mem_reservations(void) 1190 + { 1191 + return 0; 1189 1192 } 1190 1193 #endif 1191 1194