|
@@ -2154,6 +2154,8 @@ struct memcg_kmem_cache_create_work {
|
|
|
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 =
|
|
@@ -2185,7 +2187,7 @@ static void __memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
|
|
|
cw->cachep = cachep;
|
|
|
INIT_WORK(&cw->work, memcg_kmem_cache_create_func);
|
|
|
|
|
|
- schedule_work(&cw->work);
|
|
|
+ queue_work(memcg_kmem_cache_create_wq, &cw->work);
|
|
|
}
|
|
|
|
|
|
static void memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
|
|
@@ -5783,6 +5785,17 @@ static int __init mem_cgroup_init(void)
|
|
|
{
|
|
|
int cpu, node;
|
|
|
|
|
|
+#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.
|
|
|
+ */
|
|
|
+ memcg_kmem_cache_create_wq =
|
|
|
+ alloc_ordered_workqueue("memcg_kmem_cache_create", 0);
|
|
|
+ BUG_ON(!memcg_kmem_cache_create_wq);
|
|
|
+#endif
|
|
|
+
|
|
|
hotcpu_notifier(memcg_cpu_hotplug_callback, 0);
|
|
|
|
|
|
for_each_possible_cpu(cpu)
|