Messages in this thread Patch in this message | | | Date | Thu, 23 Jan 2014 21:55:13 -0800 | Subject | Re: Panic on 8-node system in memblock_virt_alloc_try_nid() | From | Yinghai Lu <> |
| |
On Thu, Jan 23, 2014 at 2:49 PM, Dave Hansen <dave.hansen@intel.com> wrote: > Linus's current tree doesn't boot on an 8-node/1TB NUMA system that I > have. Its reboots are *LONG*, so I haven't fully bisected it, but it's > down to a just a few commits, most of which are changes to the memblock > code. Since the panic is in the memblock code, it looks like a > no-brainer. It's almost certainly the code from Santosh or Grygorii > that's triggering this. > > Config and good/bad dmesg with memblock=debug are here: > > http://sr71.net/~dave/intel/3.13/ > > Please let me know if you need it bisected further than this.
Please check attached patch, and it should fix the problem.
Yinghai Subject: [PATCH] x86: Fix numa with reverting wrong memblock setting.
Dave reported Numa on x86 is broken on system with 1T memory.
It turns out | commit 5b6e529521d35e1bcaa0fe43456d1bbb335cae5d | Author: Santosh Shilimkar <santosh.shilimkar@ti.com> | Date: Tue Jan 21 15:50:03 2014 -0800 | | x86: memblock: set current limit to max low memory address
set 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 that offending patch.
Reported-by: Dave Hansen <dave.hansen@intel.com> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
--- arch/x86/include/asm/page_types.h | 4 ++-- arch/x86/kernel/setup.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
Index: linux-2.6/arch/x86/include/asm/page_types.h =================================================================== --- linux-2.6.orig/arch/x86/include/asm/page_types.h +++ linux-2.6/arch/x86/include/asm/page_types.h @@ -51,9 +51,9 @@ extern int devmem_is_allowed(unsigned lo 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); 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 @@ -1173,7 +1173,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); /* | |