All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pierre Morel <pmorel@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] virtio dataplane: adapt dataplane for	virtio Version 1
Date: Wed, 26 Aug 2015 13:51:19 +0200	[thread overview]
Message-ID: <55DDA837.1020404@linux.vnet.ibm.com> (raw)
In-Reply-To: <20150826132939.42badc6f@bahia.local>



On 08/26/2015 01:29 PM, Greg Kurz wrote:
> On Tue, 25 Aug 2015 12:33:30 +0200
> Pierre Morel <pmorel@linux.vnet.ibm.com> wrote:
>
>> Let dataplane allocate different region for the desc/avail/used
>> ring regions.
>>
>> Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
>> ---
> Great ! It works !
>
> Since we end up with 3 blocks of code that are identical save the ring
> region name, we can simplify further with a macro. I have pasted a
> patch below. You may fold it directly into your patch if people agree,
>
> In any case, you have:
>
> Acked-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> Tested-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
>
> Merci Pierre !
>
> --
> Greg
It saves a lot of LOCs, thanks, (and also for review and test)
I apply the patch and send a v2

Pierre

>>   hw/virtio/dataplane/vring.c         |   54 ++++++++++++++++++++++++++++------
>>   include/hw/virtio/dataplane/vring.h |    4 ++-
>>   2 files changed, 47 insertions(+), 11 deletions(-)
>>
>> diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
>> index 07fd69c..49d783b 100644
>> --- a/hw/virtio/dataplane/vring.c
>> +++ b/hw/virtio/dataplane/vring.c
>> @@ -67,22 +67,46 @@ 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);
>> +    hwaddr vring_addr;
>> +    hwaddr vring_size;
>>       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);
>> +    vring_addr = virtio_queue_get_desc_addr(vdev, n);
>> +    vring_size = virtio_queue_get_desc_size(vdev, n);
>> +    vring_ptr = vring_map(&vring->mr_desc, 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;
>> +        error_report("Failed to map vring desc "
>> +                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
>> +                 vring_addr, vring_size);
>> +        goto out_err_desc;
>>       }
>> +    vr->desc = vring_ptr;
>>
>> -    vring_init(&vring->vr, virtio_queue_get_num(vdev, n), vring_ptr, 4096);
>> +    vring_addr = virtio_queue_get_avail_addr(vdev, n);
>> +    vring_size = virtio_queue_get_avail_size(vdev, n);
>> +    vring_ptr = vring_map(&vring->mr_avail, vring_addr, vring_size, true);
>> +    if (!vring_ptr) {
>> +        error_report("Failed to map vring avail "
>> +                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
>> +                 vring_addr, vring_size);
>> +        goto out_err_avail;
>> +    }
>> +    vr->avail = vring_ptr;
>> +
>> +    vring_addr = virtio_queue_get_used_addr(vdev, n);
>> +    vring_size = virtio_queue_get_used_size(vdev, n);
>> +    vring_ptr = vring_map(&vring->mr_used, vring_addr, vring_size, true);
>> +    if (!vring_ptr) {
>> +        error_report("Failed to map vring used "
>> +                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
>> +                 vring_addr, vring_size);
>> +        goto out_err_used;
>> +    }
>> +    vr->used = vring_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 +116,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 +131,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 */
> --- a/hw/virtio/dataplane/vring.c
> +++ b/hw/virtio/dataplane/vring.c
> @@ -64,49 +64,34 @@ static void vring_unmap(void *buffer, bool is_write)
>       memory_region_unref(mr);
>   }
>
> +#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;                                                    \
> +    }
> +
>   /* Map the guest's vring to host memory */
>   bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
>   {
> -    hwaddr vring_addr;
> -    hwaddr vring_size;
> -    void *vring_ptr;
>       struct vring *vr = &vring->vr;
>
>       vring->broken = false;
>       vr->num = virtio_queue_get_num(vdev, n);
>
> -    vring_addr = virtio_queue_get_desc_addr(vdev, n);
> -    vring_size = virtio_queue_get_desc_size(vdev, n);
> -    vring_ptr = vring_map(&vring->mr_desc, vring_addr, vring_size, true);
> -    if (!vring_ptr) {
> -        error_report("Failed to map vring desc "
> -                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
> -                 vring_addr, vring_size);
> -        goto out_err_desc;
> -    }
> -    vr->desc = vring_ptr;
> -
> -    vring_addr = virtio_queue_get_avail_addr(vdev, n);
> -    vring_size = virtio_queue_get_avail_size(vdev, n);
> -    vring_ptr = vring_map(&vring->mr_avail, vring_addr, vring_size, true);
> -    if (!vring_ptr) {
> -        error_report("Failed to map vring avail "
> -                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
> -                 vring_addr, vring_size);
> -        goto out_err_avail;
> -    }
> -    vr->avail = vring_ptr;
> -
> -    vring_addr = virtio_queue_get_used_addr(vdev, n);
> -    vring_size = virtio_queue_get_used_size(vdev, n);
> -    vring_ptr = vring_map(&vring->mr_used, vring_addr, vring_size, true);
> -    if (!vring_ptr) {
> -        error_report("Failed to map vring used "
> -                 "addr %#" HWADDR_PRIx " size %" HWADDR_PRIu,
> -                 vring_addr, vring_size);
> -        goto out_err_used;
> -    }
> -    vr->used = vring_ptr;
> +    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);
>
>
>

  reply	other threads:[~2015-08-26 11:52 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-25 10:33 [Qemu-devel] [PATCH] virtio dataplane: adapt dataplane for virtio Version 1 Pierre Morel
2015-08-26 11:29 ` Greg Kurz
2015-08-26 11:51   ` Pierre Morel [this message]
2015-08-26 12:50 ` Stefan Hajnoczi
2015-08-26 12:55   ` Cornelia Huck
2015-09-03 17:08     ` Stefan Hajnoczi
2015-09-04  6:37       ` Cornelia Huck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55DDA837.1020404@linux.vnet.ibm.com \
    --to=pmorel@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.