mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	mm/memcg: Convert to hotplug state machine
Install the callbacks via the state machine. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Michal Hocko <mhocko@kernel.org> Cc: linux-mm@kvack.org Cc: rt@linutronix.de Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: cgroups@vger.kernel.org Link: http://lkml.kernel.org/r/20161103145021.28528-4-bigeasy@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									90b14889d2
								
							
						
					
					
						commit
						308167fcb3
					
				
					 2 changed files with 9 additions and 16 deletions
				
			
		|  | @ -32,6 +32,7 @@ enum cpuhp_state { | |||
| 	CPUHP_BLK_MQ_DEAD, | ||||
| 	CPUHP_FS_BUFF_DEAD, | ||||
| 	CPUHP_PRINTK_DEAD, | ||||
| 	CPUHP_MM_MEMCQ_DEAD, | ||||
| 	CPUHP_WORKQUEUE_PREP, | ||||
| 	CPUHP_POWER_NUMA_PREPARE, | ||||
| 	CPUHP_HRTIMERS_PREPARE, | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Sebastian Andrzej Siewior
						Sebastian Andrzej Siewior