summaryrefslogtreecommitdiffstats
path: root/kernel/smp.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-09-10 11:32:52 +0200
committerIngo Molnar <mingo@elte.hu>2008-09-10 11:32:52 +0200
commite92b4fdacc6a7d8cc7895b81347671d5fcd6c5e1 (patch)
tree4f84567261682d8ec2ad4102bce1ff970a6eed1a /kernel/smp.c
parent9fcaff0e660d886e9a766460adbe558dd25de31b (diff)
parentadee14b2e1557d0a8559f29681732d05a89dfc35 (diff)
downloadop-kernel-dev-e92b4fdacc6a7d8cc7895b81347671d5fcd6c5e1.zip
op-kernel-dev-e92b4fdacc6a7d8cc7895b81347671d5fcd6c5e1.tar.gz
Merge commit 'v2.6.27-rc6' into x86/iommu
Diffstat (limited to 'kernel/smp.c')
-rw-r--r--kernel/smp.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/smp.c b/kernel/smp.c
index 782e2b9..f362a85 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -210,8 +210,10 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
{
struct call_single_data d;
unsigned long flags;
- /* prevent preemption and reschedule on another processor */
+ /* prevent preemption and reschedule on another processor,
+ as well as CPU removal */
int me = get_cpu();
+ int err = 0;
/* Can deadlock when called with interrupts disabled */
WARN_ON(irqs_disabled());
@@ -220,7 +222,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
local_irq_save(flags);
func(info);
local_irq_restore(flags);
- } else {
+ } else if ((unsigned)cpu < NR_CPUS && cpu_online(cpu)) {
struct call_single_data *data = NULL;
if (!wait) {
@@ -236,10 +238,12 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
data->func = func;
data->info = info;
generic_exec_single(cpu, data);
+ } else {
+ err = -ENXIO; /* CPU not online */
}
put_cpu();
- return 0;
+ return err;
}
EXPORT_SYMBOL(smp_call_function_single);
OpenPOWER on IntegriCloud