diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2010-05-26 17:43:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-27 12:12:47 -0400 |
commit | e6bde73b07edeb703d4c89c1daabc09c303de11f (patch) | |
tree | 9b60a3fc2ce002b26e46611357cb5529795e7ac5 /kernel/cpu.c | |
parent | e9fb7631ebcdc9467cbb736337546a42f7b7f28e (diff) |
cpu-hotplug: return better errno on cpu hotplug failure
Currently, onlining or offlining a CPU failure by one of the cpu notifiers
error always cause -EINVAL error. (i.e. writing 0 or 1 to
/sys/devices/system/cpu/cpuX/online gets EINVAL)
To get better error reporting rather than always getting -EINVAL, This
changes cpu_notify() to return -errno value with notifier_to_errno() and
fix the callers. Now that cpu notifiers can return encapsulate errno
value.
Currently, all cpu hotplug notifiers return NOTIFY_OK, NOTIFY_BAD, or
NOTIFY_DONE. So cpu_notify() can returns 0 or -EPERM with this change for
now.
(notifier_to_errno(NOTIFY_OK) == 0, notifier_to_errno(NOTIFY_DONE) == 0,
notifier_to_errno(NOTIFY_BAD) == -EPERM)
Forthcoming patches convert several cpu notifiers to return encapsulate
errno value with notifier_from_errno().
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>
Diffstat (limited to 'kernel/cpu.c')
-rw-r--r-- | kernel/cpu.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index 09207c772c25..0690ac27a253 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -137,8 +137,12 @@ int __ref register_cpu_notifier(struct notifier_block *nb) | |||
137 | static int __cpu_notify(unsigned long val, void *v, int nr_to_call, | 137 | static int __cpu_notify(unsigned long val, void *v, int nr_to_call, |
138 | int *nr_calls) | 138 | int *nr_calls) |
139 | { | 139 | { |
140 | return __raw_notifier_call_chain(&cpu_chain, val, v, nr_to_call, | 140 | int ret; |
141 | |||
142 | ret = __raw_notifier_call_chain(&cpu_chain, val, v, nr_to_call, | ||
141 | nr_calls); | 143 | nr_calls); |
144 | |||
145 | return notifier_to_errno(ret); | ||
142 | } | 146 | } |
143 | 147 | ||
144 | static int cpu_notify(unsigned long val, void *v) | 148 | static int cpu_notify(unsigned long val, void *v) |
@@ -151,7 +155,7 @@ static void cpu_notify_nofail(unsigned long val, void *v) | |||
151 | int err; | 155 | int err; |
152 | 156 | ||
153 | err = cpu_notify(val, v); | 157 | err = cpu_notify(val, v); |
154 | BUG_ON(err == NOTIFY_BAD); | 158 | BUG_ON(err); |
155 | } | 159 | } |
156 | 160 | ||
157 | #ifdef CONFIG_HOTPLUG_CPU | 161 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -232,14 +236,13 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) | |||
232 | cpu_hotplug_begin(); | 236 | cpu_hotplug_begin(); |
233 | set_cpu_active(cpu, false); | 237 | set_cpu_active(cpu, false); |
234 | err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls); | 238 | err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls); |
235 | if (err == NOTIFY_BAD) { | 239 | if (err) { |
236 | set_cpu_active(cpu, true); | 240 | set_cpu_active(cpu, true); |
237 | 241 | ||
238 | nr_calls--; | 242 | nr_calls--; |
239 | __cpu_notify(CPU_DOWN_FAILED | mod, hcpu, nr_calls, NULL); | 243 | __cpu_notify(CPU_DOWN_FAILED | mod, hcpu, nr_calls, NULL); |
240 | printk("%s: attempt to take down CPU %u failed\n", | 244 | printk("%s: attempt to take down CPU %u failed\n", |
241 | __func__, cpu); | 245 | __func__, cpu); |
242 | err = -EINVAL; | ||
243 | goto out_release; | 246 | goto out_release; |
244 | } | 247 | } |
245 | 248 | ||
@@ -304,11 +307,10 @@ static int __cpuinit _cpu_up(unsigned int cpu, int tasks_frozen) | |||
304 | 307 | ||
305 | cpu_hotplug_begin(); | 308 | cpu_hotplug_begin(); |
306 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); | 309 | ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls); |
307 | if (ret == NOTIFY_BAD) { | 310 | if (ret) { |
308 | nr_calls--; | 311 | nr_calls--; |
309 | printk("%s: attempt to bring up CPU %u failed\n", | 312 | printk("%s: attempt to bring up CPU %u failed\n", |
310 | __func__, cpu); | 313 | __func__, cpu); |
311 | ret = -EINVAL; | ||
312 | goto out_notify; | 314 | goto out_notify; |
313 | } | 315 | } |
314 | 316 | ||