Re: [Qemu-devel] [PATCH v2 1/6] hostmem: make hostmem single, not per Vring related

2013-05-03 Thread Stefan Hajnoczi
On Fri, May 03, 2013 at 10:45:17AM +0800, Liu Ping Fan wrote:
 diff --git a/include/exec/memory.h b/include/exec/memory.h
 index 9e88320..2761668 100644
 --- a/include/exec/memory.h
 +++ b/include/exec/memory.h
 @@ -887,6 +887,7 @@ void *address_space_map(AddressSpace *as, hwaddr addr,
  void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
   int is_write, hwaddr access_len);
  
 +void hostmem_init(void);

This should go in hostmem.h.  exec.c must now include hostmem.h.

You need to take care of the ./configure dependency: hostmem.o is only
build when CONFIG_VIRTIO_BLK_DATA_PLANE is 'y'.



[Qemu-devel] [PATCH v2 1/6] hostmem: make hostmem single, not per Vring related

2013-05-02 Thread Liu Ping Fan
From: Liu Ping Fan pingf...@linux.vnet.ibm.com

The hwaddr and hva mapping relation is system wide, no need to
be created for each Vring

Signed-off-by: Liu Ping Fan pingf...@linux.vnet.ibm.com
---
 exec.c|1 +
 hw/virtio/dataplane/hostmem.c |   33 +++--
 hw/virtio/dataplane/vring.c   |   11 ---
 include/exec/memory.h |1 +
 include/hw/virtio/dataplane/hostmem.h |5 +
 include/hw/virtio/dataplane/vring.h   |1 -
 6 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/exec.c b/exec.c
index fa1e0c3..df01f08 100644
--- a/exec.c
+++ b/exec.c
@@ -1809,6 +1809,7 @@ static void memory_map_init(void)
 memory_listener_register(core_memory_listener, address_space_memory);
 memory_listener_register(io_memory_listener, address_space_io);
 memory_listener_register(tcg_memory_listener, address_space_memory);
+hostmem_init();
 
 dma_context_init(dma_context_memory, address_space_memory,
  NULL, NULL, NULL);
diff --git a/hw/virtio/dataplane/hostmem.c b/hw/virtio/dataplane/hostmem.c
index 37292ff..756b09f 100644
--- a/hw/virtio/dataplane/hostmem.c
+++ b/hw/virtio/dataplane/hostmem.c
@@ -14,6 +14,10 @@
 #include exec/address-spaces.h
 #include hw/virtio/dataplane/hostmem.h
 
+HostMem *system_mem;
+
+static void hostmem_finalize(void);
+
 static int hostmem_lookup_cmp(const void *phys_, const void *region_)
 {
 hwaddr phys = *(const hwaddr *)phys_;
@@ -31,11 +35,12 @@ static int hostmem_lookup_cmp(const void *phys_, const void 
*region_)
 /**
  * Map guest physical address to host pointer
  */
-void *hostmem_lookup(HostMem *hostmem, hwaddr phys, hwaddr len, bool is_write)
+void *hostmem_lookup(hwaddr phys, hwaddr len, bool is_write)
 {
 HostMemRegion *region;
 void *host_addr = NULL;
 hwaddr offset_within_region;
+HostMem *hostmem = system_mem;
 
 qemu_mutex_lock(hostmem-current_regions_lock);
 region = bsearch(phys, hostmem-current_regions,
@@ -137,13 +142,12 @@ static void 
hostmem_listener_coalesced_mmio_dummy(MemoryListener *listener,
 {
 }
 
-void hostmem_init(HostMem *hostmem)
+void hostmem_init(void)
 {
-memset(hostmem, 0, sizeof(*hostmem));
+system_mem = g_new0(HostMem, 1);
+qemu_mutex_init(system_mem-current_regions_lock);
 
-qemu_mutex_init(hostmem-current_regions_lock);
-
-hostmem-listener = (MemoryListener){
+system_mem-listener = (MemoryListener) {
 .begin = hostmem_listener_dummy,
 .commit = hostmem_listener_commit,
 .region_add = hostmem_listener_append_region,
@@ -161,16 +165,17 @@ void hostmem_init(HostMem *hostmem)
 .priority = 10,
 };
 
-memory_listener_register(hostmem-listener, address_space_memory);
-if (hostmem-num_new_regions  0) {
-hostmem_listener_commit(hostmem-listener);
+memory_listener_register(system_mem-listener, address_space_memory);
+if (system_mem-num_new_regions  0) {
+hostmem_listener_commit(system_mem-listener);
 }
+atexit(hostmem_finalize);
 }
 
-void hostmem_finalize(HostMem *hostmem)
+static void hostmem_finalize(void)
 {
-memory_listener_unregister(hostmem-listener);
-g_free(hostmem-new_regions);
-g_free(hostmem-current_regions);
-qemu_mutex_destroy(hostmem-current_regions_lock);
+memory_listener_unregister(system_mem-listener);
+g_free(system_mem-new_regions);
+g_free(system_mem-current_regions);
+qemu_mutex_destroy(system_mem-current_regions_lock);
 }
diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index e0d6e83..4d6d735 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -27,8 +27,7 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
 
 vring-broken = false;
 
-hostmem_init(vring-hostmem);
-vring_ptr = hostmem_lookup(vring-hostmem, vring_addr, vring_size, true);
+vring_ptr = hostmem_lookup(vring_addr, vring_size, true);
 if (!vring_ptr) {
 error_report(Failed to map vring 
  addr %# HWADDR_PRIx  size % HWADDR_PRIu,
@@ -51,7 +50,6 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
 
 void vring_teardown(Vring *vring)
 {
-hostmem_finalize(vring-hostmem);
 }
 
 /* Disable guest-host notifies */
@@ -138,8 +136,7 @@ static int get_indirect(Vring *vring,
 struct vring_desc *desc_ptr;
 
 /* Translate indirect descriptor */
-desc_ptr = hostmem_lookup(vring-hostmem,
-  indirect-addr + found * sizeof(desc),
+desc_ptr = hostmem_lookup(indirect-addr + found * sizeof(desc),
   sizeof(desc), false);
 if (!desc_ptr) {
 error_report(Failed to map indirect descriptor 
@@ -172,7 +169,7 @@ static int get_indirect(Vring *vring,
 return -ENOBUFS;
 }
 
-iov-iov_base = hostmem_lookup(vring-hostmem, desc.addr, desc.len,
+