Skip to content

Commit

Permalink
cpu-hotplug: introduce cpu_notify(), __cpu_notify(), cpu_notify_nofail()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Akinobu Mita authored and Linus Torvalds committed May 27, 2010
1 parent 36e1526 commit e9fb763
Showing 1 changed file with 31 additions and 23 deletions.
54 changes: 31 additions & 23 deletions kernel/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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;
}

Expand Down Expand Up @@ -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",
Expand All @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit e9fb763

Please sign in to comment.