在 2022/8/25 16:08, Kangjie Xu 写道:
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
virtio-net and vhost-kernel implement queue reset.
Queued packets in the corresponding queue pair are flushed
or purged.
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com>
---
hw/net/virtio-net.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 27b59c0ad6..d774a3e652 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -540,6 +540,23 @@ static RxFilterInfo
*virtio_net_query_rxfilter(NetClientState *nc)
return info;
}
+static void virtio_net_queue_reset(VirtIODevice *vdev, uint32_t
queue_index)
+{
+ VirtIONet *n = VIRTIO_NET(vdev);
+ NetClientState *nc = qemu_get_subqueue(n->nic, vq2q(queue_index));
+
+ if (!nc->peer) {
+ return;
+ }
+
+ if (get_vhost_net(nc->peer) &&
+ nc->peer->info->type == NET_CLIENT_DRIVER_TAP) {
+ vhost_net_virtqueue_reset(vdev, nc, queue_index);
+ }
+
+ flush_or_purge_queued_packets(nc);
But the codes doesn't prevent the usersapce datapath from being used?
(e.g vhost=off)
E.g vhost_net_start_one() had:
if (net->nc->info->poll) {
net->nc->info->poll(net->nc, false);
}
And I will wonder if it's better to consider to:
1) factor out the per virtqueue start/stop from
vhost_net_start/stop_one()
2) simply use the helper factored out via step 1)
Thanks