|
@@ -1816,22 +1816,13 @@ static void drain_all_stock(struct mem_cgroup *root_memcg)
|
|
|
mutex_unlock(&percpu_charge_mutex);
|
|
|
}
|
|
|
|
|
|
-static int memcg_cpu_hotplug_callback(struct notifier_block *nb,
|
|
|
- unsigned long action,
|
|
|
- void *hcpu)
|
|
|
+static int memcg_hotplug_cpu_dead(unsigned int cpu)
|
|
|
{
|
|
|
- int cpu = (unsigned long)hcpu;
|
|
|
struct memcg_stock_pcp *stock;
|
|
|
|
|
|
- if (action == CPU_ONLINE)
|
|
|
- return NOTIFY_OK;
|
|
|
-
|
|
|
- if (action != CPU_DEAD && action != CPU_DEAD_FROZEN)
|
|
|
- return NOTIFY_OK;
|
|
|
-
|
|
|
stock = &per_cpu(memcg_stock, cpu);
|
|
|
drain_stock(stock);
|
|
|
- return NOTIFY_OK;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void reclaim_high(struct mem_cgroup *memcg,
|
|
@@ -5774,16 +5765,17 @@ __setup("cgroup.memory=", cgroup_memory);
|
|
|
/*
|
|
|
* subsys_initcall() for memory controller.
|
|
|
*
|
|
|
- * Some parts like hotcpu_notifier() have to be initialized from this context
|
|
|
- * because of lock dependencies (cgroup_lock -> cpu hotplug) but basically
|
|
|
- * everything that doesn't depend on a specific mem_cgroup structure should
|
|
|
- * be initialized from here.
|
|
|
+ * Some parts like memcg_hotplug_cpu_dead() have to be initialized from this
|
|
|
+ * context because of lock dependencies (cgroup_lock -> cpu hotplug) but
|
|
|
+ * basically everything that doesn't depend on a specific mem_cgroup structure
|
|
|
+ * should be initialized from here.
|
|
|
*/
|
|
|
static int __init mem_cgroup_init(void)
|
|
|
{
|
|
|
int cpu, node;
|
|
|
|
|
|
- hotcpu_notifier(memcg_cpu_hotplug_callback, 0);
|
|
|
+ cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL,
|
|
|
+ memcg_hotplug_cpu_dead);
|
|
|
|
|
|
for_each_possible_cpu(cpu)
|
|
|
INIT_WORK(&per_cpu_ptr(&memcg_stock, cpu)->work,
|