lib/percpu_counter: Convert to hotplug state machine
Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20161103145021.28528-5-bigeasy@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									308167fcb3
								
							
						
					
					
						commit
						5588f5afb4
					
				| @ -33,6 +33,7 @@ enum cpuhp_state { | ||||
| 	CPUHP_FS_BUFF_DEAD, | ||||
| 	CPUHP_PRINTK_DEAD, | ||||
| 	CPUHP_MM_MEMCQ_DEAD, | ||||
| 	CPUHP_PERCPU_CNT_DEAD, | ||||
| 	CPUHP_WORKQUEUE_PREP, | ||||
| 	CPUHP_POWER_NUMA_PREPARE, | ||||
| 	CPUHP_HRTIMERS_PREPARE, | ||||
|  | ||||
| @ -158,25 +158,21 @@ EXPORT_SYMBOL(percpu_counter_destroy); | ||||
| int percpu_counter_batch __read_mostly = 32; | ||||
| EXPORT_SYMBOL(percpu_counter_batch); | ||||
| 
 | ||||
| static void compute_batch_value(void) | ||||
| static int compute_batch_value(unsigned int cpu) | ||||
| { | ||||
| 	int nr = num_online_cpus(); | ||||
| 
 | ||||
| 	percpu_counter_batch = max(32, nr*2); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int percpu_counter_hotcpu_callback(struct notifier_block *nb, | ||||
| 					unsigned long action, void *hcpu) | ||||
| static int percpu_counter_cpu_dead(unsigned int cpu) | ||||
| { | ||||
| #ifdef CONFIG_HOTPLUG_CPU | ||||
| 	unsigned int cpu; | ||||
| 	struct percpu_counter *fbc; | ||||
| 
 | ||||
| 	compute_batch_value(); | ||||
| 	if (action != CPU_DEAD && action != CPU_DEAD_FROZEN) | ||||
| 		return NOTIFY_OK; | ||||
| 	compute_batch_value(cpu); | ||||
| 
 | ||||
| 	cpu = (unsigned long)hcpu; | ||||
| 	spin_lock_irq(&percpu_counters_lock); | ||||
| 	list_for_each_entry(fbc, &percpu_counters, list) { | ||||
| 		s32 *pcount; | ||||
| @ -190,7 +186,7 @@ static int percpu_counter_hotcpu_callback(struct notifier_block *nb, | ||||
| 	} | ||||
| 	spin_unlock_irq(&percpu_counters_lock); | ||||
| #endif | ||||
| 	return NOTIFY_OK; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -222,8 +218,15 @@ EXPORT_SYMBOL(__percpu_counter_compare); | ||||
| 
 | ||||
| static int __init percpu_counter_startup(void) | ||||
| { | ||||
| 	compute_batch_value(); | ||||
| 	hotcpu_notifier(percpu_counter_hotcpu_callback, 0); | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "lib/percpu_cnt:online", | ||||
| 				compute_batch_value, NULL); | ||||
| 	WARN_ON(ret < 0); | ||||
| 	ret = cpuhp_setup_state_nocalls(CPUHP_PERCPU_CNT_DEAD, | ||||
| 					"lib/percpu_cnt:dead", NULL, | ||||
| 					percpu_counter_cpu_dead); | ||||
| 	WARN_ON(ret < 0); | ||||
| 	return 0; | ||||
| } | ||||
| module_init(percpu_counter_startup); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user