To determine whether to wait for IPI to finish on remote cpu. Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx> Index: qemu-kvm/kvm/user/test/lib/x86/smp.c =================================================================== --- qemu-kvm.orig/kvm/user/test/lib/x86/smp.c +++ qemu-kvm/kvm/user/test/lib/x86/smp.c @@ -82,7 +82,7 @@ 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) +void on_cpu(int cpu, void (*function)(void *data), void *data, int wait) { spin_lock(&ipi_lock); if (cpu == smp_id()) @@ -93,9 +93,11 @@ void on_cpu(int cpu, void (*function)(vo 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) + ; + ipi_done = 0; + } } spin_unlock(&ipi_lock); } @@ -109,6 +111,6 @@ void smp_init(void) setup_smp_id(0); for (i = 1; i < cpu_count(); ++i) - on_cpu(i, setup_smp_id, 0); + on_cpu(i, setup_smp_id, 0, 1); } Index: qemu-kvm/kvm/user/test/lib/x86/smp.h =================================================================== --- qemu-kvm.orig/kvm/user/test/lib/x86/smp.h +++ qemu-kvm/kvm/user/test/lib/x86/smp.h @@ -9,7 +9,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(int cpu, void (*function)(void *data), void *data, int wait); void spin_lock(struct spinlock *lock); void spin_unlock(struct spinlock *lock); Index: qemu-kvm/kvm/user/test/x86/smptest.c =================================================================== --- qemu-kvm.orig/kvm/user/test/x86/smptest.c +++ qemu-kvm/kvm/user/test/x86/smptest.c @@ -20,6 +20,6 @@ int main() ncpus = cpu_count(); printf("found %d cpus\n", ncpus); for (i = 0; i < ncpus; ++i) - on_cpu(i, ipi_test, (void *)(long)i); + on_cpu(i, ipi_test, (void *)(long)i, 1); return 0; } Index: qemu-kvm/kvm/user/test/x86/vmexit.c =================================================================== --- qemu-kvm.orig/kvm/user/test/x86/vmexit.c +++ qemu-kvm/kvm/user/test/x86/vmexit.c @@ -63,14 +63,14 @@ static void nop(void *junk) static void ipi(void) { - on_cpu(1, nop, 0); + on_cpu(1, nop, 0, 1); } static void ipi_halt(void) { unsigned long long t; - on_cpu(1, nop, 0); + on_cpu(1, nop, 0, 1); t = rdtsc() + 2000; while (rdtsc() < t) ; -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html