[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250630234806.10885-3-mmc@linux.ibm.com>
Date: Mon, 30 Jun 2025 16:48:04 -0700
From: Mingming Cao <mmc@...ux.ibm.com>
To: netdev@...r.kernel.org
Cc: bjking1@...ux.ibm.com, haren@...ux.ibm.com, ricklind@...ux.ibm.com,
mmc@...ux.ibm.com, Dave Marquardt <davemarq@...ux.ibm.com>
Subject: [PATCH net-next 2/4] ibmvnic: Use atomic64_t for queue stats
This patch improves the ibmvnic driver by changing the per-queue
packet and byte counters to atomic64_t types. This makes updates
thread-safe and easier to manage across multiple cores.
It also updates the ethtool statistics to safely read these new counters.
Signed-off-by: Mingming Cao <mmc@...ux.ibm.com>
Reviewed-by: Brian King <bjking1@...ux.ibm.com>
Reviewed-by: Dave Marquardt <davemarq@...ux.ibm.com>
Reviewed by: Rick Lindsley <ricklind@...ux.ibm.com>
---
drivers/net/ethernet/ibm/ibmvnic.c | 34 +++++++++++++++---------------
drivers/net/ethernet/ibm/ibmvnic.h | 14 ++++++------
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 92647e137c..7b2be8eeb5 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -69,6 +69,7 @@
#include <linux/if_vlan.h>
#include <linux/utsname.h>
#include <linux/cpu.h>
+#include <linux/atomic.h>
#include "ibmvnic.h"
@@ -2314,9 +2315,8 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
tx_buff = &tx_pool->tx_buff[index];
adapter->netdev->stats.tx_packets--;
adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;
- adapter->tx_stats_buffers[queue_num].batched_packets--;
- adapter->tx_stats_buffers[queue_num].bytes -=
- tx_buff->skb->len;
+ atomic64_dec(&adapter->tx_stats_buffers[queue_num].batched_packets);
+ atomic64_sub(tx_buff->skb->len, &adapter->tx_stats_buffers[queue_num].bytes);
dev_kfree_skb_any(tx_buff->skb);
tx_buff->skb = NULL;
adapter->netdev->stats.tx_dropped++;
@@ -2652,10 +2652,10 @@ out:
netdev->stats.tx_packets += tx_bpackets + tx_dpackets;
adapter->tx_send_failed += tx_send_failed;
adapter->tx_map_failed += tx_map_failed;
- adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets;
- adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets;
- adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
- adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
+ atomic64_add(tx_bpackets, &adapter->tx_stats_buffers[queue_num].batched_packets);
+ atomic64_add(tx_dpackets, &adapter->tx_stats_buffers[queue_num].direct_packets);
+ atomic64_add(tx_bytes, &adapter->tx_stats_buffers[queue_num].bytes);
+ atomic64_add(tx_dropped, &adapter->tx_stats_buffers[queue_num].dropped_packets);
return ret;
}
@@ -3569,8 +3569,8 @@ restart_poll:
napi_gro_receive(napi, skb); /* send it up */
netdev->stats.rx_packets++;
netdev->stats.rx_bytes += length;
- adapter->rx_stats_buffers[scrq_num].packets++;
- adapter->rx_stats_buffers[scrq_num].bytes += length;
+ atomic64_inc(&adapter->rx_stats_buffers[scrq_num].packets);
+ atomic64_add(length, &adapter->rx_stats_buffers[scrq_num].bytes);
frames_processed++;
}
@@ -3874,22 +3874,22 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
(adapter, ibmvnic_stats[i].offset));
for (j = 0; j < adapter->req_tx_queues; j++) {
- data[i] = adapter->tx_stats_buffers[j].batched_packets;
+ data[i] = atomic64_read(&adapter->tx_stats_buffers[j].batched_packets);
i++;
- data[i] = adapter->tx_stats_buffers[j].direct_packets;
+ data[i] = atomic64_read(&adapter->tx_stats_buffers[j].direct_packets);
i++;
- data[i] = adapter->tx_stats_buffers[j].bytes;
+ data[i] = atomic64_read(&adapter->tx_stats_buffers[j].bytes);
i++;
- data[i] = adapter->tx_stats_buffers[j].dropped_packets;
+ data[i] = atomic64_read(&adapter->tx_stats_buffers[j].dropped_packets);
i++;
}
for (j = 0; j < adapter->req_rx_queues; j++) {
- data[i] = adapter->rx_stats_buffers[j].packets;
+ data[i] = atomic64_read(&adapter->rx_stats_buffers[j].packets);
i++;
- data[i] = adapter->rx_stats_buffers[j].bytes;
+ data[i] = atomic64_read(&adapter->rx_stats_buffers[j].bytes);
i++;
- data[i] = adapter->rx_stats_buffers[j].interrupts;
+ data[i] = atomic64_read(&adapter->rx_stats_buffers[j].interrupts);
i++;
}
}
@@ -4307,7 +4307,7 @@ static irqreturn_t ibmvnic_interrupt_rx(int irq, void *instance)
if (unlikely(adapter->state != VNIC_OPEN))
return IRQ_NONE;
- adapter->rx_stats_buffers[scrq->scrq_num].interrupts++;
+ atomic64_inc(&adapter->rx_stats_buffers[scrq->scrq_num].interrupts);
if (napi_schedule_prep(&adapter->napi[scrq->scrq_num])) {
disable_scrq_irq(adapter, scrq);
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 246ddce753..1cc6e2d13a 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -212,19 +212,19 @@ struct ibmvnic_statistics {
} __packed __aligned(8);
struct ibmvnic_tx_queue_stats {
- u64 batched_packets;
- u64 direct_packets;
- u64 bytes;
- u64 dropped_packets;
+ atomic64_t batched_packets;
+ atomic64_t direct_packets;
+ atomic64_t bytes;
+ atomic64_t dropped_packets;
};
#define NUM_TX_STATS \
(sizeof(struct ibmvnic_tx_queue_stats) / sizeof(u64))
struct ibmvnic_rx_queue_stats {
- u64 packets;
- u64 bytes;
- u64 interrupts;
+ atomic64_t packets;
+ atomic64_t bytes;
+ atomic64_t interrupts;
};
#define NUM_RX_STATS \
--
2.39.3 (Apple Git-146)
Powered by blists - more mailing lists