Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
On Wed, Aug 26, 2015 at 03:24:42PM +0200, Pierre Morel wrote: > diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c > index 07fd69c..ad86be5 100644 > --- a/hw/virtio/dataplane/vring.c > +++ b/hw/virtio/dataplane/vring.c > @@ -65,24 +65,34 @@ static void vring_unmap(void *buffer, bool is_write) > } > > /* Map the guest's vring to host memory */ > + > +#define MAP_VRING_DESCRIPTOR(d) { \ > +hwaddr addr;\ > +hwaddr size;\ > +void *ptr; \ > +\ > +addr = virtio_queue_get_##d##_addr(vdev, n);\ > +size = virtio_queue_get_##d## _size(vdev, n); \ > +ptr = vring_map(>mr_##d, addr, size, true); \ > +if (!ptr) { \ > +error_report("Failed to map vring "#d" "\ > + "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu, \ > + addr, size); \ > +goto out_err_##d; \ > +} \ > +vr->d = ptr;\ > +} Not a fan of the macro, IMO it just obfuscates the code. Also, normally do ... while (0) is used for statement-like macros to keep it a single statement instead of a compound statement (where the trailing semicolon would break if, while, etc). > + > 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 = >vr; > > vring->broken = false; > +vr->num = virtio_queue_get_num(vdev, n); > > -vring_ptr = vring_map(>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; > -} > - > -vring_init(>vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096); > +MAP_VRING_DESCRIPTOR(desc); > +MAP_VRING_DESCRIPTOR(avail); > +MAP_VRING_DESCRIPTOR(used); This doesn't take VIRTIO_RING_F_EVENT_IDX into account, where we access beyond the end of the rings. Please check that code path and map the memory.
Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
On Wed, Aug 26, 2015 at 03:24:42PM +0200, Pierre Morel wrote: Let dataplane allocate different region for the desc/avail/used ring regions. Signed-off-by: Pierre Morel pmo...@linux.vnet.ibm.com Acked-by: Greg Kurz gk...@linux.vnet.ibm.com Tested-by: Greg Kurz gk...@linux.vnet.ibm.com Also need to Cc stable on this. --- hw/virtio/dataplane/vring.c | 48 ++--- include/hw/virtio/dataplane/vring.h | 4 +++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 07fd69c..ad86be5 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -65,24 +65,34 @@ static void vring_unmap(void *buffer, bool is_write) } /* Map the guest's vring to host memory */ + +#define MAP_VRING_DESCRIPTOR(d) { \ +hwaddr addr;\ +hwaddr size;\ +void *ptr; \ +\ +addr = virtio_queue_get_##d##_addr(vdev, n);\ +size = virtio_queue_get_##d## _size(vdev, n); \ +ptr = vring_map(vring-mr_##d, addr, size, true); \ +if (!ptr) { \ +error_report(Failed to map vring #d \ + addr %# HWADDR_PRIx size % HWADDR_PRIu, \ + addr, size); \ +goto out_err_##d; \ +} \ +vr-d = ptr;\ +} + 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; vring-broken = false; +vr-num = virtio_queue_get_num(vdev, n); -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; -} - -vring_init(vring-vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096); +MAP_VRING_DESCRIPTOR(desc); +MAP_VRING_DESCRIPTOR(avail); +MAP_VRING_DESCRIPTOR(used); vring-last_avail_idx = virtio_queue_get_last_avail_idx(vdev, n); vring-last_used_idx = vring_get_used_idx(vdev, vring); @@ -92,6 +102,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 +117,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 */ -- 2.3.0
Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
On Wed, 26 Aug 2015 15:24:42 +0200 Pierre Morel pmo...@linux.vnet.ibm.com wrote: Let dataplane allocate different region for the desc/avail/used s/region/regions/ ring regions. Signed-off-by: Pierre Morel pmo...@linux.vnet.ibm.com Acked-by: Greg Kurz gk...@linux.vnet.ibm.com Tested-by: Greg Kurz gk...@linux.vnet.ibm.com --- hw/virtio/dataplane/vring.c | 48 ++--- include/hw/virtio/dataplane/vring.h | 4 +++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 07fd69c..ad86be5 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -65,24 +65,34 @@ static void vring_unmap(void *buffer, bool is_write) } /* Map the guest's vring to host memory */ + +#define MAP_VRING_DESCRIPTOR(d) { \ +hwaddr addr;\ +hwaddr size;\ +void *ptr; \ +\ +addr = virtio_queue_get_##d##_addr(vdev, n);\ +size = virtio_queue_get_##d## _size(vdev, n); \ Inconsistent spacing (but probably can be fixed when applying). +ptr = vring_map(vring-mr_##d, addr, size, true); \ +if (!ptr) { \ +error_report(Failed to map vring #d \ + addr %# HWADDR_PRIx size % HWADDR_PRIu, \ + addr, size); \ +goto out_err_##d; \ +} \ +vr-d = ptr;\ +} + 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; vring-broken = false; +vr-num = virtio_queue_get_num(vdev, n); -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; -} - -vring_init(vring-vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096); +MAP_VRING_DESCRIPTOR(desc); +MAP_VRING_DESCRIPTOR(avail); +MAP_VRING_DESCRIPTOR(used); vring-last_avail_idx = virtio_queue_get_last_avail_idx(vdev, n); vring-last_used_idx = vring_get_used_idx(vdev, vring); @@ -92,6 +102,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; My only worry is that this might be a bit hard to parse as the gotos are hidden in the macro. But in the end, both this and the original version are basically fine. } void vring_teardown(Vring *vring, VirtIODevice *vdev, int n) Reviewed-by: Cornelia Huck cornelia.h...@de.ibm.com
[Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
Let dataplane allocate different region for the desc/avail/used ring regions. Signed-off-by: Pierre Morel pmo...@linux.vnet.ibm.com Acked-by: Greg Kurz gk...@linux.vnet.ibm.com Tested-by: Greg Kurz gk...@linux.vnet.ibm.com --- hw/virtio/dataplane/vring.c | 48 ++--- include/hw/virtio/dataplane/vring.h | 4 +++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 07fd69c..ad86be5 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -65,24 +65,34 @@ static void vring_unmap(void *buffer, bool is_write) } /* Map the guest's vring to host memory */ + +#define MAP_VRING_DESCRIPTOR(d) { \ +hwaddr addr;\ +hwaddr size;\ +void *ptr; \ +\ +addr = virtio_queue_get_##d##_addr(vdev, n);\ +size = virtio_queue_get_##d## _size(vdev, n); \ +ptr = vring_map(vring-mr_##d, addr, size, true); \ +if (!ptr) { \ +error_report(Failed to map vring #d \ + addr %# HWADDR_PRIx size % HWADDR_PRIu, \ + addr, size); \ +goto out_err_##d; \ +} \ +vr-d = ptr;\ +} + 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; vring-broken = false; +vr-num = virtio_queue_get_num(vdev, n); -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; -} - -vring_init(vring-vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096); +MAP_VRING_DESCRIPTOR(desc); +MAP_VRING_DESCRIPTOR(avail); +MAP_VRING_DESCRIPTOR(used); vring-last_avail_idx = virtio_queue_get_last_avail_idx(vdev, n); vring-last_used_idx = vring_get_used_idx(vdev, vring); @@ -92,6 +102,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 +117,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 */ -- 2.3.0
Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
On Wed, 26 Aug 2015 15:24:42 +0200 Pierre Morel pmo...@linux.vnet.ibm.com wrote: Let dataplane allocate different region for the desc/avail/used ring regions. Signed-off-by: Pierre Morel pmo...@linux.vnet.ibm.com Acked-by: Greg Kurz gk...@linux.vnet.ibm.com Stefan, In case SoB is more appropriate, here it is: Signed-off-by: Greg Kurz gk...@linux.vnet.ibm.com Cheers. -- Greg Tested-by: Greg Kurz gk...@linux.vnet.ibm.com --- hw/virtio/dataplane/vring.c | 48 ++--- include/hw/virtio/dataplane/vring.h | 4 +++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 07fd69c..ad86be5 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -65,24 +65,34 @@ static void vring_unmap(void *buffer, bool is_write) } /* Map the guest's vring to host memory */ + +#define MAP_VRING_DESCRIPTOR(d) { \ +hwaddr addr;\ +hwaddr size;\ +void *ptr; \ +\ +addr = virtio_queue_get_##d##_addr(vdev, n);\ +size = virtio_queue_get_##d## _size(vdev, n); \ +ptr = vring_map(vring-mr_##d, addr, size, true); \ +if (!ptr) { \ +error_report(Failed to map vring #d \ + addr %# HWADDR_PRIx size % HWADDR_PRIu, \ + addr, size); \ +goto out_err_##d; \ +} \ +vr-d = ptr;\ +} + 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; vring-broken = false; +vr-num = virtio_queue_get_num(vdev, n); -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; -} - -vring_init(vring-vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096); +MAP_VRING_DESCRIPTOR(desc); +MAP_VRING_DESCRIPTOR(avail); +MAP_VRING_DESCRIPTOR(used); vring-last_avail_idx = virtio_queue_get_last_avail_idx(vdev, n); vring-last_used_idx = vring_get_used_idx(vdev, vring); @@ -92,6 +102,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 +117,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 */