|
@@ -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 */
|