]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm, slab: restore NUMA policy support for large kmalloc
authorVlastimil Babka <vbabka@suse.cz>
Mon, 2 Jun 2025 11:02:12 +0000 (13:02 +0200)
committerVlastimil Babka <vbabka@suse.cz>
Tue, 17 Jun 2025 09:57:22 +0000 (11:57 +0200)
The slab allocator observes the task's NUMA policy in various places
such as allocating slab pages. Large kmalloc() allocations used to do
that too, until an unintended change by c4cab557521a ("mm/slab_common:
cleanup kmalloc_large()") resulted in ignoring mempolicy and just
preferring the local node. Restore the NUMA policy support.

Fixes: c4cab557521a ("mm/slab_common: cleanup kmalloc_large()")
Cc: <stable@vger.kernel.org>
Acked-by: Christoph Lameter (Ampere) <cl@gentwo.org>
Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/slub.c

index 31e11ef256f90ad8a21d6b090f810f4c991a68d6..06d64a5fb1bf4cad79d9855fd9608d97a56d6dc6 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4269,7 +4269,12 @@ static void *___kmalloc_large_node(size_t size, gfp_t flags, int node)
                flags = kmalloc_fix_flags(flags);
 
        flags |= __GFP_COMP;
-       folio = (struct folio *)alloc_pages_node_noprof(node, flags, order);
+
+       if (node == NUMA_NO_NODE)
+               folio = (struct folio *)alloc_pages_noprof(flags, order);
+       else
+               folio = (struct folio *)__alloc_pages_noprof(flags, order, node, NULL);
+
        if (folio) {
                ptr = folio_address(folio);
                lruvec_stat_mod_folio(folio, NR_SLAB_UNRECLAIMABLE_B,