mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	cpu-hotplug: introduce cpu_notify(), __cpu_notify(), cpu_notify_nofail()
No functional change. These are just wrappers of raw_cpu_notifier_call_chain. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									36e15263aa
								
							
						
					
					
						commit
						e9fb7631eb
					
				
					 1 changed files with 31 additions and 23 deletions
				
			
		
							
								
								
									
										54
									
								
								kernel/cpu.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								kernel/cpu.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -134,6 +134,26 @@ int __ref register_cpu_notifier(struct notifier_block *nb)
 | 
			
		|||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __cpu_notify(unsigned long val, void *v, int nr_to_call,
 | 
			
		||||
			int *nr_calls)
 | 
			
		||||
{
 | 
			
		||||
	return __raw_notifier_call_chain(&cpu_chain, val, v, nr_to_call,
 | 
			
		||||
					nr_calls);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int cpu_notify(unsigned long val, void *v)
 | 
			
		||||
{
 | 
			
		||||
	return __cpu_notify(val, v, -1, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cpu_notify_nofail(unsigned long val, void *v)
 | 
			
		||||
{
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	err = cpu_notify(val, v);
 | 
			
		||||
	BUG_ON(err == NOTIFY_BAD);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HOTPLUG_CPU
 | 
			
		||||
 | 
			
		||||
EXPORT_SYMBOL(register_cpu_notifier);
 | 
			
		||||
| 
						 | 
				
			
			@ -181,8 +201,7 @@ static int __ref take_cpu_down(void *_param)
 | 
			
		|||
	if (err < 0)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	raw_notifier_call_chain(&cpu_chain, CPU_DYING | param->mod,
 | 
			
		||||
				param->hcpu);
 | 
			
		||||
	cpu_notify(CPU_DYING | param->mod, param->hcpu);
 | 
			
		||||
 | 
			
		||||
	if (task_cpu(param->caller) == cpu)
 | 
			
		||||
		move_task_off_dead_cpu(cpu, param->caller);
 | 
			
		||||
| 
						 | 
				
			
			@ -212,14 +231,12 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 | 
			
		|||
 | 
			
		||||
	cpu_hotplug_begin();
 | 
			
		||||
	set_cpu_active(cpu, false);
 | 
			
		||||
	err = __raw_notifier_call_chain(&cpu_chain, CPU_DOWN_PREPARE | mod,
 | 
			
		||||
					hcpu, -1, &nr_calls);
 | 
			
		||||
	err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls);
 | 
			
		||||
	if (err == NOTIFY_BAD) {
 | 
			
		||||
		set_cpu_active(cpu, true);
 | 
			
		||||
 | 
			
		||||
		nr_calls--;
 | 
			
		||||
		__raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED | mod,
 | 
			
		||||
					  hcpu, nr_calls, NULL);
 | 
			
		||||
		__cpu_notify(CPU_DOWN_FAILED | mod, hcpu, nr_calls, NULL);
 | 
			
		||||
		printk("%s: attempt to take down CPU %u failed\n",
 | 
			
		||||
				__func__, cpu);
 | 
			
		||||
		err = -EINVAL;
 | 
			
		||||
| 
						 | 
				
			
			@ -230,9 +247,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 | 
			
		|||
	if (err) {
 | 
			
		||||
		set_cpu_active(cpu, true);
 | 
			
		||||
		/* CPU didn't die: tell everyone.  Can't complain. */
 | 
			
		||||
		if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED | mod,
 | 
			
		||||
					    hcpu) == NOTIFY_BAD)
 | 
			
		||||
			BUG();
 | 
			
		||||
		cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu);
 | 
			
		||||
 | 
			
		||||
		goto out_release;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -246,19 +261,14 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 | 
			
		|||
	__cpu_die(cpu);
 | 
			
		||||
 | 
			
		||||
	/* CPU is completely dead: tell everyone.  Too late to complain. */
 | 
			
		||||
	if (raw_notifier_call_chain(&cpu_chain, CPU_DEAD | mod,
 | 
			
		||||
				    hcpu) == NOTIFY_BAD)
 | 
			
		||||
		BUG();
 | 
			
		||||
	cpu_notify_nofail(CPU_DEAD | mod, hcpu);
 | 
			
		||||
 | 
			
		||||
	check_for_tasks(cpu);
 | 
			
		||||
 | 
			
		||||
out_release:
 | 
			
		||||
	cpu_hotplug_done();
 | 
			
		||||
	if (!err) {
 | 
			
		||||
		if (raw_notifier_call_chain(&cpu_chain, CPU_POST_DEAD | mod,
 | 
			
		||||
					    hcpu) == NOTIFY_BAD)
 | 
			
		||||
			BUG();
 | 
			
		||||
	}
 | 
			
		||||
	if (!err)
 | 
			
		||||
		cpu_notify_nofail(CPU_POST_DEAD | mod, hcpu);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -293,8 +303,7 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen)
 | 
			
		|||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	cpu_hotplug_begin();
 | 
			
		||||
	ret = __raw_notifier_call_chain(&cpu_chain, CPU_UP_PREPARE | mod, hcpu,
 | 
			
		||||
							-1, &nr_calls);
 | 
			
		||||
	ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls);
 | 
			
		||||
	if (ret == NOTIFY_BAD) {
 | 
			
		||||
		nr_calls--;
 | 
			
		||||
		printk("%s: attempt to bring up CPU %u failed\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -312,12 +321,11 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen)
 | 
			
		|||
	set_cpu_active(cpu, true);
 | 
			
		||||
 | 
			
		||||
	/* Now call notifier in preparation. */
 | 
			
		||||
	raw_notifier_call_chain(&cpu_chain, CPU_ONLINE | mod, hcpu);
 | 
			
		||||
	cpu_notify(CPU_ONLINE | mod, hcpu);
 | 
			
		||||
 | 
			
		||||
out_notify:
 | 
			
		||||
	if (ret != 0)
 | 
			
		||||
		__raw_notifier_call_chain(&cpu_chain,
 | 
			
		||||
				CPU_UP_CANCELED | mod, hcpu, nr_calls, NULL);
 | 
			
		||||
		__cpu_notify(CPU_UP_CANCELED | mod, hcpu, nr_calls, NULL);
 | 
			
		||||
	cpu_hotplug_done();
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +489,7 @@ void __cpuinit notify_cpu_starting(unsigned int cpu)
 | 
			
		|||
	if (frozen_cpus != NULL && cpumask_test_cpu(cpu, frozen_cpus))
 | 
			
		||||
		val = CPU_STARTING_FROZEN;
 | 
			
		||||
#endif /* CONFIG_PM_SLEEP_SMP */
 | 
			
		||||
	raw_notifier_call_chain(&cpu_chain, val, (void *)(long)cpu);
 | 
			
		||||
	cpu_notify(val, (void *)(long)cpu);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SMP */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue