public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests
@ 2013-04-03  8:52 Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 1/5] kvm-unittest: add printf %c support Michael S. Tsirkin
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

These patches add ability to measure speed of MMIO versus PIO, in
different configurations. As I didn't want to reserve a hardcoded range
of memory, I added pci bus scan support instead.  Used together with the
new pci-testdev backend.  When not present, the new tests are skipped.

Example output:
	mmio-no-eventfd:pci-mem 8796
	mmio-wildcard-eventfd:pci-mem 3609
	mmio-datamatch-eventfd:pci-mem 3685
	portio-no-eventfd:pci-io 5287
	portio-wildcard-eventfd:pci-io 1762
	portio-datamatch-eventfd:pci-io 1777

First interesting conclusion is that the overhead of MMIO
exit to QEMU as compared to PIO is double that of
MMIO ioeventfd as compared to PIO eventfd. Is this a known fact?

Michael S. Tsirkin (5):
  kvm-unittest: add printf %c support
  kvm-unittest: libcflat: add offsetof
  libcflat.h: define NULL
  lib: add pci bus scan support
  vmexit: add pci io and memory speed tests

 config-x86-common.mak |   1 +
 lib/libcflat.h        |   3 +
 lib/printf.c          |   3 +
 lib/x86/pci.c         |  55 ++++++++++++
 lib/x86/pci.h         |  16 ++++
 x86-run               |  13 ++-
 x86/vmexit.c          | 226 +++++++++++++++++++++++++++++++++++++++++++++++---
 7 files changed, 302 insertions(+), 15 deletions(-)
 create mode 100644 lib/x86/pci.c
 create mode 100644 lib/x86/pci.h

-- 
MST

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/5] kvm-unittest: add printf %c support
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
@ 2013-04-03  8:52 ` Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 2/5] kvm-unittest: libcflat: add offsetof Michael S. Tsirkin
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

Handy for printing debug strings from hardware.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 lib/printf.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/printf.c b/lib/printf.c
index 3bb9e3d..867eb19 100644
--- a/lib/printf.c
+++ b/lib/printf.c
@@ -104,6 +104,9 @@ int vsnprintf(char *buf, int size, const char *fmt, va_list va)
 	case '%':
 	    addchar(&s, '%');
 	    break;
+	case 'c':
+            addchar(&s, va_arg(va, int));
+	    break;
 	case '\0':
 	    --fmt;
 	    break;
-- 
MST


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/5] kvm-unittest: libcflat: add offsetof
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 1/5] kvm-unittest: add printf %c support Michael S. Tsirkin
@ 2013-04-03  8:52 ` Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 3/5] libcflat.h: define NULL Michael S. Tsirkin
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

implement offsetof using gcc builtin.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 lib/libcflat.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/libcflat.h b/lib/libcflat.h
index 0c62e4c..e005d3a 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -54,4 +54,6 @@ extern void *memset(void *s, int c, size_t n);
 extern long atol(const char *ptr);
 #define ARRAY_SIZE(_a)  (sizeof(_a)/sizeof((_a)[0]))
 
+#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
+
 #endif
-- 
MST


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/5] libcflat.h: define NULL
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 1/5] kvm-unittest: add printf %c support Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 2/5] kvm-unittest: libcflat: add offsetof Michael S. Tsirkin
@ 2013-04-03  8:52 ` Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 4/5] lib: add pci bus scan support Michael S. Tsirkin
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 lib/libcflat.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/libcflat.h b/lib/libcflat.h
index e005d3a..0875bd9 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -56,4 +56,5 @@ extern long atol(const char *ptr);
 
 #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
 
+#define NULL ((void *)0UL)
 #endif
-- 
MST


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/5] lib: add pci bus scan support
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
                   ` (2 preceding siblings ...)
  2013-04-03  8:52 ` [PATCH 3/5] libcflat.h: define NULL Michael S. Tsirkin
@ 2013-04-03  8:52 ` Michael S. Tsirkin
  2013-04-03  8:52 ` [PATCH 5/5] vmexit: add pci io and memory speed tests Michael S. Tsirkin
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

Add API to scan bus for a given device,
as well as API to access BAR registers.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 config-x86-common.mak |  1 +
 lib/x86/pci.c         | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/x86/pci.h         | 16 +++++++++++++++
 3 files changed, 72 insertions(+)
 create mode 100644 lib/x86/pci.c
 create mode 100644 lib/x86/pci.h

diff --git a/config-x86-common.mak b/config-x86-common.mak
index 1f0f1ba..455032b 100644
--- a/config-x86-common.mak
+++ b/config-x86-common.mak
@@ -14,6 +14,7 @@ cflatobjs += lib/x86/apic.o
 cflatobjs += lib/x86/atomic.o
 cflatobjs += lib/x86/desc.o
 cflatobjs += lib/x86/isr.o
+cflatobjs += lib/x86/pci.o
 
 $(libcflat): LDFLAGS += -nostdlib
 $(libcflat): CFLAGS += -ffreestanding -I lib
diff --git a/lib/x86/pci.c b/lib/x86/pci.c
new file mode 100644
index 0000000..f95cd88
--- /dev/null
+++ b/lib/x86/pci.c
@@ -0,0 +1,55 @@
+#include <linux/pci_regs.h>
+#include "pci.h"
+
+static void outl(unsigned short port, unsigned val)
+{
+    asm volatile("outl %d0, %w1" : : "a"(val), "Nd"(port));
+}
+
+static unsigned inl(unsigned short port)
+{
+    unsigned data;
+    asm volatile("inl %w1, %d0" : "=a"(data) : "Nd"(port));
+    return data;
+}
+static uint32_t pci_config_read(pcidevaddr_t dev, uint8_t reg)
+{
+    uint32_t index = reg | (dev << 8) | (0x1 << 31); 
+    outl(0xCF8, index);
+    return inl(0xCFC);
+}
+
+/* Scan bus look for a specific device. Only bus 0 scanned for now. */
+pcidevaddr_t pci_find_dev(uint16_t vendor_id, uint16_t device_id)
+{
+    unsigned dev;
+    for (dev = 0; dev < 256; ++dev) {
+    uint32_t id = pci_config_read(dev, 0);
+    if ((id & 0xFFFF) == vendor_id && (id >> 16) == device_id) {
+        return dev;
+    }
+    }
+    return PCIDEVADDR_INVALID;
+}
+
+unsigned long pci_bar_addr(pcidevaddr_t dev, int bar_num)
+{
+    uint32_t bar = pci_config_read(dev, PCI_BASE_ADDRESS_0 + bar_num * 4);
+    if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
+        return bar & PCI_BASE_ADDRESS_IO_MASK;
+    } else {
+        return bar & PCI_BASE_ADDRESS_MEM_MASK;
+    }
+}
+
+bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num)
+{
+    uint32_t bar = pci_config_read(dev, PCI_BASE_ADDRESS_0 + bar_num * 4);
+    return !(bar & PCI_BASE_ADDRESS_SPACE_IO);
+}
+
+bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num)
+{
+    uint32_t bar = pci_config_read(dev, PCI_BASE_ADDRESS_0 + bar_num * 4);
+    return bar;
+}
diff --git a/lib/x86/pci.h b/lib/x86/pci.h
new file mode 100644
index 0000000..0f69ef0
--- /dev/null
+++ b/lib/x86/pci.h
@@ -0,0 +1,16 @@
+#ifndef PCI_H
+#define PCI_H
+
+#include <inttypes.h>
+#include "libcflat.h"
+
+typedef uint16_t pcidevaddr_t;
+enum {
+    PCIDEVADDR_INVALID = 0x0
+};
+pcidevaddr_t pci_find_dev(uint16_t vendor_id, uint16_t device_id);
+unsigned long pci_bar_addr(pcidevaddr_t dev, int bar_num);
+bool pci_bar_is_memory(pcidevaddr_t dev, int bar_num);
+bool pci_bar_is_valid(pcidevaddr_t dev, int bar_num);
+
+#endif
-- 
MST


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 5/5] vmexit: add pci io and memory speed tests
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
                   ` (3 preceding siblings ...)
  2013-04-03  8:52 ` [PATCH 4/5] lib: add pci bus scan support Michael S. Tsirkin
@ 2013-04-03  8:52 ` Michael S. Tsirkin
  2013-04-14 14:51 ` [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO " Gleb Natapov
  2013-05-12  9:28 ` Gleb Natapov
  6 siblings, 0 replies; 8+ messages in thread
From: Michael S. Tsirkin @ 2013-04-03  8:52 UTC (permalink / raw)
  To: kvm, pbonzini, gleb, mtosatti

These tests measure speed of mmio and port io
exits using the new pci-testdev.
Skipped when running on old qemu.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 x86-run      |  13 +++-
 x86/vmexit.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 224 insertions(+), 15 deletions(-)

diff --git a/x86-run b/x86-run
index e395a70..f87b8c7 100755
--- a/x86-run
+++ b/x86-run
@@ -17,11 +17,20 @@ else
 	fi
 fi
 
+if ${qemu} -device '?' 2>&1 | fgrep pci-testdev > /dev/null;
+then
+	pci_testdev="-device pci-testdev"
+else
+	pci_testdev=""
+fi
+
 if
 	${qemu} -device '?' 2>&1 | fgrep "pc-testdev" > /dev/null;
 then
-	command="${qemu} -enable-kvm -device pc-testdev -serial stdio -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel"
+	pc_testdev="-device pc-testdev -device isa-debug-exit,iobase=0xf4,iosize=0x4"
 else
-	command="${qemu} -device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out -serial stdio -kernel"
+	pc_testdev="-device testdev,chardev=testlog -chardev file,id=testlog,path=msr.out"
 fi
+
+command="${qemu} -enable-kvm $pc_testdev -serial stdio $pci_testdev -kernel"
 exec ${command} "$@"
diff --git a/x86/vmexit.c b/x86/vmexit.c
index f49a993..3b945de 100644
--- a/x86/vmexit.c
+++ b/x86/vmexit.c
@@ -1,12 +1,32 @@
-
 #include "libcflat.h"
 #include "smp.h"
 #include "processor.h"
 #include "atomic.h"
+#include "x86/vm.h"
+#include "x86/desc.h"
+#include "x86/pci.h"
+
+struct test {
+	void (*func)(void);
+	const char *name;
+	int (*valid)(void);
+	int parallel;
+	bool (*next)(struct test *);
+};
+
+static void outb(unsigned short port, unsigned val)
+{
+    asm volatile("outb %b0, %w1" : : "a"(val), "Nd"(port));
+}
 
-static void outb(unsigned short port, int val)
+static void outw(unsigned short port, unsigned val)
 {
-    asm volatile("outb %b0, %w1" : "=a"(val) : "Nd"(port));
+    asm volatile("outw %w0, %w1" : : "a"(val), "Nd"(port));
+}
+
+static void outl(unsigned short port, unsigned val)
+{
+    asm volatile("outl %d0, %w1" : : "a"(val), "Nd"(port));
 }
 
 static unsigned int inb(unsigned short port)
@@ -141,12 +161,153 @@ static void wr_tsc_adjust_msr(void)
 	wrmsr(MSR_TSC_ADJUST, 0x0);
 }
 
-static struct test {
-	void (*func)(void);
-	const char *name;
-	int (*valid)(void);
-	int parallel;
-} tests[] = {
+struct pci_test_dev_hdr {
+    uint8_t test;
+    uint8_t width;
+    uint8_t pad0[2];
+    uint32_t offset;
+    uint32_t data;
+    uint32_t count;
+    uint8_t name[];
+};
+
+static struct pci_test {
+	unsigned iobar;
+	unsigned ioport;
+	volatile void *memaddr;
+	volatile void *mem;
+	int test_idx;
+	uint32_t data;
+	uint32_t offset;
+} pci_test = {
+	.test_idx = -1
+};
+
+static void pci_mem_testb(void)
+{
+	*(volatile uint8_t *)pci_test.mem = pci_test.data;
+}
+
+static void pci_mem_testw(void)
+{
+	*(volatile uint16_t *)pci_test.mem = pci_test.data;
+}
+
+static void pci_mem_testl(void)
+{
+	*(volatile uint32_t *)pci_test.mem = pci_test.data;
+}
+
+static void pci_io_testb(void)
+{
+	outb(pci_test.ioport, pci_test.data);
+}
+
+static void pci_io_testw(void)
+{
+	outw(pci_test.ioport, pci_test.data);
+}
+
+static void pci_io_testl(void)
+{
+	outl(pci_test.ioport, pci_test.data);
+}
+
+static uint8_t ioreadb(unsigned long addr, bool io)
+{
+	if (io) {
+		return inb(addr);
+	} else {
+		return *(volatile uint8_t *)addr;
+	}
+}
+
+static uint32_t ioreadl(unsigned long addr, bool io)
+{
+	/* Note: assumes little endian */
+	if (io) {
+		return inl(addr);
+	} else {
+		return *(volatile uint32_t *)addr;
+	}
+}
+
+static void iowriteb(unsigned long addr, uint8_t data, bool io)
+{
+	if (io) {
+		outb(addr, data);
+	} else {
+		*(volatile uint8_t *)addr = data;
+	}
+}
+
+static bool pci_next(struct test *test, unsigned long addr, bool io)
+{
+	int i;
+	uint8_t width;
+
+	if (!pci_test.memaddr) {
+		test->func = NULL;
+		return true;
+	}
+	pci_test.test_idx++;
+	iowriteb(addr + offsetof(struct pci_test_dev_hdr, test),
+		 pci_test.test_idx, io);
+	width = ioreadb(addr + offsetof(struct pci_test_dev_hdr, width),
+			io);
+	switch (width) {
+		case 1:
+			test->func = io ? pci_io_testb : pci_mem_testb;
+			break;
+		case 2:
+			test->func = io ? pci_io_testw : pci_mem_testw;
+			break;
+		case 4:
+			test->func = io ? pci_io_testl : pci_mem_testl;
+			break;
+		default:
+			/* Reset index for purposes of the next test */
+			pci_test.test_idx = -1;
+			test->func = NULL;
+			return false;
+	}
+	pci_test.data = ioreadl(addr + offsetof(struct pci_test_dev_hdr, data),
+				io);
+	pci_test.offset = ioreadl(addr + offsetof(struct pci_test_dev_hdr,
+						  offset), io);
+	for (i = 0; i < pci_test.offset; ++i) {
+		char c = ioreadb(addr + offsetof(struct pci_test_dev_hdr,
+						 name) + i, io);
+		if (!c) {
+			break;
+		}
+		printf("%c",c);
+	}
+	printf(":");
+	return true;
+}
+
+static bool pci_mem_next(struct test *test)
+{
+	bool ret;
+	ret = pci_next(test, ((unsigned long)pci_test.memaddr), false);
+	if (ret) {
+		pci_test.mem = pci_test.memaddr + pci_test.offset;
+	}
+	return ret;
+}
+
+static bool pci_io_next(struct test *test)
+{
+	bool ret;
+	ret = pci_next(test, ((unsigned long)pci_test.iobar), true);
+	if (ret) {
+		pci_test.ioport = pci_test.iobar + pci_test.offset;
+	}
+	return ret;
+}
+
+static struct test tests[] = {
 	{ cpuid_test, "cpuid", .parallel = 1,  },
 	{ vmcall, "vmcall", .parallel = 1, },
 #ifdef __x86_64__
@@ -162,6 +323,8 @@ static struct test {
 	{ ple_round_robin, "ple-round-robin", .parallel = 1 },
 	{ wr_tsc_adjust_msr, "wr_tsc_adjust_msr", .parallel = 1 },
 	{ rd_tsc_adjust_msr, "rd_tsc_adjust_msr", .parallel = 1 },
+	{ NULL, "pci-mem", .parallel = 0, .next = pci_mem_next },
+	{ NULL, "pci-io", .parallel = 0, .next = pci_io_next },
 };
 
 unsigned iterations;
@@ -178,17 +341,27 @@ static void run_test(void *_func)
     atomic_inc(&nr_cpus_done);
 }
 
-static void do_test(struct test *test)
+static bool do_test(struct test *test)
 {
 	int i;
 	unsigned long long t1, t2;
-        void (*func)(void) = test->func;
+        void (*func)(void);
 
         iterations = 32;
 
         if (test->valid && !test->valid()) {
 		printf("%s (skipped)\n", test->name);
-		return;
+		return false;
+	}
+
+	if (test->next && !test->next(test)) {
+		return false;
+	}
+
+	func = test->func;
+        if (!func) {
+		printf("%s (skipped)\n", test->name);
+		return false;
 	}
 
 	do {
@@ -208,6 +381,7 @@ static void do_test(struct test *test)
 		t2 = rdtsc();
 	} while ((t2 - t1) < GOAL);
 	printf("%s %d\n", test->name, (int)((t2 - t1) / iterations));
+	return test->next;
 }
 
 static void enable_nx(void *junk)
@@ -233,16 +407,42 @@ bool test_wanted(struct test *test, char *wanted[], int nwanted)
 int main(int ac, char **av)
 {
 	int i;
+	unsigned long membar = 0, base, offset;
+	void *m;
+	pcidevaddr_t pcidev;
 
 	smp_init();
+	setup_vm();
 	nr_cpus = cpu_count();
 
 	for (i = cpu_count(); i > 0; i--)
 		on_cpu(i-1, enable_nx, 0);
 
+	pcidev = pci_find_dev(0x1b36, 0x0005);
+	if (pcidev) {
+		for (i = 0; i < 2; i++) {
+			if (!pci_bar_is_valid(pcidev, i)) {
+				continue;
+			}
+			if (pci_bar_is_memory(pcidev, i)) {
+				membar = pci_bar_addr(pcidev, i);
+				base = membar & ~4095;
+				offset = membar - base;
+				m = alloc_vpages(1);
+				
+				install_page((void *)read_cr3(), base, m);
+				pci_test.memaddr = m + offset;
+			} else {
+				pci_test.iobar = pci_bar_addr(pcidev, i);
+			}
+		}
+		printf("pci-testdev at 0x%x membar %lx iobar %x\n",
+		       pcidev, membar, pci_test.iobar);
+	}
+
 	for (i = 0; i < ARRAY_SIZE(tests); ++i)
 		if (test_wanted(&tests[i], av + 1, ac - 1))
-			do_test(&tests[i]);
+			while (do_test(&tests[i])) {}
 
 	return 0;
 }
-- 
MST

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
                   ` (4 preceding siblings ...)
  2013-04-03  8:52 ` [PATCH 5/5] vmexit: add pci io and memory speed tests Michael S. Tsirkin
@ 2013-04-14 14:51 ` Gleb Natapov
  2013-05-12  9:28 ` Gleb Natapov
  6 siblings, 0 replies; 8+ messages in thread
From: Gleb Natapov @ 2013-04-14 14:51 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, pbonzini, mtosatti

On Wed, Apr 03, 2013 at 11:52:19AM +0300, Michael S. Tsirkin wrote:
> These patches add ability to measure speed of MMIO versus PIO, in
> different configurations. As I didn't want to reserve a hardcoded range
> of memory, I added pci bus scan support instead.  Used together with the
> new pci-testdev backend.  When not present, the new tests are skipped.
> 
> Example output:
> 	mmio-no-eventfd:pci-mem 8796
> 	mmio-wildcard-eventfd:pci-mem 3609
> 	mmio-datamatch-eventfd:pci-mem 3685
> 	portio-no-eventfd:pci-io 5287
> 	portio-wildcard-eventfd:pci-io 1762
> 	portio-datamatch-eventfd:pci-io 1777
> 
> First interesting conclusion is that the overhead of MMIO
> exit to QEMU as compared to PIO is double that of
> MMIO ioeventfd as compared to PIO eventfd. Is this a known fact?
> 
Looks fine to me. Will apply when QEMU part will land in upstream.

> Michael S. Tsirkin (5):
>   kvm-unittest: add printf %c support
>   kvm-unittest: libcflat: add offsetof
>   libcflat.h: define NULL
>   lib: add pci bus scan support
>   vmexit: add pci io and memory speed tests
> 
>  config-x86-common.mak |   1 +
>  lib/libcflat.h        |   3 +
>  lib/printf.c          |   3 +
>  lib/x86/pci.c         |  55 ++++++++++++
>  lib/x86/pci.h         |  16 ++++
>  x86-run               |  13 ++-
>  x86/vmexit.c          | 226 +++++++++++++++++++++++++++++++++++++++++++++++---
>  7 files changed, 302 insertions(+), 15 deletions(-)
>  create mode 100644 lib/x86/pci.c
>  create mode 100644 lib/x86/pci.h
> 
> -- 
> MST

--
			Gleb.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests
  2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
                   ` (5 preceding siblings ...)
  2013-04-14 14:51 ` [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO " Gleb Natapov
@ 2013-05-12  9:28 ` Gleb Natapov
  6 siblings, 0 replies; 8+ messages in thread
From: Gleb Natapov @ 2013-05-12  9:28 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: kvm, pbonzini, mtosatti

On Wed, Apr 03, 2013 at 11:52:19AM +0300, Michael S. Tsirkin wrote:
> These patches add ability to measure speed of MMIO versus PIO, in
> different configurations. As I didn't want to reserve a hardcoded range
> of memory, I added pci bus scan support instead.  Used together with the
> new pci-testdev backend.  When not present, the new tests are skipped.
> 
> Example output:
> 	mmio-no-eventfd:pci-mem 8796
> 	mmio-wildcard-eventfd:pci-mem 3609
> 	mmio-datamatch-eventfd:pci-mem 3685
> 	portio-no-eventfd:pci-io 5287
> 	portio-wildcard-eventfd:pci-io 1762
> 	portio-datamatch-eventfd:pci-io 1777
> 
> First interesting conclusion is that the overhead of MMIO
> exit to QEMU as compared to PIO is double that of
> MMIO ioeventfd as compared to PIO eventfd. Is this a known fact?
> 
Applied, thanks.

> Michael S. Tsirkin (5):
>   kvm-unittest: add printf %c support
>   kvm-unittest: libcflat: add offsetof
>   libcflat.h: define NULL
>   lib: add pci bus scan support
>   vmexit: add pci io and memory speed tests
> 
>  config-x86-common.mak |   1 +
>  lib/libcflat.h        |   3 +
>  lib/printf.c          |   3 +
>  lib/x86/pci.c         |  55 ++++++++++++
>  lib/x86/pci.h         |  16 ++++
>  x86-run               |  13 ++-
>  x86/vmexit.c          | 226 +++++++++++++++++++++++++++++++++++++++++++++++---
>  7 files changed, 302 insertions(+), 15 deletions(-)
>  create mode 100644 lib/x86/pci.c
>  create mode 100644 lib/x86/pci.h
> 
> -- 
> MST

--
			Gleb.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-05-12  9:28 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-03  8:52 [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO speed tests Michael S. Tsirkin
2013-04-03  8:52 ` [PATCH 1/5] kvm-unittest: add printf %c support Michael S. Tsirkin
2013-04-03  8:52 ` [PATCH 2/5] kvm-unittest: libcflat: add offsetof Michael S. Tsirkin
2013-04-03  8:52 ` [PATCH 3/5] libcflat.h: define NULL Michael S. Tsirkin
2013-04-03  8:52 ` [PATCH 4/5] lib: add pci bus scan support Michael S. Tsirkin
2013-04-03  8:52 ` [PATCH 5/5] vmexit: add pci io and memory speed tests Michael S. Tsirkin
2013-04-14 14:51 ` [PATCH 0/5] kvm-unittests: add pci PORT IO and MMIO " Gleb Natapov
2013-05-12  9:28 ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox