qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio


From: Cornelia Huck
Subject: Re: [Qemu-devel] [PATCH v2] virtio dataplane: adapt dataplane for virtio Version 1
Date: Wed, 26 Aug 2015 16:57:42 +0200

On Wed, 26 Aug 2015 15:24:42 +0200
Pierre Morel <address@hidden> wrote:

> Let dataplane allocate different region for the desc/avail/used

s/region/regions/

> ring regions.
> 
> Signed-off-by: Pierre Morel <address@hidden>
> Acked-by: Greg Kurz <address@hidden>
> Tested-by: Greg Kurz <address@hidden>
> ---
>  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 <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]