On 3/20/20 4:42 AM, Bharata B Rao wrote: > On Thu, Mar 19, 2020 at 02:47:58PM +0100, Vlastimil Babka wrote: >> diff --git a/mm/slub.c b/mm/slub.c >> index 17dc00e33115..7113b1f9cd77 100644 >> --- a/mm/slub.c >> +++ b/mm/slub.c >> @@ -1973,8 +1973,6 @@ static void *get_partial(struct kmem_cache *s, gfp_t flags, int node, >> >> if (node == NUMA_NO_NODE) >> searchnode = numa_mem_id(); >> - else if (!node_present_pages(node)) >> - searchnode = node_to_mem_node(node); >> >> object = get_partial_node(s, get_node(s, searchnode), c, flags); >> if (object || node != NUMA_NO_NODE) >> @@ -2563,17 +2561,27 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, >> struct page *page; >> >> page = c->page; >> - if (!page) >> + if (!page) { >> + /* >> + * if the node is not online or has no normal memory, just >> + * ignore the node constraint >> + */ >> + if (unlikely(node != NUMA_NO_NODE && >> + !node_state(node, N_NORMAL_MEMORY))) >> + node = NUMA_NO_NODE; >> goto new_slab; >> + } >> redo: >> >> if (unlikely(!node_match(page, node))) { >> - int searchnode = node; >> - >> - if (node != NUMA_NO_NODE && !node_present_pages(node)) >> - searchnode = node_to_mem_node(node); >> - >> - if (unlikely(!node_match(page, searchnode))) { >> + /* >> + * same as above but node_match() being false already >> + * implies node != NUMA_NO_NODE >> + */ >> + if (!node_state(node, N_NORMAL_MEMORY)) { >> + node = NUMA_NO_NODE; >> + goto redo; >> + } else { >> stat(s, ALLOC_NODE_MISMATCH); >> deactivate_slab(s, page, c->freelist, c); >> goto new_slab; > > This fixes the problem I reported at > https://lore.kernel.org/linux-mm/20200317092624.GB22538@xxxxxxxxxx/ Thanks, I hope it means I can make it Reported-and-tested-by: you