[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for-4.0 3/6] libvhost-user: Introduce vu_queue_m
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH for-4.0 3/6] libvhost-user: Introduce vu_queue_map_desc() |
Date: |
Thu, 6 Dec 2018 11:16:32 +0400 |
On Thu, Dec 6, 2018 at 10:40 AM <address@hidden> wrote:
>
> From: Xie Yongji <address@hidden>
>
> Introduce vu_queue_map_desc() which should be
> independent with vu_queue_pop();
>
> Signed-off-by: Xie Yongji <address@hidden>
> Signed-off-by: Zhang Yu <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
> ---
> contrib/libvhost-user/libvhost-user.c | 86 +++++++++++++++------------
> 1 file changed, 49 insertions(+), 37 deletions(-)
>
> diff --git a/contrib/libvhost-user/libvhost-user.c
> b/contrib/libvhost-user/libvhost-user.c
> index a6b46cdc03..4432bd8bb4 100644
> --- a/contrib/libvhost-user/libvhost-user.c
> +++ b/contrib/libvhost-user/libvhost-user.c
> @@ -1853,49 +1853,20 @@ virtqueue_alloc_element(size_t sz,
> return elem;
> }
>
> -void *
> -vu_queue_pop(VuDev *dev, VuVirtq *vq, size_t sz)
> +static void *
> +vu_queue_map_desc(VuDev *dev, VuVirtq *vq, unsigned int idx, size_t sz)
> {
> - unsigned int i, head, max, desc_len;
> + struct vring_desc *desc = vq->vring.desc;
> uint64_t desc_addr, read_len;
> + unsigned int desc_len;
> + unsigned int max = vq->vring.num;
> + unsigned int i = idx;
> VuVirtqElement *elem;
> - unsigned out_num, in_num;
> + unsigned int out_num = 0, in_num = 0;
> struct iovec iov[VIRTQUEUE_MAX_SIZE];
> struct vring_desc desc_buf[VIRTQUEUE_MAX_SIZE];
> - struct vring_desc *desc;
> int rc;
>
> - if (unlikely(dev->broken) ||
> - unlikely(!vq->vring.avail)) {
> - return NULL;
> - }
> -
> - if (vu_queue_empty(dev, vq)) {
> - return NULL;
> - }
> - /* Needed after virtio_queue_empty(), see comment in
> - * virtqueue_num_heads(). */
> - smp_rmb();
> -
> - /* When we start there are none of either input nor output. */
> - out_num = in_num = 0;
> -
> - max = vq->vring.num;
> - if (vq->inuse >= vq->vring.num) {
> - vu_panic(dev, "Virtqueue size exceeded");
> - return NULL;
> - }
> -
> - if (!virtqueue_get_head(dev, vq, vq->last_avail_idx++, &head)) {
> - return NULL;
> - }
> -
> - if (vu_has_feature(dev, VIRTIO_RING_F_EVENT_IDX)) {
> - vring_set_avail_event(vq, vq->last_avail_idx);
> - }
> -
> - i = head;
> - desc = vq->vring.desc;
> if (desc[i].flags & VRING_DESC_F_INDIRECT) {
> if (desc[i].len % sizeof(struct vring_desc)) {
> vu_panic(dev, "Invalid size for indirect buffer table");
> @@ -1947,12 +1918,13 @@ vu_queue_pop(VuDev *dev, VuVirtq *vq, size_t sz)
> } while (rc == VIRTQUEUE_READ_DESC_MORE);
>
> if (rc == VIRTQUEUE_READ_DESC_ERROR) {
> + vu_panic(dev, "read descriptor error");
> return NULL;
> }
>
> /* Now copy what we have collected and mapped */
> elem = virtqueue_alloc_element(sz, out_num, in_num);
> - elem->index = head;
> + elem->index = idx;
> for (i = 0; i < out_num; i++) {
> elem->out_sg[i] = iov[i];
> }
> @@ -1960,6 +1932,46 @@ vu_queue_pop(VuDev *dev, VuVirtq *vq, size_t sz)
> elem->in_sg[i] = iov[out_num + i];
> }
>
> + return elem;
> +}
> +
> +void *
> +vu_queue_pop(VuDev *dev, VuVirtq *vq, size_t sz)
> +{
> + unsigned int head;
> + VuVirtqElement *elem;
> +
> + if (unlikely(dev->broken) ||
> + unlikely(!vq->vring.avail)) {
> + return NULL;
> + }
> +
> + if (vu_queue_empty(dev, vq)) {
> + return NULL;
> + }
> + /* Needed after virtio_queue_empty(), see comment in
> + * virtqueue_num_heads(). */
> + smp_rmb();
> +
> + if (vq->inuse >= vq->vring.num) {
> + vu_panic(dev, "Virtqueue size exceeded");
> + return NULL;
> + }
> +
> + if (!virtqueue_get_head(dev, vq, vq->last_avail_idx++, &head)) {
> + return NULL;
> + }
> +
> + if (vu_has_feature(dev, VIRTIO_RING_F_EVENT_IDX)) {
> + vring_set_avail_event(vq, vq->last_avail_idx);
> + }
> +
> + elem = vu_queue_map_desc(dev, vq, head, sz);
> +
> + if (!elem) {
> + return NULL;
> + }
> +
> vq->inuse++;
>
> return elem;
> --
> 2.17.1
>
>
--
Marc-André Lureau
- [Qemu-devel] [PATCH for-4.0 0/6] vhost-user-blk: Add support for backend reconnecting, elohimes, 2018/12/06
- [Qemu-devel] [PATCH for-4.0 1/6] char-socket: Enable "wait" option for client mode, elohimes, 2018/12/06
- [Qemu-devel] [PATCH for-4.0 3/6] libvhost-user: Introduce vu_queue_map_desc(), elohimes, 2018/12/06
- Re: [Qemu-devel] [PATCH for-4.0 3/6] libvhost-user: Introduce vu_queue_map_desc(),
Marc-André Lureau <=
- [Qemu-devel] [PATCH for-4.0 2/6] vhost-user: Add shared memory to record inflight I/O, elohimes, 2018/12/06
- [Qemu-devel] [PATCH for-4.0 4/6] libvhost-user: Support recording inflight I/O in shared memory, elohimes, 2018/12/06
- [Qemu-devel] [PATCH for-4.0 5/6] vhost-user-blk: Add support for reconnecting backend, elohimes, 2018/12/06
- [Qemu-devel] [PATCH for-4.0 6/6] contrib/vhost-user-blk: enable inflight I/O recording, elohimes, 2018/12/06
- Re: [Qemu-devel] [PATCH for-4.0 0/6] vhost-user-blk: Add support for backend reconnecting, Marc-André Lureau, 2018/12/06