3.14 x86 ACPI handover regression
Kernels 3.14 and newer fail ACPI handover [1] on Supermicro H8QGL servers, invariant of BIOS version or settings, causing boot failure, confirmed across a bunch of servers.
Doing some bisect-fu, it turns out that reverting Yinghai's patch fixes the behaviour. Booting with Santosh's patch (5b6e529521d3, which Yinghai reverts) succeeds, but interestingly booting with the patch before Santosh's patch also succeeds, suggesting there's other interaction. Behaviour is stable at all places tested.
Any tips on how to proceed?
Thanks,
Daniel
-- [1]
ACPI Error: Hardware did not enter ACPI mode (20131218/evxfevnt-113) ACPI Warning: AcpiEnable failed (20131218/utxfinit-169)
ACPI: Unable to enable ACPI
-- [2]
commit 4ce7a8697cb795fda6bdf082c14743b4bcd551c3
Author: Yinghai Lu <[email protected]> Date: Mon Jan 27 17:06:50 2014 -0800
x86: revert wrong memblock current limit setting
Dave reported big numa system booting is broken.
It turns out that commit 5b6e529521d3 ("x86: memblock: set current
limit
to max low memory address") sets the limit to low wrongly.
max_low_pfn_mapped is different from max_pfn_mapped. max_low_pfn_mapped is always under 4G.
That will memblock_alloc_nid all go under 4G.
Revert 5b6e529521d3 to fix a no-boot regression which was triggered by 457ff1de2d24 ("lib/swiotlb.c: use memblock apis for early memory allocations").
arch/x86/include/asm/page_types.h +2 -2
@@ -51,9 +51,9 @@ extern int devmem_is_allowed(unsigned long pagenr);extern unsigned long max_low_pfn_mapped;extern unsigned long max_pfn_mapped; -static inline phys_addr_t get_max_low_mapped (void ) +static inline phys_addr_t get_max_mapped (void ) { -return (phys_addr_t )max_low_pfn_mapped <<PAGE_SHIFT ; +return (phys_addr_t )max_pfn_mapped <<PAGE_SHIFT ; }bool pfn_range_is_mapped (unsigned long start_pfn,unsigned long end_pfn);
arch/x86/kernel/setup.c +1 -1
@@ -1119,7 +1119,7 @@ void __init setup_arch(char **cmdline_p)setup_real_mode (); -memblock_set_current_limit (get_max_low_mapped ()); +memblock_set_current_limit (get_max_mapped ());dma_contiguous_reserve (0 );/*
Signature · 2 lines
Daniel J Blueman Principal Software Engineer, Numascale
[+ linux acpi]
could be other problems ...that is caused by wrong use memblock_alloc replace memblock_find....
Quoted 86 lines · Daniel J Blueman
Kernels 3.14 and newer fail ACPI handover [1] on Supermicro H8QGL servers, invariant of BIOS version or settings, causing boot failure, confirmed across a bunch of servers.
Doing some bisect-fu, it turns out that reverting Yinghai's patch fixes the behaviour. Booting with Santosh's patch (
5b6e529521d3, which Yinghai reverts) succeeds, but interestingly booting with the patch before Santosh's patch also succeeds, suggesting there's other interaction. Behaviour is stable at all places tested.Any tips on how to proceed?
Thanks,
Daniel-- [1]
ACPI Error: Hardware did not enter ACPI mode (20131218/evxfevnt-113) ACPI Warning: AcpiEnable failed (20131218/utxfinit-169)
ACPI: Unable to enable ACPI-- [2]
commit
4ce7a8697cb795fda6bdf082c14743b4bcd551c3Author: Yinghai Lu <[email protected]> Date: Mon Jan 27 17:06:50 2014 -0800x86: revert wrong memblock current limit setting
Dave reported big numa system booting is broken.
It turns out that commit
5b6e529521d3("x86: memblock: set current limit to max low memory address") sets the limit to low wrongly.
max_low_pfn_mappedis different frommax_pfn_mapped.max_low_pfn_mappedis always under 4G.That will
memblock_alloc_nidall go under 4G.Revert
5b6e529521d3to fix a no-boot regression which was triggered by457ff1de2d24("lib/swiotlb.c: use memblock apis for early memory allocations").Signed-off-by Yinghai Lu <[email protected]>Reported-by Dave Hansen <[email protected]>Cc Russell King <[email protected]>Cc Konrad Rzeszutek Wilk <[email protected]>Cc Ingo Molnar <[email protected]>Cc "H. Peter Anvin" <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>arch/x86/include/asm/page_types.h +2
-2@@ -51,9 +51,9 @@ extern int devmem_is_allowed(unsigned long pagenr);extern unsigned long max_low_pfn_mapped;extern unsigned long max_pfn_mapped; -static inline phys_addr_t get_max_low_mapped (void ) +static inline phys_addr_t get_max_mapped (void ) { -return (phys_addr_t )max_low_pfn_mapped <<PAGE_SHIFT ; +return (phys_addr_t )max_pfn_mapped <<PAGE_SHIFT ; }bool pfn_range_is_mapped (unsigned long start_pfn,unsigned long end_pfn);arch/x86/kernel/setup.c +1
-2@@ -1119,7 +1119,7 @@ void __init setup_arch(char **cmdline_p)setup_real_mode (); -memblock_set_current_limit (get_max_low_mapped ()); +memblock_set_current_limit (get_max_mapped ());dma_contiguous_reserve (0 );/* -- Daniel J Blueman
Principal Software Engineer, Numascale