[PATCH] cpuset memory spread slab cache implementation
[linux-2.6-block.git] / mm / slab.c
index 1c8f5ee230d5dfeaf59fdcf5a1b6334cfa5f3691..de516658d3d868ec0b1ca40d1314b9420f0ceba2 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -94,6 +94,7 @@
 #include       <linux/interrupt.h>
 #include       <linux/init.h>
 #include       <linux/compiler.h>
+#include       <linux/cpuset.h>
 #include       <linux/seq_file.h>
 #include       <linux/notifier.h>
 #include       <linux/kallsyms.h>
                         SLAB_CACHE_DMA | \
                         SLAB_MUST_HWCACHE_ALIGN | SLAB_STORE_USER | \
                         SLAB_RECLAIM_ACCOUNT | SLAB_PANIC | \
-                        SLAB_DESTROY_BY_RCU)
+                        SLAB_DESTROY_BY_RCU | SLAB_MEM_SPREAD)
 #else
 # define CREATE_MASK   (SLAB_HWCACHE_ALIGN | \
                         SLAB_CACHE_DMA | SLAB_MUST_HWCACHE_ALIGN | \
                         SLAB_RECLAIM_ACCOUNT | SLAB_PANIC | \
-                        SLAB_DESTROY_BY_RCU)
+                        SLAB_DESTROY_BY_RCU | SLAB_MEM_SPREAD)
 #endif
 
 /*
@@ -2810,6 +2811,14 @@ static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
        if (unlikely(current->mempolicy && !in_interrupt())) {
                int nid = slab_node(current->mempolicy);
 
+               if (nid != numa_node_id())
+                       return __cache_alloc_node(cachep, flags, nid);
+       }
+       if (unlikely(cpuset_do_slab_mem_spread() &&
+                                       (cachep->flags & SLAB_MEM_SPREAD) &&
+                                       !in_interrupt())) {
+               int nid = cpuset_mem_spread_node();
+
                if (nid != numa_node_id())
                        return __cache_alloc_node(cachep, flags, nid);
        }