Dear David,

Thank you for your patch.

Am 19.01.26 um 17:27 schrieb David Yang:
In idpf_net_dim(), some statistics protected by u64_stats_sync, are read
and accumulated in ignorance of possible u64_stats_fetch_retry() events.
The correct way to copy statistics is already illustrated by
idpf_add_queue_stats(). Fix this by reading them into temporary variables
first.

It’d be great if you also documented a test case.

Fixes: c2d548cad150 ("idpf: add TX splitq napi poll support")
Fixes: 3a8845af66ed ("idpf: add RX splitq napi poll support")
Signed-off-by: David Yang <[email protected]>
---
  drivers/net/ethernet/intel/idpf/idpf_txrx.c | 16 +++++++++++-----
  1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c 
b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index 97a5fe766b6b..66ba645e8b90 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -3956,7 +3956,7 @@ static void idpf_update_dim_sample(struct idpf_q_vector 
*q_vector,
  static void idpf_net_dim(struct idpf_q_vector *q_vector)
  {
        struct dim_sample dim_sample = { };
-       u64 packets, bytes;
+       u64 packets, bytes, pkts, bts;

The new variable names are ambiguous. Would _tmp or so be better?

        u32 i;
if (!IDPF_ITR_IS_DYNAMIC(q_vector->tx_intr_mode))
@@ -3968,9 +3968,12 @@ static void idpf_net_dim(struct idpf_q_vector *q_vector)
do {
                        start = u64_stats_fetch_begin(&txq->stats_sync);
-                       packets += u64_stats_read(&txq->q_stats.packets);
-                       bytes += u64_stats_read(&txq->q_stats.bytes);
+                       pkts = u64_stats_read(&txq->q_stats.packets);
+                       bts = u64_stats_read(&txq->q_stats.bytes);
                } while (u64_stats_fetch_retry(&txq->stats_sync, start));
+
+               packets += pkts;
+               bytes += bts;
        }
idpf_update_dim_sample(q_vector, &dim_sample, &q_vector->tx_dim,
@@ -3987,9 +3990,12 @@ static void idpf_net_dim(struct idpf_q_vector *q_vector)
do {
                        start = u64_stats_fetch_begin(&rxq->stats_sync);
-                       packets += u64_stats_read(&rxq->q_stats.packets);
-                       bytes += u64_stats_read(&rxq->q_stats.bytes);
+                       pkts = u64_stats_read(&rxq->q_stats.packets);
+                       bts = u64_stats_read(&rxq->q_stats.bytes);
                } while (u64_stats_fetch_retry(&rxq->stats_sync, start));
+
+               packets += pkts;
+               bytes += bts;
        }
idpf_update_dim_sample(q_vector, &dim_sample, &q_vector->rx_dim,


Kind regards,

Paul

Reply via email to