All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: "Eugenio Pérez" <eperezma@redhat.com>, qemu-devel@nongnu.org
Cc: Harpreet Singh Anand <hanand@xilinx.com>,
	Stefano Garzarella <sgarzare@redhat.com>,
	Laurent Vivier <lvivier@redhat.com>, Eli Cohen <eli@mellanox.com>,
	Parav Pandit <parav@mellanox.com>,
	Markus Armbruster <armbru@redhat.com>,
	Eric Blake <eblake@redhat.com>,
	Zhu Lingshan <lingshan.zhu@intel.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>, Cindy Lu <lulu@redhat.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Liuxiangdong <liuxiangdong5@huawei.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	"Gonglei (Arei)" <arei.gonglei@huawei.com>,
	Gautam Dawar <gdawar@xilinx.com>
Subject: Re: [RFC PATCH 09/12] vdpa: Extract vhost_vdpa_net_svq_add from vhost_vdpa_net_handle_ctrl_avail
Date: Mon, 18 Jul 2022 16:53:25 +0800	[thread overview]
Message-ID: <56637ea3-1875-9cd4-d455-9060309b8e3b@redhat.com> (raw)
In-Reply-To: <20220716113407.2730331-10-eperezma@redhat.com>


在 2022/7/16 19:34, Eugenio Pérez 写道:
> So we can reuse to inject state messages.
>
> Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
> ---
>   net/vhost-vdpa.c | 89 +++++++++++++++++++++++++++---------------------
>   1 file changed, 51 insertions(+), 38 deletions(-)
>
> diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
> index 211bd0468b..aaae51a778 100644
> --- a/net/vhost-vdpa.c
> +++ b/net/vhost-vdpa.c
> @@ -334,6 +334,54 @@ static bool vhost_vdpa_net_cvq_map_elem(VhostVDPAState *s,
>       return true;
>   }
>   
> +static virtio_net_ctrl_ack vhost_vdpa_net_svq_add(VhostShadowVirtqueue *svq,
> +                                               const struct iovec *dev_buffers)


The name should be tweaked since it is used only for cvq.


> +{
> +    /* in buffer used for device model */
> +    virtio_net_ctrl_ack status;
> +    const struct iovec in = {
> +        .iov_base = &status,
> +        .iov_len = sizeof(status),
> +    };
> +    size_t dev_written;
> +    int r;
> +    void *unused = (void *)1;
> +
> +    r = vhost_svq_add(svq, &dev_buffers[0], 1, &dev_buffers[1], 1, unused);
> +    if (unlikely(r != 0)) {
> +        if (unlikely(r == -ENOSPC)) {
> +            qemu_log_mask(LOG_GUEST_ERROR, "%s: No space on device queue\n",
> +                          __func__);
> +        }
> +        return VIRTIO_NET_ERR;
> +    }
> +
> +    /*
> +     * We can poll here since we've had BQL from the time we sent the
> +     * descriptor. Also, we need to take the answer before SVQ pulls by itself,
> +     * when BQL is released
> +     */


This reminds me that, do we need a upper limit of the time on the 
polling here. (Avoid taking BQL for too long time).

Thanks


> +    dev_written = vhost_svq_poll(svq);
> +    if (unlikely(dev_written < sizeof(status))) {
> +        error_report("Insufficient written data (%zu)", dev_written);
> +        return VIRTIO_NET_ERR;
> +    }
> +
> +    memcpy(&status, dev_buffers[1].iov_base, sizeof(status));
> +    if (status != VIRTIO_NET_OK) {
> +        return VIRTIO_NET_ERR;
> +    }
> +
> +    status = VIRTIO_NET_ERR;
> +    virtio_net_handle_ctrl_iov(svq->vdev, &in, 1, dev_buffers, 1);
> +    if (status != VIRTIO_NET_OK) {
> +        error_report("Bad CVQ processing in model");
> +        return VIRTIO_NET_ERR;
> +    }
> +
> +    return VIRTIO_NET_OK;
> +}
> +
>   static int vhost_vdpa_start_control_svq(struct vhost_vdpa *v)
>   {
>       struct vhost_vring_state state = {
> @@ -392,19 +440,13 @@ static int vhost_vdpa_net_handle_ctrl_avail(VhostShadowVirtqueue *svq,
>                                               void *opaque)
>   {
>       VhostVDPAState *s = opaque;
> -    size_t in_len, dev_written;
> +    size_t in_len;
>       virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
>       /* out and in buffers sent to the device */
>       struct iovec dev_buffers[2] = {
>           { .iov_base = s->cvq_cmd_out_buffer },
>           { .iov_base = s->cvq_cmd_in_buffer },
>       };
> -    /* in buffer used for device model */
> -    const struct iovec in = {
> -        .iov_base = &status,
> -        .iov_len = sizeof(status),
> -    };
> -    int r;
>       bool ok;
>   
>       ok = vhost_vdpa_net_cvq_map_elem(s, elem, dev_buffers);
> @@ -417,36 +459,7 @@ static int vhost_vdpa_net_handle_ctrl_avail(VhostShadowVirtqueue *svq,
>           goto out;
>       }
>   
> -    r = vhost_svq_add(svq, &dev_buffers[0], 1, &dev_buffers[1], 1, elem);
> -    if (unlikely(r != 0)) {
> -        if (unlikely(r == -ENOSPC)) {
> -            qemu_log_mask(LOG_GUEST_ERROR, "%s: No space on device queue\n",
> -                          __func__);
> -        }
> -        goto out;
> -    }
> -
> -    /*
> -     * We can poll here since we've had BQL from the time we sent the
> -     * descriptor. Also, we need to take the answer before SVQ pulls by itself,
> -     * when BQL is released
> -     */
> -    dev_written = vhost_svq_poll(svq);
> -    if (unlikely(dev_written < sizeof(status))) {
> -        error_report("Insufficient written data (%zu)", dev_written);
> -        goto out;
> -    }
> -
> -    memcpy(&status, dev_buffers[1].iov_base, sizeof(status));
> -    if (status != VIRTIO_NET_OK) {
> -        goto out;
> -    }
> -
> -    status = VIRTIO_NET_ERR;
> -    virtio_net_handle_ctrl_iov(svq->vdev, &in, 1, dev_buffers, 1);
> -    if (status != VIRTIO_NET_OK) {
> -        error_report("Bad CVQ processing in model");
> -    }
> +    status = vhost_vdpa_net_svq_add(svq, dev_buffers);
>   
>   out:
>       in_len = iov_from_buf(elem->in_sg, elem->in_num, 0, &status,
> @@ -462,7 +475,7 @@ out:
>       if (dev_buffers[1].iov_base) {
>           vhost_vdpa_cvq_unmap_buf(&s->vhost_vdpa, dev_buffers[1].iov_base);
>       }
> -    return r;
> +    return status == VIRTIO_NET_OK ? 0 : 1;
>   }
>   
>   static const VhostShadowVirtqueueOps vhost_vdpa_net_svq_ops = {



  reply	other threads:[~2022-07-18  8:55 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-16 11:33 [RFC PATCH 00/12] NIC vhost-vdpa state restore via Shadow CVQ Eugenio Pérez
2022-07-16 11:33 ` [RFC PATCH 01/12] vhost: Get vring base from vq, not svq Eugenio Pérez
2022-07-18  5:48   ` Jason Wang
2022-07-18  7:14     ` Eugenio Perez Martin
2022-07-16 11:33 ` [RFC PATCH 02/12] vhost: Move SVQ queue rewind to the destination Eugenio Pérez
2022-07-18  5:49   ` Jason Wang
2022-07-18  7:20     ` Eugenio Perez Martin
2022-07-16 11:33 ` [RFC PATCH 03/12] vdpa: Small rename of error labels Eugenio Pérez
2022-07-18  5:50   ` Jason Wang
2022-07-18  7:21     ` Eugenio Perez Martin
2022-07-16 11:33 ` [RFC PATCH 04/12] vdpa: delay set_vring_ready after DRIVER_OK Eugenio Pérez
2022-07-18  6:34   ` Jason Wang
2022-07-18  6:57     ` Eugenio Perez Martin
2022-07-16 11:34 ` [RFC PATCH 05/12] vhost: stop transfer elem ownership in vhost_handle_guest_kick Eugenio Pérez
2022-07-16 11:34 ` [RFC PATCH 06/12] vhost: Use opaque data in SVQDescState Eugenio Pérez
2022-07-16 11:34 ` [RFC PATCH 07/12] vhost: Add VhostVDPAStartOp operation Eugenio Pérez
2022-07-17 11:01   ` Eugenio Perez Martin
2022-07-18  8:50   ` Jason Wang
2022-07-18  9:08     ` Eugenio Perez Martin
2022-07-16 11:34 ` [RFC PATCH 08/12] vdpa: Add vhost_vdpa_start_control_svq Eugenio Pérez
2022-07-16 11:34 ` [RFC PATCH 09/12] vdpa: Extract vhost_vdpa_net_svq_add from vhost_vdpa_net_handle_ctrl_avail Eugenio Pérez
2022-07-18  8:53   ` Jason Wang [this message]
2022-07-18 10:15     ` Eugenio Perez Martin
2022-07-16 11:34 ` [RFC PATCH 10/12] vdpa: Make vhost_vdpa_net_cvq_map_elem accept any out sg Eugenio Pérez
2022-07-16 11:34 ` [RFC PATCH 11/12] vdpa: Add virtio-net mac address via CVQ at start Eugenio Pérez
2022-07-18  8:55   ` Jason Wang
2022-07-18  9:07     ` Eugenio Perez Martin
2022-07-16 11:34 ` [RFC PATCH 12/12] vdpa: Delete CVQ migration blocker Eugenio Pérez

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=56637ea3-1875-9cd4-d455-9060309b8e3b@redhat.com \
    --to=jasowang@redhat.com \
    --cc=arei.gonglei@huawei.com \
    --cc=armbru@redhat.com \
    --cc=cohuck@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eli@mellanox.com \
    --cc=eperezma@redhat.com \
    --cc=gdawar@xilinx.com \
    --cc=hanand@xilinx.com \
    --cc=lingshan.zhu@intel.com \
    --cc=liuxiangdong5@huawei.com \
    --cc=lulu@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=parav@mellanox.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sgarzare@redhat.com \
    --cc=stefanha@redhat.com \
    /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.