From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [patch 1/2] test: add wait parameter to on_cpu Date: Tue, 29 Sep 2009 10:32:51 +0200 Message-ID: <4AC1C633.2070403@redhat.com> References: <20090928112208.841396420@redhat.com> <20090928112247.375362302@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:23415 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751316AbZI2Ich (ORCPT ); Tue, 29 Sep 2009 04:32:37 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8T8Wfxs004393 for ; Tue, 29 Sep 2009 04:32:41 -0400 In-Reply-To: <20090928112247.375362302@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 09/28/2009 01:22 PM, Marcelo Tosatti wrote: > To determine whether to wait for IPI to finish on remote cpu. > > Signed-off-by: Marcelo Tosatti > > 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) > ; > > Boolean parameters are unreadable at the call site. I'd much prefer a new API (on_cpu_async(), with on_cpu_join() to wait for completion). -- error compiling committee.c: too many arguments to function