All of lore.kernel.org
 help / color / mirror / Atom feed
* [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 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.