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. [...] -- Michal Hocko SUSE Labs