x86/boot changes for v4.9
Linus,
Please pull the latest x86-boot-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-boot-for-linus
# HEAD: 917db484dc6a69969d317b3e57add4208a8d9d42 x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
The changes in this cycle were:
- Save e820 table RAM footprint on larger kernel configurations. (Denys Vlasenko)
- pmem related fixes (Dan Williams)
- theoretical e820 boundary condition fix (Wei Yang)
Thanks,
Ingo
------------------>
Dan Williams (1):
x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
Denys Vlasenko (3):
x86/e820: Mark some static functions __init
x86/e820: Prepare e280 code for switch to dynamic storage x86/e820: Use much less memory for e820/e820_saved, save up to 120k
Wei Yang (1):
x86/e820: Fix very large 'size' handling boundary condition
arch/x86/include/asm/e820.h | 6 +- arch/x86/kernel/e820.c | 155 ++++++++++++++++++++++---------------- arch/x86/kernel/early-quirks.c | 2 +- arch/x86/kernel/kexec-bzimage64.c | 4 +- arch/x86/kernel/resource.c | 4 +- arch/x86/kernel/setup.c | 8 +- arch/x86/kernel/tboot.c | 8 +- arch/x86/mm/init.c | 4 +- arch/x86/platform/efi/efi.c | 2 +- arch/x86/xen/setup.c | 2 +- 10 files changed, 112 insertions(+), 83 deletions(-)
arch/x86/include/asm/e820.h +4 -2
@@ -10,8 +10,8 @@#include <uapi/asm/e820.h> #ifndef __ASSEMBLY__/* see comment in arch/x86/kernel/e820.c */ -extern struct e820map e820; -extern struct e820map e820_saved; +extern struct e820map *e820; +extern struct e820map *e820_saved;extern unsigned long pci_mem_start;extern int e820_any_mapped (u64 start,u64 end,unsigned type);
@@ -53,6 +53,8 @@ extern void e820_reserve_resources_late(void);extern void setup_memory_map (void );extern char *default_machine_specific_memory_setup (void ); +extern void e820_reallocate_tables (void ); +/* * Returns true iff the specified range [s,e) is completely contained inside * the ISA region.
arch/x86/kernel/e820.c +90 -65
389 lines not on this page · raw message
arch/x86/kernel/early-quirks.c +1 -1
@@ -555,7 +555,7 @@ intel_graphics_stolen(int num, int slot, int func,/* Mark this space as reserved */ e820_add_region (base, size,E820_RESERVED ); -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map); }static void __init intel_graphics_quirks (int num,int slot,int func)
arch/x86/kernel/kexec-bzimage64.c +2 -2
@@ -99,14 +99,14 @@ static int setup_e820_entries(struct boot_params *params) {unsigned int nr_e820_entries; - nr_e820_entries = e820_saved.nr_map; + nr_e820_entries = e820_saved->nr_map;/* TODO: Pass entries more than E820MAX in bootparams setup data */ if (nr_e820_entries >E820MAX ) nr_e820_entries =E820MAX ; params->e820_entries = nr_e820_entries; -memcpy (¶ms->e820_map, &e820_saved.map, +memcpy (¶ms->e820_map, &e820_saved->map, nr_e820_entries *sizeof (struct e820entry ));return 0 ;
arch/x86/kernel/resource.c +2 -2
@@ -27,8 +27,8 @@ static void remove_e820_regions(struct resource *avail)int i;struct e820entry *entry; -for (i =0 ; i < e820.nr_map; i++) { - entry = &e820.map[i]; +for (i =0 ; i < e820->nr_map; i++) { + entry = &e820->map[i];resource_clip (avail, entry->addr, entry->addr + entry->size -1 );
arch/x86/kernel/setup.c +4 -4
@@ -458,8 +458,8 @@ static void __init e820_reserve_setup_data(void)early_memunmap (data,sizeof (*data)); } -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); -memcpy (&e820_saved, &e820,sizeof (struct e820map )); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map); +memcpy (e820_saved, e820,sizeof (struct e820map ));printk (KERN_INFO "extended physical RAM map:\n" );e820_print_map ("reserve setup_data" ); }
@@ -763,7 +763,7 @@ static void __init trim_bios_range(void)*/ e820_remove_range (BIOS_BEGIN ,BIOS_END -BIOS_BEGIN ,E820_RAM ,1 ); -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map); }/* called before trim_bios_range() to spare extra sanitize */
@@ -1032,7 +1032,7 @@ void __init setup_arch(char **cmdline_p)if (ppro_with_ram_bug ()) {e820_update_range (0x70000000ULL ,0x40000ULL ,E820_RAM ,E820_RESERVED ); -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map);printk (KERN_INFO "fixed physical RAM map:\n" );e820_print_map ("bad_ppro" ); }
arch/x86/kernel/tboot.c +4 -4
@@ -188,12 +188,12 @@ static int tboot_setup_sleep(void) tboot->num_mac_regions =0 ; -for (i =0 ; i < e820.nr_map; i++) { -if ((e820.map[i].type !=E820_RAM ) - && (e820.map[i].type !=E820_RESERVED_KERN )) +for (i =0 ; i < e820->nr_map; i++) { +if ((e820->map[i].type !=E820_RAM ) + && (e820->map[i].type !=E820_RESERVED_KERN ))continue ; -add_mac_region (e820.map[i].addr, e820.map[i].size); +add_mac_region (e820->map[i].addr, e820->map[i].size); } tboot->acpi_sinfo.kernel_s3_resume_vector =
arch/x86/mm/init.c +3 -1
@@ -699,8 +699,10 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) } } -void free_initmem (void ) +void __ref free_initmem (void ) { +e820_reallocate_tables (); +free_init_pages ("unused kernel" , (unsigned long )(&__init_begin), (unsigned long )(&__init_end));
arch/x86/platform/efi/efi.c +1 -1
@@ -166,7 +166,7 @@ static void __init do_add_efi_memmap(void) }e820_add_region (start, size, e820_type); } -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map); }int __init efi_memblock_x86_reserve_range (void )
arch/x86/xen/setup.c +1 -1
@@ -861,7 +861,7 @@ char * __init xen_memory_setup(void)e820_add_region (ISA_START_ADDRESS ,ISA_END_ADDRESS -ISA_START_ADDRESS ,E820_RESERVED ); -sanitize_e820_map (e820.map,ARRAY_SIZE (e820.map), &e820.nr_map); +sanitize_e820_map (e820->map,ARRAY_SIZE (e820->map), &e820->nr_map);/* * Check whether the kernel itself conflicts with the target E820 map.