diff mbox

[v3,1/2] virtio dataplane: adapt dataplane for virtio Version 1

Message ID 1441206756-21918-1-git-send-email-pmorel@linux.vnet.ibm.com
State New
Headers show

Commit Message

Pierre Morel Sept. 2, 2015, 3:12 p.m. UTC
Let dataplane allocate different region for the desc/avail/used
ring regions.
Take VIRTIO_RING_F_EVENT_IDX into account to increase the used/avail
rings accordingly.

Changes from V2:
- incorporate the code directly in vring_setup().
- added room for the event indexes used with VIRTIO_RING_F_EVENT_IDX

Changes from v1:
- use a macro to gain LOCs inside of vring_setup()

Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
---
 hw/virtio/dataplane/vring.c         | 61 ++++++++++++++++++++++++++++---------
 include/hw/virtio/dataplane/vring.h |  4 ++-
 2 files changed, 50 insertions(+), 15 deletions(-)

Comments

Eric Blake Sept. 2, 2015, 3:59 p.m. UTC | #1
[meta-comment]

On 09/02/2015 09:12 AM, Pierre Morel wrote:
> Let dataplane allocate different region for the desc/avail/used
> ring regions.
> Take VIRTIO_RING_F_EVENT_IDX into account to increase the used/avail
> rings accordingly.

This part is fine.

> 
> Changes from V2:
> - incorporate the code directly in vring_setup().
> - added room for the event indexes used with VIRTIO_RING_F_EVENT_IDX
> 
> Changes from v1:
> - use a macro to gain LOCs inside of vring_setup()

But the above changelog text belongs better...

> 
> Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
> ---

...here after the '---' separator, where it will be stripped by 'git
am'.  It is useful for reviewers of the earlier versions, but in the
long run, when reading 'git log', we will only care about what got
committed, not how many tries it took to get to that point.
Pierre Morel Sept. 2, 2015, 4:37 p.m. UTC | #2
On 09/02/2015 05:59 PM, Eric Blake wrote:
> [meta-comment]
>
> On 09/02/2015 09:12 AM, Pierre Morel wrote:
>> Let dataplane allocate different region for the desc/avail/used
>> ring regions.
>> Take VIRTIO_RING_F_EVENT_IDX into account to increase the used/avail
>> rings accordingly.
> This part is fine.
>
>> Changes from V2:
>> - incorporate the code directly in vring_setup().
>> - added room for the event indexes used with VIRTIO_RING_F_EVENT_IDX
>>
>> Changes from v1:
>> - use a macro to gain LOCs inside of vring_setup()
> But the above changelog text belongs better...
>
>> Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
>> ---
> ...here after the '---' separator, where it will be stripped by 'git
> am'.  It is useful for reviewers of the earlier versions, but in the
> long run, when reading 'git log', we will only care about what got
> committed, not how many tries it took to get to that point.
>
Thanks.
I do the right thing immediately.
diff mbox

Patch

diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index 07fd69c..08e1f4f 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -67,22 +67,45 @@  static void vring_unmap(void *buffer, bool is_write)
 /* Map the guest's vring to host memory */
 bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
 {
-    hwaddr vring_addr = virtio_queue_get_ring_addr(vdev, n);
-    hwaddr vring_size = virtio_queue_get_ring_size(vdev, n);
-    void *vring_ptr;
+    struct vring *vr = &vring->vr;
+    hwaddr addr;
+    hwaddr size;
+    void *ptr;
 
     vring->broken = false;
-
-    vring_ptr = vring_map(&vring->mr, vring_addr, vring_size, true);
-    if (!vring_ptr) {
-        error_report("Failed to map vring "
-                     "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
-                     vring_addr, vring_size);
-        vring->broken = true;
-        return false;
+    vr->num = virtio_queue_get_num(vdev, n);
+
+    addr = virtio_queue_get_desc_addr(vdev, n);
+    size = virtio_queue_get_desc_size(vdev, n);
+    ptr = vring_map(&vring->mr_desc, addr, size, true);
+    if (!ptr) {
+        error_report("Failed to map 0x%16lx byte for vring desc at %16lx",
+                      size, addr);
+        goto out_err_desc;
     }
-
-    vring_init(&vring->vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096);
+    vr->desc = ptr;
+
+    addr = virtio_queue_get_avail_addr(vdev, n);
+    size = virtio_queue_get_avail_size(vdev, n);
+    size += sizeof(__virtio16);
+    ptr = vring_map(&vring->mr_avail, addr, size, true);
+    if (!ptr) {
+        error_report("Failed to map 0x%16lx byte for vring avail at %16lx",
+                      size, addr);
+        goto out_err_avail;
+    }
+    vr->avail = ptr;
+
+    addr = virtio_queue_get_used_addr(vdev, n);
+    size = virtio_queue_get_used_size(vdev, n);
+    size += sizeof(__virtio16);
+    ptr = vring_map(&vring->mr_used, addr, size, true);
+    if (!ptr) {
+        error_report("Failed to map 0x%16lx byte for vring used at %16lx",
+                      size, addr);
+        goto out_err_used;
+    }
+    vr->used = ptr;
 
     vring->last_avail_idx = virtio_queue_get_last_avail_idx(vdev, n);
     vring->last_used_idx = vring_get_used_idx(vdev, vring);
@@ -92,6 +115,14 @@  bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
     trace_vring_setup(virtio_queue_get_ring_addr(vdev, n),
                       vring->vr.desc, vring->vr.avail, vring->vr.used);
     return true;
+
+out_err_used:
+    memory_region_unref(vring->mr_avail);
+out_err_avail:
+    memory_region_unref(vring->mr_desc);
+out_err_desc:
+    vring->broken = true;
+    return false;
 }
 
 void vring_teardown(Vring *vring, VirtIODevice *vdev, int n)
@@ -99,7 +130,9 @@  void vring_teardown(Vring *vring, VirtIODevice *vdev, int n)
     virtio_queue_set_last_avail_idx(vdev, n, vring->last_avail_idx);
     virtio_queue_invalidate_signalled_used(vdev, n);
 
-    memory_region_unref(vring->mr);
+    memory_region_unref(vring->mr_desc);
+    memory_region_unref(vring->mr_avail);
+    memory_region_unref(vring->mr_used);
 }
 
 /* Disable guest->host notifies */
diff --git a/include/hw/virtio/dataplane/vring.h b/include/hw/virtio/dataplane/vring.h
index 8d97db9..a596e4c 100644
--- a/include/hw/virtio/dataplane/vring.h
+++ b/include/hw/virtio/dataplane/vring.h
@@ -22,7 +22,9 @@ 
 #include "hw/virtio/virtio.h"
 
 typedef struct {
-    MemoryRegion *mr;               /* memory region containing the vring */
+    MemoryRegion *mr_desc;          /* memory region for the vring desc */
+    MemoryRegion *mr_avail;         /* memory region for the vring avail */
+    MemoryRegion *mr_used;          /* memory region for the vring used */
     struct vring vr;                /* virtqueue vring mapped to host memory */
     uint16_t last_avail_idx;        /* last processed avail ring index */
     uint16_t last_used_idx;         /* last processed used ring index */