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

x86/e820: Drop obsolete E820_TYPE_RESERVED_KERN and related code

E820_TYPE_RESERVED_KERN is a relict from the ancient history that was used
to early reserve setup_data, see:

28bb22379513 ("x86: move reserve_setup_data to setup.c")

Nowadays setup_data is anyway reserved in memblock and there is no point in
carrying E820_TYPE_RESERVED_KERN that behaves exactly like E820_TYPE_RAM
but only complicates the code.

A bonus for removing E820_TYPE_RESERVED_KERN is a small but measurable
speedup of 20 microseconds in init_mem_mappings() on a VM with 32GB or RAM.

Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20250214090651.3331663-5-rppt@kernel.org

authored by

Mike Rapoport (Microsoft) and committed by
Ingo Molnar
efe659ac d45dd0a9

+4 -83
-1
arch/x86/include/asm/e820/api.h
··· 29 29 extern u64 e820__memblock_alloc_reserved(u64 size, u64 align); 30 30 extern void e820__memblock_setup(void); 31 31 32 - extern void e820__reserve_setup_data(void); 33 32 extern void e820__finish_early_params(void); 34 33 extern void e820__reserve_resources(void); 35 34 extern void e820__reserve_resources_late(void);
-9
arch/x86/include/asm/e820/types.h
··· 35 35 * marking it with the IORES_DESC_SOFT_RESERVED designation. 36 36 */ 37 37 E820_TYPE_SOFT_RESERVED = 0xefffffff, 38 - 39 - /* 40 - * Reserved RAM used by the kernel itself if 41 - * CONFIG_INTEL_TXT=y is enabled, memory of this type 42 - * will be included in the S3 integrity calculation 43 - * and so should not include any memory that the BIOS 44 - * might alter over the S3 transition: 45 - */ 46 - E820_TYPE_RESERVED_KERN = 128, 47 38 }; 48 39 49 40 /*
+3 -62
arch/x86/kernel/e820.c
··· 187 187 static void __init e820_print_type(enum e820_type type) 188 188 { 189 189 switch (type) { 190 - case E820_TYPE_RAM: /* Fall through: */ 191 - case E820_TYPE_RESERVED_KERN: pr_cont("usable"); break; 190 + case E820_TYPE_RAM: pr_cont("usable"); break; 192 191 case E820_TYPE_RESERVED: pr_cont("reserved"); break; 193 192 case E820_TYPE_SOFT_RESERVED: pr_cont("soft reserved"); break; 194 193 case E820_TYPE_ACPI: pr_cont("ACPI data"); break; ··· 763 764 764 765 pfn = PFN_DOWN(entry->addr + entry->size); 765 766 766 - if (entry->type != E820_TYPE_RAM && entry->type != E820_TYPE_RESERVED_KERN) 767 + if (entry->type != E820_TYPE_RAM) 767 768 register_nosave_region(PFN_UP(entry->addr), pfn); 768 769 769 770 if (pfn >= limit_pfn) ··· 990 991 early_param("memmap", parse_memmap_opt); 991 992 992 993 /* 993 - * Reserve all entries from the bootloader's extensible data nodes list, 994 - * because if present we are going to use it later on to fetch e820 995 - * entries from it: 996 - */ 997 - void __init e820__reserve_setup_data(void) 998 - { 999 - struct setup_indirect *indirect; 1000 - struct setup_data *data; 1001 - u64 pa_data, pa_next; 1002 - u32 len; 1003 - 1004 - pa_data = boot_params.hdr.setup_data; 1005 - if (!pa_data) 1006 - return; 1007 - 1008 - while (pa_data) { 1009 - data = early_memremap(pa_data, sizeof(*data)); 1010 - if (!data) { 1011 - pr_warn("e820: failed to memremap setup_data entry\n"); 1012 - return; 1013 - } 1014 - 1015 - len = sizeof(*data); 1016 - pa_next = data->next; 1017 - 1018 - e820__range_update(pa_data, sizeof(*data)+data->len, E820_TYPE_RAM, E820_TYPE_RESERVED_KERN); 1019 - 1020 - if (data->type == SETUP_INDIRECT) { 1021 - len += data->len; 1022 - early_memunmap(data, sizeof(*data)); 1023 - data = early_memremap(pa_data, len); 1024 - if (!data) { 1025 - pr_warn("e820: failed to memremap indirect setup_data\n"); 1026 - return; 1027 - } 1028 - 1029 - indirect = (struct setup_indirect *)data->data; 1030 - 1031 - if (indirect->type != SETUP_INDIRECT) 1032 - e820__range_update(indirect->addr, indirect->len, 1033 - E820_TYPE_RAM, E820_TYPE_RESERVED_KERN); 1034 - } 1035 - 1036 - pa_data = pa_next; 1037 - early_memunmap(data, len); 1038 - } 1039 - 1040 - e820__update_table(e820_table); 1041 - 1042 - pr_info("extended physical RAM map:\n"); 1043 - e820__print_table("reserve setup_data"); 1044 - } 1045 - 1046 - /* 1047 994 * Called after parse_early_param(), after early parameters (such as mem=) 1048 995 * have been processed, in which case we already have an E820 table filled in 1049 996 * via the parameter callback function(s), but it's not sorted and printed yet: ··· 1008 1063 static const char *__init e820_type_to_string(struct e820_entry *entry) 1009 1064 { 1010 1065 switch (entry->type) { 1011 - case E820_TYPE_RESERVED_KERN: /* Fall-through: */ 1012 1066 case E820_TYPE_RAM: return "System RAM"; 1013 1067 case E820_TYPE_ACPI: return "ACPI Tables"; 1014 1068 case E820_TYPE_NVS: return "ACPI Non-volatile Storage"; ··· 1023 1079 static unsigned long __init e820_type_to_iomem_type(struct e820_entry *entry) 1024 1080 { 1025 1081 switch (entry->type) { 1026 - case E820_TYPE_RESERVED_KERN: /* Fall-through: */ 1027 1082 case E820_TYPE_RAM: return IORESOURCE_SYSTEM_RAM; 1028 1083 case E820_TYPE_ACPI: /* Fall-through: */ 1029 1084 case E820_TYPE_NVS: /* Fall-through: */ ··· 1044 1101 case E820_TYPE_PRAM: return IORES_DESC_PERSISTENT_MEMORY_LEGACY; 1045 1102 case E820_TYPE_RESERVED: return IORES_DESC_RESERVED; 1046 1103 case E820_TYPE_SOFT_RESERVED: return IORES_DESC_SOFT_RESERVED; 1047 - case E820_TYPE_RESERVED_KERN: /* Fall-through: */ 1048 1104 case E820_TYPE_RAM: /* Fall-through: */ 1049 1105 case E820_TYPE_UNUSABLE: /* Fall-through: */ 1050 1106 default: return IORES_DESC_NONE; ··· 1066 1124 case E820_TYPE_PRAM: 1067 1125 case E820_TYPE_PMEM: 1068 1126 return false; 1069 - case E820_TYPE_RESERVED_KERN: 1070 1127 case E820_TYPE_RAM: 1071 1128 case E820_TYPE_ACPI: 1072 1129 case E820_TYPE_NVS: ··· 1294 1353 if (entry->type == E820_TYPE_SOFT_RESERVED) 1295 1354 memblock_reserve(entry->addr, entry->size); 1296 1355 1297 - if (entry->type != E820_TYPE_RAM && entry->type != E820_TYPE_RESERVED_KERN) 1356 + if (entry->type != E820_TYPE_RAM) 1298 1357 continue; 1299 1358 1300 1359 memblock_add(entry->addr, entry->size);
-1
arch/x86/kernel/setup.c
··· 895 895 setup_clear_cpu_cap(X86_FEATURE_APIC); 896 896 } 897 897 898 - e820__reserve_setup_data(); 899 898 e820__finish_early_params(); 900 899 901 900 if (efi_enabled(EFI_BOOT))
+1 -2
arch/x86/kernel/tboot.c
··· 200 200 tboot->num_mac_regions = 0; 201 201 202 202 for (i = 0; i < e820_table->nr_entries; i++) { 203 - if ((e820_table->entries[i].type != E820_TYPE_RAM) 204 - && (e820_table->entries[i].type != E820_TYPE_RESERVED_KERN)) 203 + if (e820_table->entries[i].type != E820_TYPE_RAM) 205 204 continue; 206 205 207 206 add_mac_region(e820_table->entries[i].addr, e820_table->entries[i].size);
-8
arch/x86/mm/init_64.c
··· 469 469 !e820__mapped_any(paddr & PAGE_MASK, paddr_next, 470 470 E820_TYPE_RAM) && 471 471 !e820__mapped_any(paddr & PAGE_MASK, paddr_next, 472 - E820_TYPE_RESERVED_KERN) && 473 - !e820__mapped_any(paddr & PAGE_MASK, paddr_next, 474 472 E820_TYPE_ACPI)) 475 473 set_pte_init(pte, __pte(0), init); 476 474 continue; ··· 523 525 if (!after_bootmem && 524 526 !e820__mapped_any(paddr & PMD_MASK, paddr_next, 525 527 E820_TYPE_RAM) && 526 - !e820__mapped_any(paddr & PMD_MASK, paddr_next, 527 - E820_TYPE_RESERVED_KERN) && 528 528 !e820__mapped_any(paddr & PMD_MASK, paddr_next, 529 529 E820_TYPE_ACPI)) 530 530 set_pmd_init(pmd, __pmd(0), init); ··· 611 615 !e820__mapped_any(paddr & PUD_MASK, paddr_next, 612 616 E820_TYPE_RAM) && 613 617 !e820__mapped_any(paddr & PUD_MASK, paddr_next, 614 - E820_TYPE_RESERVED_KERN) && 615 - !e820__mapped_any(paddr & PUD_MASK, paddr_next, 616 618 E820_TYPE_ACPI)) 617 619 set_pud_init(pud, __pud(0), init); 618 620 continue; ··· 697 703 if (!after_bootmem && 698 704 !e820__mapped_any(paddr & P4D_MASK, paddr_next, 699 705 E820_TYPE_RAM) && 700 - !e820__mapped_any(paddr & P4D_MASK, paddr_next, 701 - E820_TYPE_RESERVED_KERN) && 702 706 !e820__mapped_any(paddr & P4D_MASK, paddr_next, 703 707 E820_TYPE_ACPI)) 704 708 set_p4d_init(p4d, __p4d(0), init);