]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'slab/next' into slab/for-linus
authorPekka Enberg <penberg@kernel.org>
Wed, 3 Oct 2012 06:56:12 +0000 (09:56 +0300)
committerPekka Enberg <penberg@kernel.org>
Wed, 3 Oct 2012 06:56:12 +0000 (09:56 +0300)
1  2 
mm/slab.c
mm/slub.c

diff --combined mm/slab.c
index c6854759bcf1e041d7a21781921ac45cfd2f5484,c4f6e14c2c7150c64159688f672b5f6e56aec47a..d264d90b3682221a47205d77fd4831b666204d7d
+++ b/mm/slab.c
@@@ -498,14 -498,6 +498,6 @@@ static void **dbg_userword(struct kmem_
  
  #endif
  
- #ifdef CONFIG_TRACING
- size_t slab_buffer_size(struct kmem_cache *cachep)
- {
-       return cachep->size;
- }
- EXPORT_SYMBOL(slab_buffer_size);
- #endif
  /*
   * Do not go above this order unless 0 objects fit into the slab or
   * overridden on the command line.
  static int slab_max_order = SLAB_MAX_ORDER_LO;
  static bool slab_max_order_set __initdata;
  
- static inline struct kmem_cache *page_get_cache(struct page *page)
- {
-       page = compound_head(page);
-       BUG_ON(!PageSlab(page));
-       return page->slab_cache;
- }
  static inline struct kmem_cache *virt_to_cache(const void *obj)
  {
        struct page *page = virt_to_head_page(obj);
@@@ -818,6 -803,7 +803,7 @@@ static void __slab_error(const char *fu
        printk(KERN_ERR "slab error in %s(): cache `%s': %s\n",
               function, cachep->name, msg);
        dump_stack();
+       add_taint(TAINT_BAD_PAGE);
  }
  
  /*
@@@ -983,7 -969,7 +969,7 @@@ static void *__ac_get_obj(struct kmem_c
                }
  
                /* The caller cannot use PFMEMALLOC objects, find another one */
 -              for (i = 1; i < ac->avail; i++) {
 +              for (i = 0; i < ac->avail; i++) {
                        /* If a !PFMEMALLOC object is found, swap them */
                        if (!is_obj_pfmemalloc(ac->entry[i])) {
                                objp = ac->entry[i];
                l3 = cachep->nodelists[numa_mem_id()];
                if (!list_empty(&l3->slabs_free) && force_refill) {
                        struct slab *slabp = virt_to_slab(objp);
 -                      ClearPageSlabPfmemalloc(virt_to_page(slabp->s_mem));
 +                      ClearPageSlabPfmemalloc(virt_to_head_page(slabp->s_mem));
                        clear_obj_pfmemalloc(&objp);
                        recheck_pfmemalloc_active(cachep, ac);
                        return objp;
@@@ -1032,7 -1018,7 +1018,7 @@@ static void *__ac_put_obj(struct kmem_c
  {
        if (unlikely(pfmemalloc_active)) {
                /* Some pfmemalloc slabs exist, check if this is one */
 -              struct page *page = virt_to_page(objp);
 +              struct page *page = virt_to_head_page(objp);
                if (PageSlabPfmemalloc(page))
                        set_obj_pfmemalloc(&objp);
        }
@@@ -1781,9 -1767,6 +1767,6 @@@ void __init kmem_cache_init_late(void
  
        slab_state = UP;
  
-       /* Annotate slab for lockdep -- annotate the malloc caches */
-       init_lock_keys();
        /* 6) resize the head arrays to their final sizes */
        mutex_lock(&slab_mutex);
        list_for_each_entry(cachep, &slab_caches, list)
                        BUG();
        mutex_unlock(&slab_mutex);
  
+       /* Annotate slab for lockdep -- annotate the malloc caches */
+       init_lock_keys();
        /* Done! */
        slab_state = FULL;
  
@@@ -2506,8 -2492,9 +2492,9 @@@ __kmem_cache_create (const char *name, 
        }
  #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
        if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
-           && cachep->object_size > cache_line_size() && ALIGN(size, align) < PAGE_SIZE) {
-               cachep->obj_offset += PAGE_SIZE - ALIGN(size, align);
+           && cachep->object_size > cache_line_size()
+           && ALIGN(size, cachep->align) < PAGE_SIZE) {
+               cachep->obj_offset += PAGE_SIZE - ALIGN(size, cachep->align);
                size = PAGE_SIZE;
        }
  #endif
@@@ -3098,7 -3085,7 +3085,7 @@@ static inline void verify_redzone_free(
  }
  
  static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
-                                  void *caller)
+                                  unsigned long caller)
  {
        struct page *page;
        unsigned int objnr;
                *dbg_redzone2(cachep, objp) = RED_INACTIVE;
        }
        if (cachep->flags & SLAB_STORE_USER)
-               *dbg_userword(cachep, objp) = caller;
+               *dbg_userword(cachep, objp) = (void *)caller;
  
        objnr = obj_to_index(cachep, slabp, objp);
  
        if (cachep->flags & SLAB_POISON) {
  #ifdef CONFIG_DEBUG_PAGEALLOC
                if ((cachep->size % PAGE_SIZE)==0 && OFF_SLAB(cachep)) {
-                       store_stackinfo(cachep, objp, (unsigned long)caller);
+                       store_stackinfo(cachep, objp, caller);
                        kernel_map_pages(virt_to_page(objp),
                                         cachep->size / PAGE_SIZE, 0);
                } else {
@@@ -3260,7 -3247,6 +3247,7 @@@ force_grow
  
                /* cache_grow can reenable interrupts, then ac could change. */
                ac = cpu_cache_get(cachep);
 +              node = numa_mem_id();
  
                /* no objects in sight? abort */
                if (!x && (ac->avail == 0 || force_refill))
@@@ -3285,7 -3271,7 +3272,7 @@@ static inline void cache_alloc_debugche
  
  #if DEBUG
  static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
-                               gfp_t flags, void *objp, void *caller)
+                               gfp_t flags, void *objp, unsigned long caller)
  {
        if (!objp)
                return objp;
                poison_obj(cachep, objp, POISON_INUSE);
        }
        if (cachep->flags & SLAB_STORE_USER)
-               *dbg_userword(cachep, objp) = caller;
+               *dbg_userword(cachep, objp) = (void *)caller;
  
        if (cachep->flags & SLAB_RED_ZONE) {
                if (*dbg_redzone1(cachep, objp) != RED_INACTIVE ||
@@@ -3576,8 -3562,8 +3563,8 @@@ done
   * Fallback to other node is possible if __GFP_THISNODE is not set.
   */
  static __always_inline void *
__cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
-                  void *caller)
slab_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
+                  unsigned long caller)
  {
        unsigned long save_flags;
        void *ptr;
@@@ -3663,7 -3649,7 +3650,7 @@@ __do_cache_alloc(struct kmem_cache *cac
  #endif /* CONFIG_NUMA */
  
  static __always_inline void *
__cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller)
  {
        unsigned long save_flags;
        void *objp;
@@@ -3799,7 -3785,7 +3786,7 @@@ free_done
   * be in this state _before_ it is released.  Called with disabled ints.
   */
  static inline void __cache_free(struct kmem_cache *cachep, void *objp,
-     void *caller)
+                               unsigned long caller)
  {
        struct array_cache *ac = cpu_cache_get(cachep);
  
   */
  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
  {
-       void *ret = __cache_alloc(cachep, flags, __builtin_return_address(0));
+       void *ret = slab_alloc(cachep, flags, _RET_IP_);
  
        trace_kmem_cache_alloc(_RET_IP_, ret,
                               cachep->object_size, cachep->size, flags);
@@@ -3850,14 -3836,14 +3837,14 @@@ EXPORT_SYMBOL(kmem_cache_alloc)
  
  #ifdef CONFIG_TRACING
  void *
- kmem_cache_alloc_trace(size_t size, struct kmem_cache *cachep, gfp_t flags)
+ kmem_cache_alloc_trace(struct kmem_cache *cachep, gfp_t flags, size_t size)
  {
        void *ret;
  
-       ret = __cache_alloc(cachep, flags, __builtin_return_address(0));
+       ret = slab_alloc(cachep, flags, _RET_IP_);
  
        trace_kmalloc(_RET_IP_, ret,
-                     size, slab_buffer_size(cachep), flags);
+                     size, cachep->size, flags);
        return ret;
  }
  EXPORT_SYMBOL(kmem_cache_alloc_trace);
  #ifdef CONFIG_NUMA
  void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
  {
-       void *ret = __cache_alloc_node(cachep, flags, nodeid,
-                                      __builtin_return_address(0));
+       void *ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP_);
  
        trace_kmem_cache_alloc_node(_RET_IP_, ret,
                                    cachep->object_size, cachep->size,
  EXPORT_SYMBOL(kmem_cache_alloc_node);
  
  #ifdef CONFIG_TRACING
- void *kmem_cache_alloc_node_trace(size_t size,
-                                 struct kmem_cache *cachep,
+ void *kmem_cache_alloc_node_trace(struct kmem_cache *cachep,
                                  gfp_t flags,
-                                 int nodeid)
+                                 int nodeid,
+                                 size_t size)
  {
        void *ret;
  
-       ret = __cache_alloc_node(cachep, flags, nodeid,
-                                 __builtin_return_address(0));
+       ret = slab_alloc_node(cachep, flags, nodeid, _RET_IP);
        trace_kmalloc_node(_RET_IP_, ret,
-                          size, slab_buffer_size(cachep),
+                          size, cachep->size,
                           flags, nodeid);
        return ret;
  }
@@@ -3896,34 -3881,33 +3882,33 @@@ EXPORT_SYMBOL(kmem_cache_alloc_node_tra
  #endif
  
  static __always_inline void *
- __do_kmalloc_node(size_t size, gfp_t flags, int node, void *caller)
+ __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
  {
        struct kmem_cache *cachep;
  
        cachep = kmem_find_general_cachep(size, flags);
        if (unlikely(ZERO_OR_NULL_PTR(cachep)))
                return cachep;
-       return kmem_cache_alloc_node_trace(size, cachep, flags, node);
+       return kmem_cache_alloc_node_trace(cachep, flags, node, size);
  }
  
  #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_TRACING)
  void *__kmalloc_node(size_t size, gfp_t flags, int node)
  {
-       return __do_kmalloc_node(size, flags, node,
-                       __builtin_return_address(0));
+       return __do_kmalloc_node(size, flags, node, _RET_IP_);
  }
  EXPORT_SYMBOL(__kmalloc_node);
  
  void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
                int node, unsigned long caller)
  {
-       return __do_kmalloc_node(size, flags, node, (void *)caller);
+       return __do_kmalloc_node(size, flags, node, caller);
  }
  EXPORT_SYMBOL(__kmalloc_node_track_caller);
  #else
  void *__kmalloc_node(size_t size, gfp_t flags, int node)
  {
-       return __do_kmalloc_node(size, flags, node, NULL);
+       return __do_kmalloc_node(size, flags, node, 0);
  }
  EXPORT_SYMBOL(__kmalloc_node);
  #endif /* CONFIG_DEBUG_SLAB || CONFIG_TRACING */
   * @caller: function caller for debug tracking of the caller
   */
  static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
-                                         void *caller)
+                                         unsigned long caller)
  {
        struct kmem_cache *cachep;
        void *ret;
        cachep = __find_general_cachep(size, flags);
        if (unlikely(ZERO_OR_NULL_PTR(cachep)))
                return cachep;
-       ret = __cache_alloc(cachep, flags, caller);
+       ret = slab_alloc(cachep, flags, caller);
  
-       trace_kmalloc((unsigned long) caller, ret,
+       trace_kmalloc(caller, ret,
                      size, cachep->size, flags);
  
        return ret;
  #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_TRACING)
  void *__kmalloc(size_t size, gfp_t flags)
  {
-       return __do_kmalloc(size, flags, __builtin_return_address(0));
+       return __do_kmalloc(size, flags, _RET_IP_);
  }
  EXPORT_SYMBOL(__kmalloc);
  
  void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller)
  {
-       return __do_kmalloc(size, flags, (void *)caller);
+       return __do_kmalloc(size, flags, caller);
  }
  EXPORT_SYMBOL(__kmalloc_track_caller);
  
  #else
  void *__kmalloc(size_t size, gfp_t flags)
  {
-       return __do_kmalloc(size, flags, NULL);
+       return __do_kmalloc(size, flags, 0);
  }
  EXPORT_SYMBOL(__kmalloc);
  #endif
@@@ -3995,7 -3979,7 +3980,7 @@@ void kmem_cache_free(struct kmem_cache 
        debug_check_no_locks_freed(objp, cachep->object_size);
        if (!(cachep->flags & SLAB_DEBUG_OBJECTS))
                debug_check_no_obj_freed(objp, cachep->object_size);
-       __cache_free(cachep, objp, __builtin_return_address(0));
+       __cache_free(cachep, objp, _RET_IP_);
        local_irq_restore(flags);
  
        trace_kmem_cache_free(_RET_IP_, objp);
@@@ -4026,7 -4010,7 +4011,7 @@@ void kfree(const void *objp
        debug_check_no_locks_freed(objp, c->object_size);
  
        debug_check_no_obj_freed(objp, c->object_size);
-       __cache_free(c, (void *)objp, __builtin_return_address(0));
+       __cache_free(c, (void *)objp, _RET_IP_);
        local_irq_restore(flags);
  }
  EXPORT_SYMBOL(kfree);
diff --combined mm/slub.c
index 2fdd96f9e9986b4c1244c13fde954d586afa7952,944b4edaeb18a2de45fd4251d5324159d7497165..97a49d9a37cdea11cdc424aff2e24ca2f2087c4a
+++ b/mm/slub.c
@@@ -568,6 -568,8 +568,8 @@@ static void slab_bug(struct kmem_cache 
        printk(KERN_ERR "BUG %s (%s): %s\n", s->name, print_tainted(), buf);
        printk(KERN_ERR "----------------------------------------"
                        "-------------------------------------\n\n");
+       add_taint(TAINT_BAD_PAGE);
  }
  
  static void slab_fix(struct kmem_cache *s, char *fmt, ...)
        return 0;
  }
  
- static noinline int free_debug_processing(struct kmem_cache *s,
-                struct page *page, void *object, unsigned long addr)
+ static noinline struct kmem_cache_node *free_debug_processing(
+       struct kmem_cache *s, struct page *page, void *object,
+       unsigned long addr, unsigned long *flags)
  {
-       unsigned long flags;
-       int rc = 0;
+       struct kmem_cache_node *n = get_node(s, page_to_nid(page));
  
-       local_irq_save(flags);
+       spin_lock_irqsave(&n->list_lock, *flags);
        slab_lock(page);
  
        if (!check_slab(s, page))
                set_track(s, object, TRACK_FREE, addr);
        trace(s, page, object, 0);
        init_object(s, object, SLUB_RED_INACTIVE);
-       rc = 1;
  out:
        slab_unlock(page);
-       local_irq_restore(flags);
-       return rc;
+       /*
+        * Keep node_lock to preserve integrity
+        * until the object is actually freed
+        */
+       return n;
  
  fail:
+       slab_unlock(page);
+       spin_unlock_irqrestore(&n->list_lock, *flags);
        slab_fix(s, "Object at 0x%p not freed", object);
-       goto out;
+       return NULL;
  }
  
  static int __init setup_slub_debug(char *str)
@@@ -1214,8 -1220,9 +1220,9 @@@ static inline void setup_object_debug(s
  static inline int alloc_debug_processing(struct kmem_cache *s,
        struct page *page, void *object, unsigned long addr) { return 0; }
  
- static inline int free_debug_processing(struct kmem_cache *s,
-       struct page *page, void *object, unsigned long addr) { return 0; }
+ static inline struct kmem_cache_node *free_debug_processing(
+       struct kmem_cache *s, struct page *page, void *object,
+       unsigned long addr, unsigned long *flags) { return NULL; }
  
  static inline int slab_pad_check(struct kmem_cache *s, struct page *page)
                        { return 1; }
@@@ -1524,13 -1531,12 +1531,13 @@@ static inline void *acquire_slab(struc
  }
  
  static int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain);
 +static inline bool pfmemalloc_match(struct page *page, gfp_t gfpflags);
  
  /*
   * Try to allocate a partial slab from a specific node.
   */
 -static void *get_partial_node(struct kmem_cache *s,
 -              struct kmem_cache_node *n, struct kmem_cache_cpu *c)
 +static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n,
 +                              struct kmem_cache_cpu *c, gfp_t flags)
  {
        struct page *page, *page2;
        void *object = NULL;
  
        spin_lock(&n->list_lock);
        list_for_each_entry_safe(page, page2, &n->partial, lru) {
 -              void *t = acquire_slab(s, n, page, object == NULL);
 +              void *t;
                int available;
  
 +              if (!pfmemalloc_match(page, flags))
 +                      continue;
 +
 +              t = acquire_slab(s, n, page, object == NULL);
                if (!t)
                        break;
  
@@@ -1619,7 -1621,7 +1626,7 @@@ static void *get_any_partial(struct kme
  
                        if (n && cpuset_zone_allowed_hardwall(zone, flags) &&
                                        n->nr_partial > s->min_partial) {
 -                              object = get_partial_node(s, n, c);
 +                              object = get_partial_node(s, n, c, flags);
                                if (object) {
                                        /*
                                         * Return the object even if
@@@ -1648,7 -1650,7 +1655,7 @@@ static void *get_partial(struct kmem_ca
        void *object;
        int searchnode = (node == NUMA_NO_NODE) ? numa_node_id() : node;
  
 -      object = get_partial_node(s, get_node(s, searchnode), c);
 +      object = get_partial_node(s, get_node(s, searchnode), c, flags);
        if (object || node != NUMA_NO_NODE)
                return object;
  
@@@ -1714,7 -1716,7 +1721,7 @@@ static inline void note_cmpxchg_failure
        stat(s, CMPXCHG_DOUBLE_CPU_FAIL);
  }
  
- void init_kmem_cache_cpus(struct kmem_cache *s)
static void init_kmem_cache_cpus(struct kmem_cache *s)
  {
        int cpu;
  
@@@ -1939,7 -1941,7 +1946,7 @@@ static void unfreeze_partials(struct km
   * If we did not find a slot then simply move all the partials to the
   * per node partial list.
   */
- int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain)
static int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain)
  {
        struct page *oldpage;
        int pages;
                                local_irq_save(flags);
                                unfreeze_partials(s);
                                local_irq_restore(flags);
+                               oldpage = NULL;
                                pobjects = 0;
                                pages = 0;
                                stat(s, CPU_PARTIAL_DRAIN);
@@@ -2310,7 -2313,7 +2318,7 @@@ new_slab
   *
   * Otherwise we can simply pick the next object from the lockless free list.
   */
- static __always_inline void *slab_alloc(struct kmem_cache *s,
+ static __always_inline void *slab_alloc_node(struct kmem_cache *s,
                gfp_t gfpflags, int node, unsigned long addr)
  {
        void **object;
@@@ -2380,9 -2383,15 +2388,15 @@@ redo
        return object;
  }
  
+ static __always_inline void *slab_alloc(struct kmem_cache *s,
+               gfp_t gfpflags, unsigned long addr)
+ {
+       return slab_alloc_node(s, gfpflags, NUMA_NO_NODE, addr);
+ }
  void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags)
  {
-       void *ret = slab_alloc(s, gfpflags, NUMA_NO_NODE, _RET_IP_);
+       void *ret = slab_alloc(s, gfpflags, _RET_IP_);
  
        trace_kmem_cache_alloc(_RET_IP_, ret, s->object_size, s->size, gfpflags);
  
@@@ -2393,7 -2402,7 +2407,7 @@@ EXPORT_SYMBOL(kmem_cache_alloc)
  #ifdef CONFIG_TRACING
  void *kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size)
  {
-       void *ret = slab_alloc(s, gfpflags, NUMA_NO_NODE, _RET_IP_);
+       void *ret = slab_alloc(s, gfpflags, _RET_IP_);
        trace_kmalloc(_RET_IP_, ret, size, s->size, gfpflags);
        return ret;
  }
@@@ -2411,7 -2420,7 +2425,7 @@@ EXPORT_SYMBOL(kmalloc_order_trace)
  #ifdef CONFIG_NUMA
  void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node)
  {
-       void *ret = slab_alloc(s, gfpflags, node, _RET_IP_);
+       void *ret = slab_alloc_node(s, gfpflags, node, _RET_IP_);
  
        trace_kmem_cache_alloc_node(_RET_IP_, ret,
                                    s->object_size, s->size, gfpflags, node);
@@@ -2425,7 -2434,7 +2439,7 @@@ void *kmem_cache_alloc_node_trace(struc
                                    gfp_t gfpflags,
                                    int node, size_t size)
  {
-       void *ret = slab_alloc(s, gfpflags, node, _RET_IP_);
+       void *ret = slab_alloc_node(s, gfpflags, node, _RET_IP_);
  
        trace_kmalloc_node(_RET_IP_, ret,
                           size, s->size, gfpflags, node);
@@@ -2457,7 -2466,8 +2471,8 @@@ static void __slab_free(struct kmem_cac
  
        stat(s, FREE_SLOWPATH);
  
-       if (kmem_cache_debug(s) && !free_debug_processing(s, page, x, addr))
+       if (kmem_cache_debug(s) &&
+               !(n = free_debug_processing(s, page, x, addr, &flags)))
                return;
  
        do {
@@@ -3362,7 -3372,7 +3377,7 @@@ void *__kmalloc(size_t size, gfp_t flag
        if (unlikely(ZERO_OR_NULL_PTR(s)))
                return s;
  
-       ret = slab_alloc(s, flags, NUMA_NO_NODE, _RET_IP_);
+       ret = slab_alloc(s, flags, _RET_IP_);
  
        trace_kmalloc(_RET_IP_, ret, size, s->size, flags);
  
@@@ -3405,7 -3415,7 +3420,7 @@@ void *__kmalloc_node(size_t size, gfp_
        if (unlikely(ZERO_OR_NULL_PTR(s)))
                return s;
  
-       ret = slab_alloc(s, flags, node, _RET_IP_);
+       ret = slab_alloc_node(s, flags, node, _RET_IP_);
  
        trace_kmalloc_node(_RET_IP_, ret, size, s->size, flags, node);
  
@@@ -3482,7 -3492,7 +3497,7 @@@ void kfree(const void *x
        if (unlikely(!PageSlab(page))) {
                BUG_ON(!PageCompound(page));
                kmemleak_free(x);
-               put_page(page);
+               __free_pages(page, compound_order(page));
                return;
        }
        slab_free(page->slab, page, object, _RET_IP_);
@@@ -4033,7 -4043,7 +4048,7 @@@ void *__kmalloc_track_caller(size_t siz
        if (unlikely(ZERO_OR_NULL_PTR(s)))
                return s;
  
-       ret = slab_alloc(s, gfpflags, NUMA_NO_NODE, caller);
+       ret = slab_alloc(s, gfpflags, caller);
  
        /* Honor the call site pointer we received. */
        trace_kmalloc(caller, ret, size, s->size, gfpflags);
@@@ -4063,7 -4073,7 +4078,7 @@@ void *__kmalloc_node_track_caller(size_
        if (unlikely(ZERO_OR_NULL_PTR(s)))
                return s;
  
-       ret = slab_alloc(s, gfpflags, node, caller);
+       ret = slab_alloc_node(s, gfpflags, node, caller);
  
        /* Honor the call site pointer we received. */
        trace_kmalloc_node(caller, ret, size, s->size, gfpflags, node);