Messages in this thread Patch in this message | | | Date | Wed, 9 Jul 2008 01:37:27 -0700 | From | "Yinghai Lu" <> | Subject | Re: [PATCH] x86: not overmap than end in init_memory_mapping - 64bit |
| |
On Wed, Jul 9, 2008 at 1:34 AM, Ingo Molnar <mingo@elte.hu> wrote: > > * Ingo Molnar <mingo@elte.hu> wrote: > >> > handle head and tail that can not aligned to big pages. >> > >> > with this patch, on system that support gbpages >> > change >> > last_map_addr: 1080000000 end: 1078000000 >> > to >> > last_map_addr: 1078000000 end: 1078000000 >> > >> > Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> >> >> applied to tip/x86/core, thanks Yinghai. > > found an early boot crash on a testbox: > > [ 0.000000] last_pfn = 0x3fff0 max_arch_pfn = 0x3ffffffff > [ 0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106 > [ 0.000000] init_memory_mapping > [ 0.000000] kernel direct mapping tables up to 3fff0000 @ 8000-b000 > [ 0.000000] last_map_addr: 40000000 end: 3fff0000 > [ 0.000000] ACPI: RSDP 000F76F0, 0014 (r0 Nvidia) > PANIC: early exception 0e rip 10:ffffffff803d3b8a error 0 cr2 ffff88003fff3040 > [ 0.000000] Pid: 0, comm: swapper Not tainted 2.6.26-rc9-tip-00118-g95f03c7-dirty #16954 > [ 0.000000] > [ 0.000000] Call Trace: > [ 0.000000] [<ffffffff80c05196>] early_idt_handler+0x56/0x6a > [ 0.000000] [<ffffffff803d3b8a>] ? acpi_tb_print_table_header+0xe/0xd5 > [ 0.000000] [<ffffffff803d3bfc>] ? acpi_tb_print_table_header+0x80/0xd5 > [ 0.000000] [<ffffffff803d42f4>] ? acpi_tb_scan_memory_for_rsdp+0xc8/0xd3 > > i bisected it down to: > > | a1007454854803f6fc63f0a881518cea87df6d9a is first bad commit > | commit a1007454854803f6fc63f0a881518cea87df6d9a > | Author: Yinghai Lu <yhlu.kernel@gmail.com> > | Date: Tue Jul 8 01:43:27 2008 -0700 > | > | x86: not overmap more than the end of RAM in init_memory_mapping - 64bit > > with this config: > > http://redhat.com/~mingo/misc/config-Wed_Jul__9_09_43_06_CEST_2008.bad > > crashlog: > > http://redhat.com/~mingo/misc/crashlog-Wed_Jul__9_09_43_06_CEST_2008.bad > > i've pushed the failing tree out to tip/tmp.x86.Jul__9_09_43 > > reverting the commit solves the crash. The crash seems to be because > ACPI is unable to access that memory range. (perhaps early_ioremap > fails?)
system with less than 4g?
please test attached patch [PATCH] x86: make max_pfn cover acpi table below 4g
YH [PATCH] x86: make max_pfn cover acpi table below 4g
when system have 4g less ram installed, and acpi table sit near end of ram. make max_pfn cover them too. so 64bit kernel don't need to mess up fixmap.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
--- arch/x86/kernel/e820.c | 18 ++++++++++++------ arch/x86/kernel/setup.c | 13 +++---------- include/asm-x86/e820.h | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-)
Index: linux-2.6/arch/x86/kernel/e820.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/e820.c +++ linux-2.6/arch/x86/kernel/e820.c @@ -1056,12 +1056,20 @@ unsigned long __initdata end_user_pfn = /* * Find the highest page frame number we have available */ -unsigned long __init e820_end_of_ram(void) +unsigned long __init e820_end(void) { - unsigned long last_pfn; + int i; + unsigned long last_pfn = 0; unsigned long max_arch_pfn = MAX_ARCH_PFN; - last_pfn = find_max_pfn_with_active_regions(); + for (i = 0; i < e820.nr_map; i++) { + struct e820entry *ei = &e820.map[i]; + unsigned long end_pfn; + + end_pfn = (ei->addr + ei->size) >> PAGE_SHIFT; + if (end_pfn > last_pfn) + last_pfn = end_pfn; + } if (last_pfn > max_arch_pfn) last_pfn = max_arch_pfn; @@ -1192,9 +1200,7 @@ static int __init parse_memmap_opt(char * the real mem size before original memory map is * reset. */ - e820_register_active_regions(0, 0, -1UL); - saved_max_pfn = e820_end_of_ram(); - remove_all_active_ranges(); + saved_max_pfn = e820_end(); #endif e820.nr_map = 0; userdef = 1; Index: linux-2.6/arch/x86/kernel/setup.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup.c +++ linux-2.6/arch/x86/kernel/setup.c @@ -714,22 +714,18 @@ void __init setup_arch(char **cmdline_p) early_gart_iommu_check(); #endif - e820_register_active_regions(0, 0, -1UL); /* * partially used pages are not usable - thus * we are rounding upwards: */ - max_pfn = e820_end_of_ram(); + max_pfn = e820_end(); /* preallocate 4k for mptable mpc */ early_reserve_e820_mpc_new(); /* update e820 for memory not covered by WB MTRRs */ mtrr_bp_init(); - if (mtrr_trim_uncached_memory(max_pfn)) { - remove_all_active_ranges(); - e820_register_active_regions(0, 0, -1UL); - max_pfn = e820_end_of_ram(); - } + if (mtrr_trim_uncached_memory(max_pfn)) + max_pfn = e820_end(); #ifdef CONFIG_X86_32 /* max_low_pfn get updated here */ @@ -772,9 +768,6 @@ void __init setup_arch(char **cmdline_p) */ acpi_boot_table_init(); - /* Remove active ranges so rediscovery with NUMA-awareness happens */ - remove_all_active_ranges(); - #ifdef CONFIG_ACPI_NUMA /* * Parse SRAT to discover nodes. Index: linux-2.6/include/asm-x86/e820.h =================================================================== --- linux-2.6.orig/include/asm-x86/e820.h +++ linux-2.6/include/asm-x86/e820.h @@ -99,7 +99,7 @@ extern void free_early(u64 start, u64 en extern void early_res_to_bootmem(u64 start, u64 end); extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); -extern unsigned long e820_end_of_ram(void); +extern unsigned long e820_end(void); extern int e820_find_active_region(const struct e820entry *ei, unsigned long start_pfn, unsigned long last_pfn, | |