From bfd2b47a7cebe8cc7a1d2a9faea60a6eada5c225 Mon Sep 17 00:00:00 2001 From: Xuan Zhuo Date: Thu, 18 Sep 2025 16:34:25 +0800 Subject: [PATCH] anolis: virtio-net: remove BQL ANBZ: #25130 After testing in a wider range of scenarios, we found that BQL can lead to performance degradation in certain cases and is more likely to cause latency when working on Aliyun. Therefore, we have decided to remove the BQL feature. Signed-off-by: Xuan Zhuo --- drivers/net/virtio_net.c | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9fab6545859b..b3d591397ba2 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -629,7 +629,6 @@ static void __free_old_xmit(struct send_queue *sq, struct netdev_queue *txq, break; } } - netdev_tx_completed_queue(txq, stats->napi_packets, stats->napi_bytes); } static void virtnet_free_old_xmit(struct send_queue *sq, @@ -3210,7 +3209,7 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget) return 0; } -static int xmit_skb(struct send_queue *sq, struct sk_buff *skb, bool orphan) +static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) { struct virtio_net_hdr_mrg_rxbuf *hdr; const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; @@ -3255,8 +3254,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb, bool orphan) num_sg++; } - return virtnet_add_outbuf(sq, num_sg, skb, - orphan ? VIRTNET_XMIT_TYPE_SKB_ORPHAN : VIRTNET_XMIT_TYPE_SKB); + return virtnet_add_outbuf(sq, num_sg, skb, VIRTNET_XMIT_TYPE_SKB); } static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -3266,9 +3264,8 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) struct send_queue *sq = &vi->sq[qnum]; int err; struct netdev_queue *txq = netdev_get_tx_queue(dev, qnum); - bool xmit_more = netdev_xmit_more(); + bool kick = !netdev_xmit_more(); bool use_napi = sq->napi.weight; - bool kick; /* Free up any pending old buffers before queueing new ones. */ do { @@ -3277,14 +3274,14 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) free_old_xmit(sq, txq, false); - } while (use_napi && !xmit_more && + } while (use_napi && kick && unlikely(!virtqueue_enable_cb_delayed(sq->vq))); /* timestamp packet in software */ skb_tx_timestamp(skb); /* Try to transmit */ - err = xmit_skb(sq, skb, !use_napi); + err = xmit_skb(sq, skb); /* This should not happen! */ if (unlikely(err)) { @@ -3306,9 +3303,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) check_sq_full_and_disable(vi, dev, sq); - kick = use_napi ? __netdev_tx_sent_queue(txq, skb->len, xmit_more) : - !xmit_more || netif_xmit_stopped(txq); - if (kick) { + if (kick || netif_xmit_stopped(txq)) { if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) { u64_stats_update_begin(&sq->stats.syncp); u64_stats_inc(&sq->stats.kicks); @@ -6270,10 +6265,6 @@ static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf) static void virtnet_sq_free_unused_buf_done(struct virtqueue *vq) { - struct virtnet_info *vi = vq->vdev->priv; - int i = vq2txq(vq); - - netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); } static void free_unused_bufs(struct virtnet_info *vi) @@ -7013,20 +7004,11 @@ static int virtnet_probe(struct virtio_device *vdev) static void remove_vq_common(struct virtnet_info *vi) { - int i; - virtio_reset_device(vi->vdev); /* Free unused buffers in both send and recv, if any. */ free_unused_bufs(vi); - /* - * Rule of thumb is netdev_tx_reset_queue() should follow any - * skb freeing not followed by netdev_tx_completed_queue() - */ - for (i = 0; i < vi->max_queue_pairs; i++) - netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); - free_receive_bufs(vi); free_receive_page_frags(vi); -- Gitee