On Tue, Aug 27, 2024 at 05:59:41PM GMT, Christian Brauner wrote: > When a kmem cache is created with SLAB_TYPESAFE_BY_RCU the free pointer > must be located outside of the object because we don't know what part of > the memory can safely be overwritten as it may be needed to prevent > object recycling. > > That has the consequence that SLAB_TYPESAFE_BY_RCU may end up adding a > new cacheline. This is the case for .e.g, struct file. After having it > shrunk down by 40 bytes and having it fit in three cachelines we still > have SLAB_TYPESAFE_BY_RCU adding a fourth cacheline because it needs to > accomodate the free pointer and is hardware cacheline aligned. > > I tried to find ways to rectify this as struct file is pretty much > everywhere and having it use less memory is a good thing. So here's a > proposal. > > I was hoping to get something to this effect into v6.12. > > If we really want to switch to a struct to pass kmem_cache parameters I > can do the preparatory patch to convert all kmem_cache_create() and > kmem_cache_create_usercopy() callers to use a struct for initialization > of course. I can do this as a preparatory work or as follow-up work to > this series. Thoughts? So one thing I can do is to add: struct kmem_cache_args { .freeptr_offset, .useroffset, .flags, .name, }; accompanied by: int kmem_create_cache(struct kmem_cache_args *args); and then switch both the filp cache and Jens' io_kiocb cache over to use these two helpers. Then we can convert other callers one by one. @Vlastimil, @Jens, @Linus what do you think?