qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 1/2] virtio_net: virtio_net_tx_complete() stop flush new packe


From: Xuan Zhuo
Subject: [PATCH v2 1/2] virtio_net: virtio_net_tx_complete() stop flush new packets for purge operation
Date: Mon, 6 Feb 2023 11:21:04 +0800

For async tx, virtio_net_tx_complete() is called when purge or flush
operation is done. But for purge operation, we should not try to flush
new packet from tx queue. The purge operation means we will stop the
queue soon.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
 hw/net/virtio-net.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 3ae909041a..6daa1e5ac1 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2601,21 +2601,25 @@ static void virtio_net_tx_complete(NetClientState *nc, 
ssize_t len)
     q->async_tx.elem = NULL;
 
     virtio_queue_set_notification(q->tx_vq, 1);
-    ret = virtio_net_flush_tx(q);
-    if (ret >= n->tx_burst) {
-        /*
-         * the flush has been stopped by tx_burst
-         * we will not receive notification for the
-         * remainining part, so re-schedule
-         */
-        virtio_queue_set_notification(q->tx_vq, 0);
-        if (q->tx_bh) {
-            qemu_bh_schedule(q->tx_bh);
-        } else {
-            timer_mod(q->tx_timer,
-                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout);
+
+    /* len == 0 means purge, we should not flush new tx packets. */
+    if (len) {
+        ret = virtio_net_flush_tx(q);
+        if (ret >= n->tx_burst) {
+            /*
+             * the flush has been stopped by tx_burst
+             * we will not receive notification for the
+             * remainining part, so re-schedule
+             */
+            virtio_queue_set_notification(q->tx_vq, 0);
+            if (q->tx_bh) {
+                qemu_bh_schedule(q->tx_bh);
+            } else {
+                timer_mod(q->tx_timer,
+                          qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 
n->tx_timeout);
+            }
+            q->tx_waiting = 1;
         }
-        q->tx_waiting = 1;
     }
 }
 
-- 
2.32.0.3.g01195cf9f




reply via email to

[Prev in Thread] Current Thread [Next in Thread]