* [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
* [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 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
* 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).