Tested-by: R, Ramu <[email protected]>
-----Original Message-----
From: Intel-wired-lan <[email protected]> On Behalf Of
Alexander Lobakin
Sent: Tuesday, June 24, 2025 10:15 PM
To: [email protected]
Cc: Lobakin, Aleksander <[email protected]>; Kubiak, Michal
<[email protected]>; Fijalkowski, Maciej <[email protected]>;
Nguyen, Anthony L <[email protected]>; Kitszel, Przemyslaw
<[email protected]>; Andrew Lunn <[email protected]>; David S.
Miller <[email protected]>; Eric Dumazet <[email protected]>; Jakub
Kicinski <[email protected]>; Paolo Abeni <[email protected]>; Alexei Starovoitov
<[email protected]>; Daniel Borkmann <[email protected]>; Simon Horman
<[email protected]>; NXNE CNSE OSDT ITP Upstreaming
<[email protected]>; [email protected];
[email protected]; [email protected]
Subject: [Intel-wired-lan] [PATCH iwl-next v2 01/12] idpf: fix Rx descriptor
ready check barrier in splitq
No idea what the current barrier position was meant for. At that point, nothing
is read from the descriptor, only the pointer to the actual one is fetched.
The correct barrier usage here is after the generation check, so that only the
first qword is read if the descriptor is not yet ready and we need to stop
polling. Debatable on coherent DMA as the Rx descriptor size is <= cacheline
size, but anyway, the current barrier position only makes the codegen worse.
Fixes: 3a8845af66ed ("idpf: add RX splitq napi poll support")
Reviewed-by: Maciej Fijalkowski <[email protected]>
Signed-off-by: Alexander Lobakin <[email protected]>
---
drivers/net/ethernet/intel/idpf/idpf_txrx.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index cef9dfb877e8..0ba766fe4f26 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -3376,18 +3376,14 @@ static int idpf_rx_splitq_clean(struct idpf_rx_queue
*rxq, int budget)
/* get the Rx desc from Rx queue based on 'next_to_clean' */
rx_desc = &rxq->rx[ntc].flex_adv_nic_3_wb;
- /* This memory barrier is needed to keep us from reading
- * any other fields out of the rx_desc
- */
- dma_rmb();
-
/* if the descriptor isn't done, no work yet to do */
gen_id = le16_get_bits(rx_desc->pktlen_gen_bufq_id,
VIRTCHNL2_RX_FLEX_DESC_ADV_GEN_M);
-
if (idpf_queue_has(GEN_CHK, rxq) != gen_id)
break;
+ dma_rmb();
+
rxdid = FIELD_GET(VIRTCHNL2_RX_FLEX_DESC_ADV_RXDID_M,
rx_desc->rxdid_ucast);
if (rxdid != VIRTCHNL2_RXDID_2_FLEX_SPLITQ) {
--
2.49.0