Patch "net: fec: increase the size of tx ring and update tx_wake_threshold" has been added to the 6.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    net: fec: increase the size of tx ring and update tx_wake_threshold

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-fec-increase-the-size-of-tx-ring-and-update-tx_w.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 04b9c610dfeb96ae1fa770e036bf8e8d46994305
Author: Wei Fang <wei.fang@xxxxxxx>
Date:   Thu Jul 6 16:10:11 2023 +0800

    net: fec: increase the size of tx ring and update tx_wake_threshold
    
    [ Upstream commit 56b3c6ba53d0e9649ea5e4089b39cadde13aaef8 ]
    
    When the XDP feature is enabled and with heavy XDP frames to be
    transmitted, there is a considerable probability that available
    tx BDs are insufficient. This will lead to some XDP frames to be
    discarded and the "NOT enough BD for SG!" error log will appear
    in the console (as shown below).
    
    [  160.013112] fec 30be0000.ethernet eth0: NOT enough BD for SG!
    [  160.023116] fec 30be0000.ethernet eth0: NOT enough BD for SG!
    [  160.028926] fec 30be0000.ethernet eth0: NOT enough BD for SG!
    [  160.038946] fec 30be0000.ethernet eth0: NOT enough BD for SG!
    [  160.044758] fec 30be0000.ethernet eth0: NOT enough BD for SG!
    
    In the case of heavy XDP traffic, sometimes the speed of recycling
    tx BDs may be slower than the speed of sending XDP frames. There
    may be several specific reasons, such as the interrupt is not
    responsed in time, the efficiency of the NAPI callback function is
    too low due to all the queues (tx queues and rx queues) share the
    same NAPI, and so on.
    
    After trying various methods, I think that increase the size of tx
    BD ring is simple and effective. Maybe the best resolution is that
    allocate NAPI for each queue to improve the efficiency of the NAPI
    callback, but this change is a bit big and I didn't try this method.
    Perheps this method will be implemented in a future patch.
    
    This patch also updates the tx_wake_threshold of tx ring which is
    related to the size of tx ring in the previous logic. Otherwise,
    the tx_wake_threshold will be too high (403 BDs), which is more
    likely to impact the slow path in the case of heavy XDP traffic,
    because XDP path and slow path share the tx BD rings. According
    to Jakub's suggestion, the tx_wake_threshold is at least equal to
    tx_stop_threshold + 2 * MAX_SKB_FRAGS, if a queue of hundreds of
    entries is overflowing, we should be able to apply a hysteresis
    of a few tens of entries.
    
    Fixes: 6d6b39f180b8 ("net: fec: add initial XDP support")
    Signed-off-by: Wei Fang <wei.fang@xxxxxxx>
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 8c0226d061fec..63a053dea819d 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -355,7 +355,7 @@ struct bufdesc_ex {
 #define RX_RING_SIZE		(FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
 #define FEC_ENET_TX_FRSIZE	2048
 #define FEC_ENET_TX_FRPPG	(PAGE_SIZE / FEC_ENET_TX_FRSIZE)
-#define TX_RING_SIZE		512	/* Must be power of two */
+#define TX_RING_SIZE		1024	/* Must be power of two */
 #define TX_RING_MOD_MASK	511	/*   for this to work */
 
 #define BD_ENET_RX_INT		0x00800000
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index e6ed36e5daefa..7659888a96917 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -3347,8 +3347,7 @@ static int fec_enet_alloc_queue(struct net_device *ndev)
 		fep->total_tx_ring_size += fep->tx_queue[i]->bd.ring_size;
 
 		txq->tx_stop_threshold = FEC_MAX_SKB_DESCS;
-		txq->tx_wake_threshold =
-			(txq->bd.ring_size - txq->tx_stop_threshold) / 2;
+		txq->tx_wake_threshold = FEC_MAX_SKB_DESCS + 2 * MAX_SKB_FRAGS;
 
 		txq->tso_hdrs = dma_alloc_coherent(&fep->pdev->dev,
 					txq->bd.ring_size * TSO_HEADER_SIZE,



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux