[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [[RFC v3 03/12] virtio: init memory cache for packed ri
From: |
Wei Xu |
Subject: |
Re: [Qemu-devel] [[RFC v3 03/12] virtio: init memory cache for packed ring |
Date: |
Mon, 15 Oct 2018 15:09:54 +0800 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
On Mon, Oct 15, 2018 at 11:10:12AM +0800, Jason Wang wrote:
>
>
> On 2018年10月11日 22:08, address@hidden wrote:
> >From: Wei Xu <address@hidden>
> >
> >Expand 1.0 by adding offset calculation accordingly.
>
> This is only part of what this patch did and I suggest to another patch to
> do this.
>
> >
> >Signed-off-by: Wei Xu <address@hidden>
> >---
> > hw/virtio/vhost.c | 16 ++++++++--------
> > hw/virtio/virtio.c | 35 +++++++++++++++++++++++------------
> > include/hw/virtio/virtio.h | 4 ++--
> > 3 files changed, 33 insertions(+), 22 deletions(-)
> >
> >diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> >index 569c405..9df2da3 100644
> >--- a/hw/virtio/vhost.c
> >+++ b/hw/virtio/vhost.c
> >@@ -996,14 +996,14 @@ static int vhost_virtqueue_start(struct vhost_dev *dev,
> > r = -ENOMEM;
> > goto fail_alloc_desc;
> > }
> >- vq->avail_size = s = l = virtio_queue_get_avail_size(vdev, idx);
> >+ vq->avail_size = s = l = virtio_queue_get_driver_size(vdev, idx);
>
> Let's try to use a more consistent name. E.g either use avail/used or
> driver/device.
>
> I prefer to use avail/used, it can save lots of unnecessary changes.
OK.
>
> > vq->avail_phys = a = virtio_queue_get_avail_addr(vdev, idx);
> > vq->avail = vhost_memory_map(dev, a, &l, 0);
> > if (!vq->avail || l != s) {
> > r = -ENOMEM;
> > goto fail_alloc_avail;
> > }
> >- vq->used_size = s = l = virtio_queue_get_used_size(vdev, idx);
> >+ vq->used_size = s = l = virtio_queue_get_device_size(vdev, idx);
> > vq->used_phys = a = virtio_queue_get_used_addr(vdev, idx);
> > vq->used = vhost_memory_map(dev, a, &l, 1);
> > if (!vq->used || l != s) {
> >@@ -1051,10 +1051,10 @@ static int vhost_virtqueue_start(struct vhost_dev
> >*dev,
> > fail_vector:
> > fail_kick:
> > fail_alloc:
> >- vhost_memory_unmap(dev, vq->used, virtio_queue_get_used_size(vdev, idx),
> >+ vhost_memory_unmap(dev, vq->used, virtio_queue_get_device_size(vdev,
> >idx),
> > 0, 0);
> > fail_alloc_used:
> >- vhost_memory_unmap(dev, vq->avail, virtio_queue_get_avail_size(vdev,
> >idx),
> >+ vhost_memory_unmap(dev, vq->avail, virtio_queue_get_driver_size(vdev,
> >idx),
> > 0, 0);
> > fail_alloc_avail:
> > vhost_memory_unmap(dev, vq->desc, virtio_queue_get_desc_size(vdev,
> > idx),
> >@@ -1101,10 +1101,10 @@ static void vhost_virtqueue_stop(struct vhost_dev
> >*dev,
> > vhost_vq_index);
> > }
> >- vhost_memory_unmap(dev, vq->used, virtio_queue_get_used_size(vdev, idx),
> >- 1, virtio_queue_get_used_size(vdev, idx));
> >- vhost_memory_unmap(dev, vq->avail, virtio_queue_get_avail_size(vdev,
> >idx),
> >- 0, virtio_queue_get_avail_size(vdev, idx));
> >+ vhost_memory_unmap(dev, vq->used, virtio_queue_get_device_size(vdev,
> >idx),
> >+ 1, virtio_queue_get_device_size(vdev, idx));
> >+ vhost_memory_unmap(dev, vq->avail, virtio_queue_get_driver_size(vdev,
> >idx),
> >+ 0, virtio_queue_get_driver_size(vdev, idx));
> > vhost_memory_unmap(dev, vq->desc, virtio_queue_get_desc_size(vdev,
> > idx),
> > 0, virtio_queue_get_desc_size(vdev, idx));
> > }
> >diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> >index 500eecf..bfb3364 100644
> >--- a/hw/virtio/virtio.c
> >+++ b/hw/virtio/virtio.c
> >@@ -162,11 +162,8 @@ static void virtio_init_region_cache(VirtIODevice
> >*vdev, int n)
> > VRingMemoryRegionCaches *old = vq->vring.caches;
> > VRingMemoryRegionCaches *new = NULL;
> > hwaddr addr, size;
> >- int event_size;
> > int64_t len;
> >- event_size = virtio_vdev_has_feature(vq->vdev, VIRTIO_RING_F_EVENT_IDX)
> >? 2 : 0;
> >-
> > addr = vq->vring.desc;
> > if (!addr) {
> > goto out_no_cache;
> >@@ -174,13 +171,13 @@ static void virtio_init_region_cache(VirtIODevice
> >*vdev, int n)
> > new = g_new0(VRingMemoryRegionCaches, 1);
> > size = virtio_queue_get_desc_size(vdev, n);
> > len = address_space_cache_init(&new->desc, vdev->dma_as,
> >- addr, size, false);
> >+ addr, size, true);
>
> This looks wrong, for split virtqueue, descriptor ring is read only.
Did know it, I got a segment fault with 'false' case for packed ring,
will add a feature check here, thanks for the tip.
>
> > if (len < size) {
> > virtio_error(vdev, "Cannot map desc");
> > goto err_desc;
> > }
> >- size = virtio_queue_get_used_size(vdev, n) + event_size;
> >+ size = virtio_queue_get_device_size(vdev, n);
> > len = address_space_cache_init(&new->used, vdev->dma_as,
> > vq->vring.used, size, true);
> > if (len < size) {
> >@@ -188,7 +185,7 @@ static void virtio_init_region_cache(VirtIODevice *vdev,
> >int n)
> > goto err_used;
> > }
> >- size = virtio_queue_get_avail_size(vdev, n) + event_size;
> >+ size = virtio_queue_get_driver_size(vdev, n);
> > len = address_space_cache_init(&new->avail, vdev->dma_as,
> > vq->vring.avail, size, false);
> > if (len < size) {
> >@@ -2339,16 +2336,30 @@ hwaddr virtio_queue_get_desc_size(VirtIODevice
> >*vdev, int n)
> > return sizeof(VRingDesc) * vdev->vq[n].vring.num;
> > }
> >-hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n)
> >+hwaddr virtio_queue_get_driver_size(VirtIODevice *vdev, int n)
> > {
> >- return offsetof(VRingAvail, ring) +
> >- sizeof(uint16_t) * vdev->vq[n].vring.num;
> >+ int s;
> >+
> >+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> >+ return sizeof(struct VRingPackedDescEvent);
> >+ } else {
> >+ s = virtio_vdev_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
> >+ return offsetof(VRingAvail, ring) +
> >+ sizeof(uint16_t) * vdev->vq[n].vring.num + s;
>
> I tend to move this to an independent patch.
You mean this two functions?
Wei
>
> Thanks
>
> >+ }
> > }
> >-hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n)
> >+hwaddr virtio_queue_get_device_size(VirtIODevice *vdev, int n)
> > {
> >- return offsetof(VRingUsed, ring) +
> >- sizeof(VRingUsedElem) * vdev->vq[n].vring.num;
> >+ int s;
> >+
> >+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> >+ return sizeof(struct VRingPackedDescEvent);
> >+ } else {
> >+ s = virtio_vdev_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX) ? 2 : 0;
> >+ return offsetof(VRingUsed, ring) +
> >+ sizeof(VRingUsedElem) * vdev->vq[n].vring.num + s;
> >+ }
> > }
> > uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n)
> >diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
> >index 9c1fa07..e323e76 100644
> >--- a/include/hw/virtio/virtio.h
> >+++ b/include/hw/virtio/virtio.h
> >@@ -270,8 +270,8 @@ hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev,
> >int n);
> > hwaddr virtio_queue_get_avail_addr(VirtIODevice *vdev, int n);
> > hwaddr virtio_queue_get_used_addr(VirtIODevice *vdev, int n);
> > hwaddr virtio_queue_get_desc_size(VirtIODevice *vdev, int n);
> >-hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
> >-hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
> >+hwaddr virtio_queue_get_driver_size(VirtIODevice *vdev, int n);
> >+hwaddr virtio_queue_get_device_size(VirtIODevice *vdev, int n);
> > uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
> > void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t
> > idx);
> > void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n);
>
>
[Qemu-devel] [[RFC v3 07/12] virtio: fill/flush/pop for packed ring, wexu, 2018/10/11
[Qemu-devel] [[RFC v3 06/12] virtio: get avail bytes check for packed ring, wexu, 2018/10/11
[Qemu-devel] [[RFC v3 08/12] virtio: event suppression support for packed ring, wexu, 2018/10/11