diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2018-11-14 12:55:43 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2018-11-15 04:04:46 -0500 |
commit | eff896288872d687d9662000ec9ae11b6d61766f (patch) | |
tree | 87714359c17406ff59e8d30e78c9213cea1bec27 /include/linux/efi.h | |
parent | 72a58a63a164b4e9d2d914e65caeb551846883f1 (diff) |
efi/arm: Defer persistent reservations until after paging_init()
The new memory EFI reservation feature we introduced to allow memory
reservations to persist across kexec may trigger an unbounded number
of calls to memblock_reserve(). The memblock subsystem can deal with
this fine, but not before memblock resizing is enabled, which we can
only do after paging_init(), when the memory we reallocate the array
into is actually mapped.
So break out the memreserve table processing into a separate routine
and call it after paging_init() on arm64. On ARM, because of limited
reviewing bandwidth of the maintainer, we cannot currently fix this,
so instead, disable the EFI persistent memreserve entirely on ARM so
we can fix it later.
Tested-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Link: http://lkml.kernel.org/r/20181114175544.12860-5-ard.biesheuvel@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/efi.h')
-rw-r--r-- | include/linux/efi.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/efi.h b/include/linux/efi.h index 845174e113ce..100ce4a4aff6 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -1167,6 +1167,8 @@ static inline bool efi_enabled(int feature) | |||
1167 | extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); | 1167 | extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); |
1168 | 1168 | ||
1169 | extern bool efi_is_table_address(unsigned long phys_addr); | 1169 | extern bool efi_is_table_address(unsigned long phys_addr); |
1170 | |||
1171 | extern int efi_apply_persistent_mem_reservations(void); | ||
1170 | #else | 1172 | #else |
1171 | static inline bool efi_enabled(int feature) | 1173 | static inline bool efi_enabled(int feature) |
1172 | { | 1174 | { |
@@ -1185,6 +1187,11 @@ static inline bool efi_is_table_address(unsigned long phys_addr) | |||
1185 | { | 1187 | { |
1186 | return false; | 1188 | return false; |
1187 | } | 1189 | } |
1190 | |||
1191 | static inline int efi_apply_persistent_mem_reservations(void) | ||
1192 | { | ||
1193 | return 0; | ||
1194 | } | ||
1188 | #endif | 1195 | #endif |
1189 | 1196 | ||
1190 | extern int efi_status_to_err(efi_status_t status); | 1197 | extern int efi_status_to_err(efi_status_t status); |