Merge branch 'slub-tiny-v1r6' into slab/for-next
authorVlastimil Babka <vbabka@suse.cz>
Wed, 23 Nov 2022 14:41:16 +0000 (15:41 +0100)
committerVlastimil Babka <vbabka@suse.cz>
Wed, 30 Nov 2022 23:14:00 +0000 (00:14 +0100)
Merge my series [1] to deprecate the SLOB allocator.
- Renames CONFIG_SLOB to CONFIG_SLOB_DEPRECATED with deprecation notice.
- The recommended replacement is CONFIG_SLUB, optionally with the new
  CONFIG_SLUB_TINY tweaks for systems with 16MB or less RAM.
- Use cases that stopped working with CONFIG_SLUB_TINY instead of SLOB
  should be reported to linux-mm@kvack.org and slab maintainers,
  otherwise SLOB will be removed in few cycles.

[1] https://lore.kernel.org/all/20221121171202.22080-1-vbabka@suse.cz/

1  2 
include/linux/slab.h
mm/slab.h
mm/slab_common.c
mm/slub.c

Simple merge
diff --cc mm/slab.h
Simple merge
Simple merge
diff --cc mm/slub.c
+++ b/mm/slub.c
@@@ -3882,18 -3932,71 +3967,71 @@@ static inline int __kmem_cache_alloc_bu
        local_unlock_irq(&s->cpu_slab->lock);
        slub_put_cpu_ptr(s->cpu_slab);
  
-       /*
-        * memcg and kmem_cache debug support and memory initialization.
-        * Done outside of the IRQ disabled fastpath loop.
-        */
-       slab_post_alloc_hook(s, objcg, flags, size, p,
-                       slab_want_init_on_alloc(flags, s), s->object_size);
        return i;
  error:
        slub_put_cpu_ptr(s->cpu_slab);
 -      slab_post_alloc_hook(s, objcg, flags, i, p, false);
 +      slab_post_alloc_hook(s, objcg, flags, i, p, false, s->object_size);
        kmem_cache_free_bulk(s, i, p);
        return 0;
 -      slab_post_alloc_hook(s, objcg, flags, i, p, false);
+ }
+ #else /* CONFIG_SLUB_TINY */
+ static int __kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags,
+                       size_t size, void **p, struct obj_cgroup *objcg)
+ {
+       int i;
+       for (i = 0; i < size; i++) {
+               void *object = kfence_alloc(s, s->object_size, flags);
+               if (unlikely(object)) {
+                       p[i] = object;
+                       continue;
+               }
+               p[i] = __slab_alloc_node(s, flags, NUMA_NO_NODE,
+                                        _RET_IP_, s->object_size);
+               if (unlikely(!p[i]))
+                       goto error;
+               maybe_wipe_obj_freeptr(s, p[i]);
+       }
+       return i;
+ error:
 -                              slab_want_init_on_alloc(flags, s));
++      slab_post_alloc_hook(s, objcg, flags, i, p, false, s->object_size);
+       kmem_cache_free_bulk(s, i, p);
+       return 0;
+ }
+ #endif /* CONFIG_SLUB_TINY */
+ /* Note that interrupts must be enabled when calling this function. */
+ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size,
+                         void **p)
+ {
+       int i;
+       struct obj_cgroup *objcg = NULL;
+       if (!size)
+               return 0;
+       /* memcg and kmem_cache debug support */
+       s = slab_pre_alloc_hook(s, NULL, &objcg, size, flags);
+       if (unlikely(!s))
+               return 0;
+       i = __kmem_cache_alloc_bulk(s, flags, size, p, objcg);
+       /*
+        * memcg and kmem_cache debug support and memory initialization.
+        * Done outside of the IRQ disabled fastpath loop.
+        */
+       if (i != 0)
+               slab_post_alloc_hook(s, objcg, flags, size, p,
++                      slab_want_init_on_alloc(flags, s), s->object_size);
+       return i;
  }
  EXPORT_SYMBOL(kmem_cache_alloc_bulk);
  
@@@ -6100,8 -6208,9 +6254,8 @@@ static int __init slab_sysfs_init(void
        mutex_unlock(&slab_mutex);
        return 0;
  }
 -
 -__initcall(slab_sysfs_init);
 +late_initcall(slab_sysfs_init);
- #endif /* CONFIG_SYSFS */
+ #endif /* SLAB_SUPPORTS_SYSFS */
  
  #if defined(CONFIG_SLUB_DEBUG) && defined(CONFIG_DEBUG_FS)
  static int slab_debugfs_show(struct seq_file *seq, void *v)