Skip to content

Commit dcea1bd

Browse files
dthompsodavem330
authored andcommitted
mlxbf_gige: fix receive packet race condition
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: f92e186 ("Add Mellanox BlueField Gigabit Ethernet driver") Reviewed-by: Asmaa Mnebhi <asmaa@nvidia.com> Signed-off-by: David Thompson <davthompson@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 97417cd commit dcea1bd

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,13 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts)
267267
priv->stats.rx_truncate_errors++;
268268
}
269269

270+
/* Read receive consumer index before replenish so that this routine
271+
* returns accurate return value even if packet is received into
272+
* just-replenished buffer prior to exiting this routine.
273+
*/
274+
rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI);
275+
rx_ci_rem = rx_ci % priv->rx_q_entries;
276+
270277
/* Let hardware know we've replenished one buffer */
271278
rx_pi++;
272279

@@ -279,8 +286,6 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts)
279286
rx_pi_rem = rx_pi % priv->rx_q_entries;
280287
if (rx_pi_rem == 0)
281288
priv->valid_polarity ^= 1;
282-
rx_ci = readq(priv->base + MLXBF_GIGE_RX_CQE_PACKET_CI);
283-
rx_ci_rem = rx_ci % priv->rx_q_entries;
284289

285290
if (skb)
286291
netif_receive_skb(skb);

0 commit comments

Comments
 (0)