Hi Michal, On 2018/6/11 16:52, Michal Hocko wrote: > On Mon 11-06-18 11:23:18, Xie XiuQi wrote: >> Hi Michal, >> >> On 2018/6/7 20:21, Michal Hocko wrote: >>> On Thu 07-06-18 19:55:53, Hanjun Guo wrote: >>>> On 2018/6/7 18:55, Michal Hocko wrote: >>> [...] >>>>> I am not sure I have the full context but pci_acpi_scan_root calls >>>>> kzalloc_node(sizeof(*info), GFP_KERNEL, node) >>>>> and that should fall back to whatever node that is online. Offline node >>>>> shouldn't keep any pages behind. So there must be something else going >>>>> on here and the patch is not the right way to handle it. What does >>>>> faddr2line __alloc_pages_nodemask+0xf0 tells on this kernel? >>>> >>>> The whole context is: >>>> >>>> The system is booted with a NUMA node has no memory attaching to it >>>> (memory-less NUMA node), also with NR_CPUS less than CPUs presented >>>> in MADT, so CPUs on this memory-less node are not brought up, and >>>> this NUMA node will not be online (but SRAT presents this NUMA node); >>>> >>>> Devices attaching to this NUMA node such as PCI host bridge still >>>> return the valid NUMA node via _PXM, but actually that valid NUMA node >>>> is not online which lead to this issue. >>> >>> But we should have other numa nodes on the zonelists so the allocator >>> should fall back to other node. If the zonelist is not intiailized >>> properly, though, then this can indeed show up as a problem. Knowing >>> which exact place has blown up would help get a better picture... >>> >> >> I specific a non-exist node to allocate memory using kzalloc_node, >> and got this following error message. >> >> And I found out there is just a VM_WARN, but it does not prevent the memory >> allocation continue. >> >> This nid would be use to access NODE_DADA(nid), so if nid is invalid, >> it would cause oops here. >> >> 459 /* >> 460 * Allocate pages, preferring the node given as nid. The node must be valid and >> 461 * online. For more general interface, see alloc_pages_node(). >> 462 */ >> 463 static inline struct page * >> 464 __alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order) >> 465 { >> 466 VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); >> 467 VM_WARN_ON(!node_online(nid)); >> 468 >> 469 return __alloc_pages(gfp_mask, order, nid); >> 470 } >> 471 >> >> (I wrote a ko, to allocate memory on a non-exist node using kzalloc_node().) > > OK, so this is an artificialy broken code, right. You shouldn't get a > non-existent node via standard APIs AFAICS. The original report was > about an existing node which is offline AFAIU. That would be a different > case. If I am missing something and there are legitimate users that try > to allocate from non-existing nodes then we should handle that in > node_zonelist. I think hanjun's comments may help to understood this question: - NUMA node will be built if CPUs and (or) memory are valid on this NUMA node; - But if we boot the system with memory-less node and also with CONFIG_NR_CPUS less than CPUs in SRAT, for example, 64 CPUs total with 4 NUMA nodes, 16 CPUs on each NUMA node, if we boot with CONFIG_NR_CPUS=48, then we will not built numa node for node 3, but with devices on that numa node, alloc memory will be panic because NUMA node 3 is not a valid node. I triggered this BUG on arm64 platform, and I found a similar bug has been fixed on x86 platform. So I sent a similar patch for this bug. Or, could we consider to fix it in the mm subsystem? >From b755de8dfdfef97effaa91379ffafcb81f4d62a1 Mon Sep 17 00:00:00 2001 From: Yinghai Lu <Yinghai.Lu@xxxxxxx> Date: Wed, 20 Feb 2008 12:41:52 -0800 Subject: [PATCH] x86: make dev_to_node return online node a numa system (with multi HT chains) may return node without ram. Aka it is not online. Try to get an online node, otherwise return -1. Signed-off-by: Yinghai Lu <yinghai.lu@xxxxxxx> Signed-off-by: Ingo Molnar <mingo@xxxxxxx> Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> --- arch/x86/pci/acpi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index d95de2f..ea8685f 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -172,6 +172,9 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do set_mp_bus_to_node(busnum, node); else node = get_mp_bus_to_node(busnum); + + if (node != -1 && !node_online(node)) + node = -1; #endif /* Allocate per-root-bus (not per bus) arch-specific data. -- 1.8.3.1 > > [...] > -- Thanks, Xie XiuQi