summary refs log tree commit diff
path: root/kernel/softlockup.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2006-06-25 05:49:10 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-25 10:01:22 -0700
commitfc75cdfa5b43ac4d3232b490800cd35063adafd3 (patch)
tree0529ffd9633667457d5340a09b3cb352d09436d2 /kernel/softlockup.c
parent04a3446c90137a473837288b04b517b19dc67a0d (diff)
downloadlinux-fc75cdfa5b43ac4d3232b490800cd35063adafd3.tar.gz
[PATCH] cpu hotplug: fix CPU_UP_CANCEL handling
If a cpu hotplug callback fails on CPU_UP_PREPARE, all callbacks will be
called with CPU_UP_CANCELED.  A few of these callbacks assume that on
CPU_UP_PREPARE a pointer to task has been stored in a percpu array.  This
assumption is not true if CPU_UP_PREPARE fails and the following calls to
kthread_bind() in CPU_UP_CANCELED will cause an addressing exception
because of passing a NULL pointer.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Ashok Raj <ashok.raj@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/softlockup.c')
-rw-r--r--kernel/softlockup.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/softlockup.c b/kernel/softlockup.c
index 2c1be1163edc..b5c3b94e01ce 100644
--- a/kernel/softlockup.c
+++ b/kernel/softlockup.c
@@ -127,6 +127,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
 		break;
 #ifdef CONFIG_HOTPLUG_CPU
 	case CPU_UP_CANCELED:
+		if (!per_cpu(watchdog_task, hotcpu))
+			break;
 		/* Unbind so it can run.  Fall thru. */
 		kthread_bind(per_cpu(watchdog_task, hotcpu),
 			     any_online_cpu(cpu_online_map));