• Linus Torvalds's avatar
    Merge tag 'slab-for-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab · bdf56c75
    Linus Torvalds authored
    Pull slab updates from Vlastimil Babka:
     "This time it's mostly refactoring and improving APIs for slab users in
      the kernel, along with some debugging improvements.
    
       - kmem_cache_create() refactoring (Christian Brauner)
    
         Over the years have been growing new parameters to
         kmem_cache_create() where most of them are needed only for a small
         number of caches - most recently the rcu_freeptr_offset parameter.
    
         To avoid adding new parameters to kmem_cache_create() and adjusting
         all its callers, or creating new wrappers such as
         kmem_cache_create_rcu(), we can now pass extra parameters using the
         new struct kmem_cache_args. Not explicitly initialized fields
         default to values interpreted as unused.
    
         kmem_cache_create() is for now a wrapper that works both with the
         new form: kmem_cache_create(name, object_size, args, flags) and the
         legacy form: kmem_cache_create(name, object_size, align, flags,
         ctor)
    
       - kmem_cache_destroy() waits for kfree_rcu()'s in flight (Vlastimil
         Babka, Uladislau Rezki)
    
         Since SLOB removal, kfree() is allowed for freeing objects
         allocated by kmem_cache_create(). By extension kfree_rcu() as
         allowed as well, which can allow converting simple call_rcu()
         callbacks that only do kmem_cache_free(), as there was never a
         kmem_cache_free_rcu() variant. However, for caches that can be
         destroyed e.g. on module removal, the cache owners knew to issue
         rcu_barrier() first to wait for the pending call_rcu()'s, and this
         is not sufficient for pending kfree_rcu()'s due to its internal
         batching optimizations. Ulad has provided a new
         kvfree_rcu_barrier() and to make the usage less error-prone,
         kmem_cache_destroy() calls it. Additionally, destroying
         SLAB_TYPESAFE_BY_RCU caches now again issues rcu_barrier()
         synchronously instead of using an async work, because the past
         motivation for async work no longer applies. Users of custom
         call_rcu() callbacks should however keep calling rcu_barrier()
         before cache destruction.
    
       - Debugging use-after-free in SLAB_TYPESAFE_BY_RCU caches (Jann Horn)
    
         Currently, KASAN cannot catch UAFs in such caches as it is legal to
         access them within a grace period, and we only track the grace
         period when trying to free the underlying slab page. The new
         CONFIG_SLUB_RCU_DEBUG option changes the freeing of individual
         object to be RCU-delayed, after which KASAN can poison them.
    
       - Delayed memcg charging (Shakeel Butt)
    
         In some cases, the memcg is uknown at allocation time, such as
         receiving network packets in softirq context. With
         kmem_cache_charge() these may be now charged later when the user
         and its memcg is known.
    
       - Misc fixes and improvements (Pedro Falcato, Axel Rasmussen,
         Christoph Lameter, Yan Zhen, Peng Fan, Xavier)"
    
    * tag 'slab-for-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab: (34 commits)
      mm, slab: restore kerneldoc for kmem_cache_create()
      io_uring: port to struct kmem_cache_args
      slab: make __kmem_cache_create() static inline
      slab: make kmem_cache_create_usercopy() static inline
      slab: remove kmem_cache_create_rcu()
      file: port to struct kmem_cache_args
      slab: create kmem_cache_create() compatibility layer
      slab: port KMEM_CACHE_USERCOPY() to struct kmem_cache_args
      slab: port KMEM_CACHE() to struct kmem_cache_args
      slab: remove rcu_freeptr_offset from struct kmem_cache
      slab: pass struct kmem_cache_args to do_kmem_cache_create()
      slab: pull kmem_cache_open() into do_kmem_cache_create()
      slab: pass struct kmem_cache_args to create_cache()
      slab: port kmem_cache_create_usercopy() to struct kmem_cache_args
      slab: port kmem_cache_create_rcu() to struct kmem_cache_args
      slab: port kmem_cache_create() to struct kmem_cache_args
      slab: add struct kmem_cache_args
      slab: s/__kmem_cache_create/do_kmem_cache_create/g
      memcg: add charging of already allocated slab objects
      mm/slab: Optimize the code logic in find_mergeable()
      ...
    bdf56c75
slub.c 187 KB