|
@@ -317,6 +317,8 @@ void memcg_put_cache_ids(void)
|
|
DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
|
|
DEFINE_STATIC_KEY_FALSE(memcg_kmem_enabled_key);
|
|
EXPORT_SYMBOL(memcg_kmem_enabled_key);
|
|
EXPORT_SYMBOL(memcg_kmem_enabled_key);
|
|
|
|
|
|
|
|
+struct workqueue_struct *memcg_kmem_cache_wq;
|
|
|
|
+
|
|
#endif /* !CONFIG_SLOB */
|
|
#endif /* !CONFIG_SLOB */
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -2143,8 +2145,6 @@ struct memcg_kmem_cache_create_work {
|
|
struct work_struct 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)
|
|
static void memcg_kmem_cache_create_func(struct work_struct *w)
|
|
{
|
|
{
|
|
struct memcg_kmem_cache_create_work *cw =
|
|
struct memcg_kmem_cache_create_work *cw =
|
|
@@ -2176,7 +2176,7 @@ static void __memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
|
|
cw->cachep = cachep;
|
|
cw->cachep = cachep;
|
|
INIT_WORK(&cw->work, memcg_kmem_cache_create_func);
|
|
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,
|
|
static void memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
|
|
@@ -5778,12 +5778,12 @@ static int __init mem_cgroup_init(void)
|
|
#ifndef CONFIG_SLOB
|
|
#ifndef CONFIG_SLOB
|
|
/*
|
|
/*
|
|
* Kmem cache creation is mostly done with the slab_mutex held,
|
|
* 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
|
|
#endif
|
|
|
|
|
|
cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL,
|
|
cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL,
|