Skip to content

Commit 2fee036

Browse files
committed
Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI fixes from Ingo Molnar: "This tree reverts a GICv3 commit (which was broken) and fixes it in another way, by adding a memblock build-time entries quirk for ARM64" * 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efi/arm: Revert "Defer persistent reservations until after paging_init()" arm64, mm, efi: Account for GICv3 LPI tables in static memblock reserve table
2 parents 8d33316 + 582a32e commit 2fee036

File tree

7 files changed

+20
-20
lines changed

7 files changed

+20
-20
lines changed

arch/arm64/include/asm/memory.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,17 @@ static inline void *phys_to_virt(phys_addr_t x)
332332
#define virt_addr_valid(kaddr) \
333333
(_virt_addr_is_linear(kaddr) && _virt_addr_valid(kaddr))
334334

335+
/*
336+
* Given that the GIC architecture permits ITS implementations that can only be
337+
* configured with a LPI table address once, GICv3 systems with many CPUs may
338+
* end up reserving a lot of different regions after a kexec for their LPI
339+
* tables (one per CPU), as we are forced to reuse the same memory after kexec
340+
* (and thus reserve it persistently with EFI beforehand)
341+
*/
342+
#if defined(CONFIG_EFI) && defined(CONFIG_ARM_GIC_V3_ITS)
343+
# define INIT_MEMBLOCK_RESERVED_REGIONS (INIT_MEMBLOCK_REGIONS + NR_CPUS + 1)
344+
#endif
345+
335346
#include <asm-generic/memory_model.h>
336347

337348
#endif

arch/arm64/kernel/setup.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,6 @@ void __init setup_arch(char **cmdline_p)
313313
arm64_memblock_init();
314314

315315
paging_init();
316-
efi_apply_persistent_mem_reservations();
317316

318317
acpi_table_upgrade();
319318

drivers/firmware/efi/efi.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -592,11 +592,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
592592

593593
early_memunmap(tbl, sizeof(*tbl));
594594
}
595-
return 0;
596-
}
597595

598-
int __init efi_apply_persistent_mem_reservations(void)
599-
{
600596
if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) {
601597
unsigned long prsv = efi.mem_reserve;
602598

drivers/firmware/efi/libstub/arm-stub.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@ void install_memreserve_table(efi_system_table_t *sys_table_arg)
7575
efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID;
7676
efi_status_t status;
7777

78-
if (IS_ENABLED(CONFIG_ARM))
79-
return;
80-
8178
status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv),
8279
(void **)&rsv);
8380
if (status != EFI_SUCCESS) {

include/linux/efi.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,8 +1198,6 @@ static inline bool efi_enabled(int feature)
11981198
extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
11991199

12001200
extern bool efi_is_table_address(unsigned long phys_addr);
1201-
1202-
extern int efi_apply_persistent_mem_reservations(void);
12031201
#else
12041202
static inline bool efi_enabled(int feature)
12051203
{
@@ -1218,11 +1216,6 @@ static inline bool efi_is_table_address(unsigned long phys_addr)
12181216
{
12191217
return false;
12201218
}
1221-
1222-
static inline int efi_apply_persistent_mem_reservations(void)
1223-
{
1224-
return 0;
1225-
}
12261219
#endif
12271220

12281221
extern int efi_status_to_err(efi_status_t status);

include/linux/memblock.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ extern unsigned long max_pfn;
2929
*/
3030
extern unsigned long long max_possible_pfn;
3131

32-
#define INIT_MEMBLOCK_REGIONS 128
33-
#define INIT_PHYSMEM_REGIONS 4
34-
3532
/**
3633
* enum memblock_flags - definition of memory region attributes
3734
* @MEMBLOCK_NONE: no special request

mm/memblock.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@
2626

2727
#include "internal.h"
2828

29+
#define INIT_MEMBLOCK_REGIONS 128
30+
#define INIT_PHYSMEM_REGIONS 4
31+
32+
#ifndef INIT_MEMBLOCK_RESERVED_REGIONS
33+
# define INIT_MEMBLOCK_RESERVED_REGIONS INIT_MEMBLOCK_REGIONS
34+
#endif
35+
2936
/**
3037
* DOC: memblock overview
3138
*
@@ -92,7 +99,7 @@ unsigned long max_pfn;
9299
unsigned long long max_possible_pfn;
93100

94101
static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
95-
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
102+
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS] __initdata_memblock;
96103
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
97104
static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS] __initdata_memblock;
98105
#endif
@@ -105,7 +112,7 @@ struct memblock memblock __initdata_memblock = {
105112

106113
.reserved.regions = memblock_reserved_init_regions,
107114
.reserved.cnt = 1, /* empty dummy entry */
108-
.reserved.max = INIT_MEMBLOCK_REGIONS,
115+
.reserved.max = INIT_MEMBLOCK_RESERVED_REGIONS,
109116
.reserved.name = "reserved",
110117

111118
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP

0 commit comments

Comments
 (0)