[PATCH] cpu hoptlug: avoid usage of smp_processor_id() in preemptible code
Replace smp_processor_id() with any_online_cpu(cpu_online_map) in order to avoid lots of "BUG: using smp_processor_id() in preemptible [00000001] code:..." messages in case taking a cpu online fails. All the traces start at the last notifier_call_chain(...) in kernel/cpu.c. Since we hold the cpu_control semaphore it shouldn't be any problem to access cpu_online_map. The reason why cpu_up failed is simply that the cpu that was supposed to be taken online wasn't even there. That is because on s390 we never know when a new cpu comes and therefore cpu_possible_map consists of only ones and doesn't reflect reality. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
cc658cfe3c
commit
a4c4af7c8d
4 changed files with 7 additions and 4 deletions
|
@ -4680,7 +4680,8 @@ static int migration_call(struct notifier_block *nfb, unsigned long action,
|
|||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_UP_CANCELED:
|
||||
/* Unbind it from offline cpu so it can run. Fall thru. */
|
||||
kthread_bind(cpu_rq(cpu)->migration_thread,smp_processor_id());
|
||||
kthread_bind(cpu_rq(cpu)->migration_thread,
|
||||
any_online_cpu(cpu_online_map));
|
||||
kthread_stop(cpu_rq(cpu)->migration_thread);
|
||||
cpu_rq(cpu)->migration_thread = NULL;
|
||||
break;
|
||||
|
|
|
@ -470,7 +470,8 @@ static int __devinit cpu_callback(struct notifier_block *nfb,
|
|||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_UP_CANCELED:
|
||||
/* Unbind so it can run. Fall thru. */
|
||||
kthread_bind(per_cpu(ksoftirqd, hotcpu), smp_processor_id());
|
||||
kthread_bind(per_cpu(ksoftirqd, hotcpu),
|
||||
any_online_cpu(cpu_online_map));
|
||||
case CPU_DEAD:
|
||||
p = per_cpu(ksoftirqd, hotcpu);
|
||||
per_cpu(ksoftirqd, hotcpu) = NULL;
|
||||
|
|
|
@ -123,7 +123,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
|||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_UP_CANCELED:
|
||||
/* Unbind so it can run. Fall thru. */
|
||||
kthread_bind(per_cpu(watchdog_task, hotcpu), smp_processor_id());
|
||||
kthread_bind(per_cpu(watchdog_task, hotcpu),
|
||||
any_online_cpu(cpu_online_map));
|
||||
case CPU_DEAD:
|
||||
p = per_cpu(watchdog_task, hotcpu);
|
||||
per_cpu(watchdog_task, hotcpu) = NULL;
|
||||
|
|
|
@ -524,7 +524,7 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
|
|||
list_for_each_entry(wq, &workqueues, list) {
|
||||
/* Unbind so it can run. */
|
||||
kthread_bind(per_cpu_ptr(wq->cpu_wq, hotcpu)->thread,
|
||||
smp_processor_id());
|
||||
any_online_cpu(cpu_online_map));
|
||||
cleanup_workqueue_thread(wq, hotcpu);
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue