* [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).