DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
 EXPORT_SYMBOL(memcg_kmem_enabled_key);
 
+struct workqueue_struct *memcg_kmem_cache_wq;
+
 #endif /* !CONFIG_SLOB */
 
 /**
        struct work_struct work;
 };
 
-static struct workqueue_struct *memcg_kmem_cache_create_wq;
-
 static void memcg_kmem_cache_create_func(struct work_struct *w)
 {
        struct memcg_kmem_cache_create_work *cw =
        cw->cachep = cachep;
        INIT_WORK(&cw->work, memcg_kmem_cache_create_func);
 
-       queue_work(memcg_kmem_cache_create_wq, &cw->work);
+       queue_work(memcg_kmem_cache_wq, &cw->work);
 }
 
 static void memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
 #ifndef CONFIG_SLOB
        /*
         * Kmem cache creation is mostly done with the slab_mutex held,
-        * so use a special workqueue to avoid stalling all worker
-        * threads in case lots of cgroups are created simultaneously.
+        * so use a workqueue with limited concurrency to avoid stalling
+        * all worker threads in case lots of cgroups are created and
+        * destroyed simultaneously.
         */
-       memcg_kmem_cache_create_wq =
-               alloc_ordered_workqueue("memcg_kmem_cache_create", 0);
-       BUG_ON(!memcg_kmem_cache_create_wq);
+       memcg_kmem_cache_wq = alloc_workqueue("memcg_kmem_cache", 0, 1);
+       BUG_ON(!memcg_kmem_cache_wq);
 #endif
 
        cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL,