qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kangjie Xu <kangjie.xu@linux.alibaba.com>
To: qemu-devel@nongnu.org
Cc: mst@redhat.com, jasowang@redhat.com, eduardo@habkost.net,
	marcel.apfelbaum@gmail.com, f4bug@amsat.org,
	wangyanan55@huawei.com, hengqi@linux.alibaba.com,
	xuanzhuo@linux.alibaba.com
Subject: [PATCH v3 11/15] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_restart()
Date: Thu, 25 Aug 2022 16:08:54 +0800	[thread overview]
Message-ID: <6c20c0a02ed0e08565bf3692cef476ba52332720.1661414345.git.kangjie.xu@linux.alibaba.com> (raw)
In-Reply-To: <cover.1661414345.git.kangjie.xu@linux.alibaba.com>

Introduce vhost_net_virtqueue_restart(), which can restart the
specific virtqueue when the vhost net started running before.
If it fails to restart the virtqueue, the device will be stopped.

Here we do not reuse vhost_net_start_one() or vhost_dev_start()
because they work at queue pair level. The mem table and features
do not change, so we can call the vhost_virtqueue_start() to
restart a specific queue.

This patch only considers the case of vhost-kernel, when
NetClientDriver is NET_CLIENT_DRIVER_TAP.

Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com>
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
 hw/net/vhost_net.c      | 52 +++++++++++++++++++++++++++++++++++++++++
 include/net/vhost_net.h |  2 ++
 2 files changed, 54 insertions(+)

diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index be51be98b3..0716f6cd96 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -536,3 +536,55 @@ void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
 
     vhost_virtqueue_unmap(&net->dev, vdev, net->dev.vqs + idx, idx);
 }
+
+int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc,
+                                int vq_index)
+{
+    VHostNetState *net = get_vhost_net(nc->peer);
+    const VhostOps *vhost_ops = net->dev.vhost_ops;
+    struct vhost_vring_file file = { };
+    int idx, r;
+
+    if (!net->dev.started) {
+        return 0;
+    }
+
+    /* should only be called after backend is connected */
+    assert(vhost_ops);
+
+    idx = vhost_ops->vhost_get_vq_index(&net->dev, vq_index);
+
+    r = vhost_virtqueue_start(&net->dev,
+                              vdev,
+                              net->dev.vqs + idx,
+                              net->dev.vq_index + idx);
+    if (r < 0) {
+        goto err_start;
+    }
+
+    if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) {
+        file.index = idx;
+        file.fd = net->backend;
+        r = vhost_net_set_backend(&net->dev, &file);
+        if (r < 0) {
+            r = -errno;
+            goto err_start;
+        }
+    }
+
+    return 0;
+
+err_start:
+    error_report("Error when restarting the queue.");
+
+    if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) {
+        file.fd = -1;
+        file.index = idx;
+        int r = vhost_net_set_backend(&net->dev, &file);
+        assert(r >= 0);
+    }
+
+    vhost_dev_stop(&net->dev, vdev);
+
+    return r;
+}
diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h
index 85d85a4957..40b9a40074 100644
--- a/include/net/vhost_net.h
+++ b/include/net/vhost_net.h
@@ -50,4 +50,6 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu);
 
 void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc,
                                int vq_index);
+int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc,
+                                int vq_index);
 #endif
-- 
2.32.0



  parent reply	other threads:[~2022-08-25  8:18 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-25  8:08 [PATCH v3 00/15] Support VIRTIO_F_RING_RESET for virtio-net, vhost-net kernel in virtio pci-modern Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 01/15] virtio: sync relevant definitions with linux Kangjie Xu
2022-09-05  4:56   ` Jason Wang
2022-08-25  8:08 ` [PATCH v3 02/15] virtio: introduce __virtio_queue_reset() Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 03/15] virtio: introduce virtio_queue_reset() Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 04/15] virtio: introduce virtio_queue_enable() Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 05/15] virtio: core: vq reset feature negotation support Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 06/15] virtio-pci: support queue reset Kangjie Xu
2022-09-05  7:59   ` Jason Wang
2022-08-25  8:08 ` [PATCH v3 07/15] virtio-pci: support queue enable Kangjie Xu
2022-09-05  8:00   ` Jason Wang
2022-08-25  8:08 ` [PATCH v3 08/15] vhost: extract the logic of unmapping the vrings and desc Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 09/15] vhost: expose vhost_virtqueue_start() Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 10/15] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_reset() Kangjie Xu
2022-09-05  8:03   ` Jason Wang
2022-09-05 10:15     ` Kangjie Xu
2022-09-06  5:24       ` Jason Wang
2022-08-25  8:08 ` Kangjie Xu [this message]
2022-09-05  8:24   ` [PATCH v3 11/15] vhost-net: vhost-kernel: introduce vhost_net_virtqueue_restart() Jason Wang
2022-09-05 10:21     ` Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 12/15] virtio-net: introduce flush_or_purge_queued_packets() Kangjie Xu
2022-09-05  8:25   ` Jason Wang
2022-08-25  8:08 ` [PATCH v3 13/15] virtio-net: support queue reset Kangjie Xu
2022-09-05  8:30   ` Jason Wang
2022-09-05 10:25     ` Kangjie Xu
2022-09-05 16:25     ` Kangjie Xu
2022-09-06  5:37       ` Jason Wang
2022-09-06  3:14     ` Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 14/15] virtio-net: support queue_enable Kangjie Xu
2022-08-25  8:08 ` [PATCH v3 15/15] vhost: vhost-kernel: enable vq reset feature Kangjie Xu
2022-09-02  1:04 ` [PATCH v3 00/15] Support VIRTIO_F_RING_RESET for virtio-net, vhost-net kernel in virtio pci-modern Kangjie Xu

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=6c20c0a02ed0e08565bf3692cef476ba52332720.1661414345.git.kangjie.xu@linux.alibaba.com \
    --to=kangjie.xu@linux.alibaba.com \
    --cc=eduardo@habkost.net \
    --cc=f4bug@amsat.org \
    --cc=hengqi@linux.alibaba.com \
    --cc=jasowang@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=wangyanan55@huawei.com \
    --cc=xuanzhuo@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).