* [patch 0/2] test: parallel vmexit
@ 2009-09-28 11:22 Marcelo Tosatti
2009-09-28 11:22 ` [patch 1/2] test: add wait parameter to on_cpu Marcelo Tosatti
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Marcelo Tosatti @ 2009-09-28 11:22 UTC (permalink / raw)
To: kvm; +Cc: avi
Run the vmexit tests in parallel on each present cpu.
^ permalink raw reply [flat|nested] 10+ messages in thread* [patch 1/2] test: add wait parameter to on_cpu 2009-09-28 11:22 [patch 0/2] test: parallel vmexit Marcelo Tosatti @ 2009-09-28 11:22 ` Marcelo Tosatti 2009-09-29 8:32 ` Avi Kivity 2009-09-28 11:22 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti 2 siblings, 1 reply; 10+ messages in thread From: Marcelo Tosatti @ 2009-09-28 11:22 UTC (permalink / raw) To: kvm; +Cc: avi, Marcelo Tosatti [-- Attachment #1: add-wait-to-on-cpu --] [-- Type: text/plain, Size: 2565 bytes --] To determine whether to wait for IPI to finish on remote cpu. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> 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) ; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/2] test: add wait parameter to on_cpu 2009-09-28 11:22 ` [patch 1/2] test: add wait parameter to on_cpu Marcelo Tosatti @ 2009-09-29 8:32 ` Avi Kivity 0 siblings, 0 replies; 10+ messages in thread From: Avi Kivity @ 2009-09-29 8:32 UTC (permalink / raw) To: Marcelo Tosatti; +Cc: kvm 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<mtosatti@redhat.com> > > 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 2/2] test: vmexit: run parallel tests on each cpu 2009-09-28 11:22 [patch 0/2] test: parallel vmexit Marcelo Tosatti 2009-09-28 11:22 ` [patch 1/2] test: add wait parameter to on_cpu Marcelo Tosatti @ 2009-09-28 11:22 ` Marcelo Tosatti 2009-09-29 8:35 ` Avi Kivity 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti 2 siblings, 1 reply; 10+ messages in thread From: Marcelo Tosatti @ 2009-09-28 11:22 UTC (permalink / raw) To: kvm; +Cc: avi, Marcelo Tosatti [-- Attachment #1: vmexit-parallel --] [-- Type: text/plain, Size: 1020 bytes --] So one can measure SMP overhead. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: qemu-kvm-test/kvm/user/test/x86/vmexit.c =================================================================== --- qemu-kvm-test.orig/kvm/user/test/x86/vmexit.c +++ qemu-kvm-test/kvm/user/test/x86/vmexit.c @@ -85,6 +85,9 @@ static struct test { { vmcall, "vmcall", }, { mov_from_cr8, "mov_from_cr8" }, { mov_to_cr8, "mov_to_cr8" }, +}; + +static struct test smp_tests[] = { { ipi, "ipi", is_smp }, { ipi_halt, "ipi+halt", is_smp }, }; @@ -113,14 +116,25 @@ static void do_test(struct test *test) #define ARRAY_SIZE(_x) (sizeof(_x) / sizeof((_x)[0])) -int main(void) +static void do_tests(void *junk) { int i; - smp_init(); - for (i = 0; i < ARRAY_SIZE(tests); ++i) do_test(&tests[i]); +} + +int main(void) +{ + int i, n; + + smp_init(); + + for (n = cpu_count(); n > 0; n--) + on_cpu(n-1, do_tests, 0, 0); + + for (i = 0; i < ARRAY_SIZE(smp_tests); ++i) + do_test(&smp_tests[i]); return 0; } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 2/2] test: vmexit: run parallel tests on each cpu 2009-09-28 11:22 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti @ 2009-09-29 8:35 ` Avi Kivity 0 siblings, 0 replies; 10+ messages in thread From: Avi Kivity @ 2009-09-29 8:35 UTC (permalink / raw) To: Marcelo Tosatti; +Cc: kvm On 09/28/2009 01:22 PM, Marcelo Tosatti wrote: > So one can measure SMP overhead. > > + > + for (n = cpu_count(); n> 0; n--) > + on_cpu(n-1, do_tests, 0, 0); > Should be done inside do_test(), so we can start the measurement on all cpus at the same time (right now, if some cpus calibrate earlier, they will finish sooner and the others will have an easier time). -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 0/2] kvm: test: parallel vmexit (v2) 2009-09-28 11:22 [patch 0/2] test: parallel vmexit Marcelo Tosatti 2009-09-28 11:22 ` [patch 1/2] test: add wait parameter to on_cpu Marcelo Tosatti 2009-09-28 11:22 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti @ 2009-10-05 13:07 ` Marcelo Tosatti 2009-10-05 13:07 ` [patch 1/2] test: add on_cpu_async Marcelo Tosatti ` (2 more replies) 2 siblings, 3 replies; 10+ messages in thread From: Marcelo Tosatti @ 2009-10-05 13:07 UTC (permalink / raw) To: kvm; +Cc: avi Addressing comments. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 1/2] test: add on_cpu_async 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti @ 2009-10-05 13:07 ` Marcelo Tosatti 2009-10-05 13:07 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti 2009-10-06 9:56 ` [patch 0/2] kvm: test: parallel vmexit (v2) Avi Kivity 2 siblings, 0 replies; 10+ messages in thread From: Marcelo Tosatti @ 2009-10-05 13:07 UTC (permalink / raw) To: kvm; +Cc: avi, Marcelo Tosatti [-- Attachment #1: add-wait-to-on-cpu --] [-- Type: text/plain, Size: 1854 bytes --] Non-wait version of on_cpu. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: qemu-kvm-parallel-vmexit/kvm/user/test/lib/x86/smp.c =================================================================== --- qemu-kvm-parallel-vmexit.orig/kvm/user/test/lib/x86/smp.c +++ qemu-kvm-parallel-vmexit/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; Index: qemu-kvm-parallel-vmexit/kvm/user/test/lib/x86/smp.h =================================================================== --- qemu-kvm-parallel-vmexit.orig/kvm/user/test/lib/x86/smp.h +++ qemu-kvm-parallel-vmexit/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); ^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 2/2] test: vmexit: run parallel tests on each cpu 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti 2009-10-05 13:07 ` [patch 1/2] test: add on_cpu_async Marcelo Tosatti @ 2009-10-05 13:07 ` Marcelo Tosatti 2009-10-06 0:56 ` [patch 3/3] test: vmexit: inl from pmtimer Marcelo Tosatti 2009-10-06 9:56 ` [patch 0/2] kvm: test: parallel vmexit (v2) Avi Kivity 2 siblings, 1 reply; 10+ messages in thread From: Marcelo Tosatti @ 2009-10-05 13:07 UTC (permalink / raw) To: kvm; +Cc: avi, Marcelo Tosatti [-- Attachment #1: vmexit-parallel --] [-- Type: text/plain, Size: 1931 bytes --] So one can measure SMP overhead. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: qemu-kvm-parallel-vmexit/kvm/user/test/x86/vmexit.c =================================================================== --- qemu-kvm-parallel-vmexit.orig/kvm/user/test/x86/vmexit.c +++ qemu-kvm-parallel-vmexit/kvm/user/test/x86/vmexit.c @@ -80,22 +80,38 @@ static struct test { void (*func)(void); const char *name; int (*valid)(void); + int parallel; } tests[] = { - { cpuid, "cpuid", }, - { vmcall, "vmcall", }, - { mov_from_cr8, "mov_from_cr8" }, - { mov_to_cr8, "mov_to_cr8" }, - { ipi, "ipi", is_smp }, - { ipi_halt, "ipi+halt", is_smp }, + { cpuid, "cpuid", .parallel = 1, }, + { vmcall, "vmcall", .parallel = 1, }, + { mov_from_cr8, "mov_from_cr8", .parallel = 1, }, + { mov_to_cr8, "mov_to_cr8" , .parallel = 1, }, + { ipi, "ipi", is_smp, .parallel = 0, }, + { ipi_halt, "ipi+halt", is_smp, .parallel = 0, }, }; +unsigned iterations; +volatile int nr_cpus_done; + +static void run_test(void *_func) +{ + int i; + void (*func)(void) = _func; + + for (i = 0; i < iterations; ++i) + func(); + + nr_cpus_done++; +} + static void do_test(struct test *test) { int i; unsigned long long t1, t2; - unsigned iterations = 32; void (*func)(void) = test->func; + iterations = 32; + if (test->valid && !test->valid()) { printf("%s (skipped)\n", test->name); return; @@ -104,8 +120,17 @@ static void do_test(struct test *test) do { iterations *= 2; t1 = rdtsc(); - for (i = 0; i < iterations; ++i) - func(); + + if (!test->parallel) { + for (i = 0; i < iterations; ++i) + func(); + } else { + nr_cpus_done = 0; + for (i = cpu_count(); i > 0; i--) + on_cpu_async(i-1, run_test, func); + while (nr_cpus_done < cpu_count()) + ; + } t2 = rdtsc(); } while ((t2 - t1) < GOAL); printf("%s %d\n", test->name, (int)((t2 - t1) / iterations)); ^ permalink raw reply [flat|nested] 10+ messages in thread
* [patch 3/3] test: vmexit: inl from pmtimer 2009-10-05 13:07 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti @ 2009-10-06 0:56 ` Marcelo Tosatti 0 siblings, 0 replies; 10+ messages in thread From: Marcelo Tosatti @ 2009-10-06 0:56 UTC (permalink / raw) To: kvm; +Cc: Avi Kivity Add inl(ACPI_PMTIMER_PORT) test. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: qemu-kvm-parallel-vmexit/kvm/user/test/x86/vmexit.c =================================================================== --- qemu-kvm-parallel-vmexit.orig/kvm/user/test/x86/vmexit.c +++ qemu-kvm-parallel-vmexit/kvm/user/test/x86/vmexit.c @@ -17,6 +17,13 @@ static inline unsigned long long rdtsc() return r; } +static unsigned int inl(unsigned short port) +{ + unsigned int val; + asm volatile("inl %w1, %0" : "=a"(val) : "Nd"(port)); + return val; +} + #define GOAL (1ull << 30) #ifdef __x86_64__ @@ -76,6 +83,11 @@ static void ipi_halt(void) ; } +static void inl_pmtimer(void) +{ + inl(0xb008); +} + static struct test { void (*func)(void); const char *name; @@ -86,6 +98,7 @@ static struct test { { vmcall, "vmcall", .parallel = 1, }, { mov_from_cr8, "mov_from_cr8", .parallel = 1, }, { mov_to_cr8, "mov_to_cr8" , .parallel = 1, }, + { inl_pmtimer, "inl_from_pmtimer", .parallel = 1, }, { ipi, "ipi", is_smp, .parallel = 0, }, { ipi_halt, "ipi+halt", is_smp, .parallel = 0, }, }; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 0/2] kvm: test: parallel vmexit (v2) 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti 2009-10-05 13:07 ` [patch 1/2] test: add on_cpu_async Marcelo Tosatti 2009-10-05 13:07 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti @ 2009-10-06 9:56 ` Avi Kivity 2 siblings, 0 replies; 10+ messages in thread From: Avi Kivity @ 2009-10-06 9:56 UTC (permalink / raw) To: Marcelo Tosatti; +Cc: kvm On 10/05/2009 03:07 PM, Marcelo Tosatti wrote: > Addressing comments. > > > Applied all three, thanks. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-10-06 9:56 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-09-28 11:22 [patch 0/2] test: parallel vmexit Marcelo Tosatti 2009-09-28 11:22 ` [patch 1/2] test: add wait parameter to on_cpu Marcelo Tosatti 2009-09-29 8:32 ` Avi Kivity 2009-09-28 11:22 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti 2009-09-29 8:35 ` Avi Kivity 2009-10-05 13:07 ` [patch 0/2] kvm: test: parallel vmexit (v2) Marcelo Tosatti 2009-10-05 13:07 ` [patch 1/2] test: add on_cpu_async Marcelo Tosatti 2009-10-05 13:07 ` [patch 2/2] test: vmexit: run parallel tests on each cpu Marcelo Tosatti 2009-10-06 0:56 ` [patch 3/3] test: vmexit: inl from pmtimer Marcelo Tosatti 2009-10-06 9:56 ` [patch 0/2] kvm: test: parallel vmexit (v2) Avi Kivity
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.