diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2009-10-05 10:07:36 -0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-10-06 11:55:57 +0200 |
commit | 041b3c8f2547d8db24a3657b9209c02c0869f1a9 (patch) | |
tree | 268305641975e564735184fa67f39f1bc038f23f /kvm | |
parent | Re-enable -Werror for kvm (diff) | |
download | qemu-kvm-041b3c8f2547d8db24a3657b9209c02c0869f1a9.tar.gz qemu-kvm-041b3c8f2547d8db24a3657b9209c02c0869f1a9.tar.bz2 qemu-kvm-041b3c8f2547d8db24a3657b9209c02c0869f1a9.zip |
test: add on_cpu_async
Non-wait version of on_cpu.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'kvm')
-rw-r--r-- | kvm/user/test/lib/x86/smp.c | 22 | ||||
-rw-r--r-- | kvm/user/test/lib/x86/smp.h | 1 |
2 files changed, 19 insertions, 4 deletions
diff --git a/kvm/user/test/lib/x86/smp.c b/kvm/user/test/lib/x86/smp.c index 9eface511..241f7551e 100644 --- a/kvm/user/test/lib/x86/smp.c +++ b/kvm/user/test/lib/x86/smp.c @@ -82,24 +82,38 @@ static void setup_smp_id(void *data) asm ("mov %0, %%gs:0" : : "r"(apic_id()) : "memory"); } -void on_cpu(int cpu, void (*function)(void *data), void *data) +static void __on_cpu(int cpu, void (*function)(void *data), void *data, + int wait) { spin_lock(&ipi_lock); if (cpu == smp_id()) function(data); else { + ipi_done = 0; ipi_function = function; ipi_data = data; apic_icr_write(APIC_INT_ASSERT | APIC_DEST_PHYSICAL | APIC_DM_FIXED | IPI_VECTOR, cpu); - while (!ipi_done) - ; - ipi_done = 0; + if (wait) { + while (!ipi_done) + ; + } } spin_unlock(&ipi_lock); } +void on_cpu(int cpu, void (*function)(void *data), void *data) +{ + __on_cpu(cpu, function, data, 1); +} + +void on_cpu_async(int cpu, void (*function)(void *data), void *data) +{ + __on_cpu(cpu, function, data, 0); +} + + void smp_init(void) { int i; diff --git a/kvm/user/test/lib/x86/smp.h b/kvm/user/test/lib/x86/smp.h index bac7e1478..c2e73501c 100644 --- a/kvm/user/test/lib/x86/smp.h +++ b/kvm/user/test/lib/x86/smp.h @@ -10,6 +10,7 @@ void smp_init(void); int cpu_count(void); int smp_id(void); void on_cpu(int cpu, void (*function)(void *data), void *data); +void on_cpu_async(int cpu, void (*function)(void *data), void *data); void spin_lock(struct spinlock *lock); void spin_unlock(struct spinlock *lock); |