On Mon, Jun 22, 2020 at 10:29:29AM -0700, Shakeel Butt wrote: > On Mon, Jun 8, 2020 at 4:07 PM Roman Gushchin <guro@xxxxxx> wrote: > > > > Because the number of non-root kmem_caches doesn't depend on the > > number of memory cgroups anymore and is generally not very big, > > there is no more need for a dedicated workqueue. > > > > Also, as there is no more need to pass any arguments to the > > memcg_create_kmem_cache() except the root kmem_cache, it's > > possible to just embed the work structure into the kmem_cache > > and avoid the dynamic allocation of the work structure. > > > > This will also simplify the synchronization: for each root kmem_cache > > there is only one work. So there will be no more concurrent attempts > > to create a non-root kmem_cache for a root kmem_cache: the second and > > all following attempts to queue the work will fail. > > > > > > On the kmem_cache destruction path there is no more need to call the > > expensive flush_workqueue() and wait for all pending works to be > > finished. Instead, cancel_work_sync() can be used to cancel/wait for > > only one work. > > > > Signed-off-by: Roman Gushchin <guro@xxxxxx> > > Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx> > > Why not pre-allocate the non-root kmem_cache at the kmem_cache > creation time? No need for work_struct, queue_work() or > cancel_work_sync() at all. Simple because some kmem_caches are created very early, so we don't even know at that time if we will need memcg slab caches. But this code is likely going away if we're going with a single set for all allocations. Thanks!