aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2011-05-09 12:20:24 +0100
committerKeir Fraser <keir@xen.org>2011-05-09 12:20:24 +0100
commit4eca0a7e0f428427650becb6ac3783d62d187d60 (patch)
tree194b19639ad16c4155534fc89f5f20f7a213f561
parentebadc5f13970d5f82c54bbbf247486016974dd10 (diff)
downloadxen-4eca0a7e0f428427650becb6ac3783d62d187d60.tar.gz
xen-4eca0a7e0f428427650becb6ac3783d62d187d60.tar.bz2
xen-4eca0a7e0f428427650becb6ac3783d62d187d60.zip
x86: Clean up smp_call_function handling.
We don't need so many communication fields between caller and handler. Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 23285:a7ac0a0170b0 xen-unstable date: Sun May 01 09:32:48 2011 +0100
-rw-r--r--xen/arch/x86/smp.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
index a0f7d8e947..61b93a8b26 100644
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -269,8 +269,6 @@ static struct call_data_struct {
void (*func) (void *info);
void *info;
int wait;
- atomic_t started;
- atomic_t finished;
cpumask_t selected;
} call_data;
@@ -305,8 +303,6 @@ int on_selected_cpus(
call_data.func = func;
call_data.info = info;
call_data.wait = wait;
- atomic_set(&call_data.started, 0);
- atomic_set(&call_data.finished, 0);
send_IPI_mask(&call_data.selected, CALL_FUNCTION_VECTOR);
@@ -317,8 +313,7 @@ int on_selected_cpus(
local_irq_enable();
}
- while ( atomic_read(wait ? &call_data.finished : &call_data.started)
- != nr_cpus )
+ while ( !cpus_empty(call_data.selected) )
cpu_relax();
out:
@@ -387,8 +382,9 @@ static void __smp_call_function_interrupt(void)
{
void (*func)(void *info) = call_data.func;
void *info = call_data.info;
+ unsigned int cpu = smp_processor_id();
- if ( !cpu_isset(smp_processor_id(), call_data.selected) )
+ if ( !cpu_isset(cpu, call_data.selected) )
return;
irq_enter();
@@ -397,12 +393,12 @@ static void __smp_call_function_interrupt(void)
{
(*func)(info);
mb();
- atomic_inc(&call_data.finished);
+ cpu_clear(cpu, call_data.selected);
}
else
{
mb();
- atomic_inc(&call_data.started);
+ cpu_clear(cpu, call_data.selected);
(*func)(info);
}