Patch "mlxbf_gige: fix receive packet race condition" has been added to the 6.1-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

    mlxbf_gige: fix receive packet race condition

to the 6.1-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:
     mlxbf_gige-fix-receive-packet-race-condition.patch
and it can be found in the queue-6.1 subdirectory.

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



commit e38ef647ff2cf5958850b2c4b30eebe83d34dcaf
Author: David Thompson <davthompson@xxxxxxxxxx>
Date:   Wed Dec 20 18:47:39 2023 -0500

    mlxbf_gige: fix receive packet race condition
    
    [ Upstream commit dcea1bd45e6d111cc8fc1aaefa7e31694089bda3 ]
    
    Under heavy traffic, the BlueField Gigabit interface can
    become unresponsive. This is due to a possible race condition
    in the mlxbf_gige_rx_packet function, where the function exits
    with producer and consumer indices equal but there are remaining
    packet(s) to be processed. In order to prevent this situation,
    read receive consumer index *before* the HW replenish so that
    the mlxbf_gige_rx_packet function returns an accurate return
    value even if a packet is received into just-replenished buffer
    prior to exiting this routine. If the just-replenished buffer
    is received and occupies the last RX ring entry, the interface
    would not recover and instead would encounter RX packet drops
    related to internal buffer shortages since the driver RX logic
    is not being triggered to drain the RX ring. This patch will
    address and prevent this "ring full" condition.
    
    Fixes: f92e1869d74e ("Add Mellanox BlueField Gigabit Ethernet driver")
    Reviewed-by: Asmaa Mnebhi <asmaa@xxxxxxxxxx>
    Signed-off-by: David Thompson <davthompson@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
index 0d5a41a2ae010..227d01cace3f0 100644
--- a/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
+++ b/drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c
@@ -267,6 +267,13 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts)
 		priv->stats.rx_truncate_errors++;
 	}
 
+	/* Read receive consumer index before replenish so that this routine
+	 * returns accurate return value even if packet is received into
+	 * just-replenished buffer prior to exiting this routine.
+	 */
+	rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI);
+	rx_ci_rem = rx_ci % priv->rx_q_entries;
+
 	/* Let hardware know we've replenished one buffer */
 	rx_pi++;
 
@@ -279,8 +286,6 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts)
 	rx_pi_rem = rx_pi % priv->rx_q_entries;
 	if (rx_pi_rem == 0)
 		priv->valid_polarity ^= 1;
-	rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI);
-	rx_ci_rem = rx_ci % priv->rx_q_entries;
 
 	if (skb)
 		netif_receive_skb(skb);




[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