]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - mm/slab.c
[PATCH] mm: optimize numa policy handling in slab allocator
[karo-tx-linux.git] / mm / slab.c
index bd0317f1e06c2e2e4ac433cb31e5b794eec4af63..6f8495e2185b36c4d4e08402a111a59a3deeb01b 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
 #include       <linux/rcupdate.h>
 #include       <linux/string.h>
 #include       <linux/nodemask.h>
+#include       <linux/mempolicy.h>
 #include       <linux/mutex.h>
 
 #include       <asm/uaccess.h>
@@ -773,6 +774,8 @@ static struct array_cache *alloc_arraycache(int node, int entries,
 }
 
 #ifdef CONFIG_NUMA
+static void *__cache_alloc_node(kmem_cache_t *, gfp_t, int);
+
 static inline struct array_cache **alloc_alien_cache(int node, int limit)
 {
        struct array_cache **ac_ptr;
@@ -2570,6 +2573,15 @@ static inline void *____cache_alloc(kmem_cache_t *cachep, gfp_t flags)
        void *objp;
        struct array_cache *ac;
 
+#ifdef CONFIG_NUMA
+       if (unlikely(current->mempolicy && !in_interrupt())) {
+               int nid = slab_node(current->mempolicy);
+
+               if (nid != numa_node_id())
+                       return __cache_alloc_node(cachep, flags, nid);
+       }
+#endif
+
        check_irq_off();
        ac = ac_data(cachep);
        if (likely(ac->avail)) {