We'll want per-queue RX counters once MQ is running, and it's useful to
see whether the driver is hitting legacy or per-queue hcalls. Add the
structs and alloc helpers now, wire them up later:

ibmveth_hcall_stats for register/add/free/send hcall counts,
ibmveth_rx_queue_stats for per-queue packets/bytes/polls/etc.,
ibmveth_alloc_rx_qstats() / ibmveth_free_rx_qstats().

Marked __maybe_unused until open and the RX path start using them. No
behavior change yet.

Signed-off-by: Mingming Cao <[email protected]>
Reviewed-by: Dave Marquardt <[email protected]>
---
 drivers/net/ethernet/ibm/ibmveth.c | 27 +++++++++++++++++++++++++++
 drivers/net/ethernet/ibm/ibmveth.h | 29 +++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/drivers/net/ethernet/ibm/ibmveth.c 
b/drivers/net/ethernet/ibm/ibmveth.c
index 4f9dbee7477d..8f9f927bff23 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -611,6 +611,33 @@ static int ibmveth_register_logical_lan(struct 
ibmveth_adapter *adapter,
        return rc;
 }
 
+/**
+ * ibmveth_alloc_rx_qstats - Allocate per-queue RX statistics
+ * @adapter: ibmveth adapter structure
+ *
+ * Return: 0 on success, -ENOMEM on failure
+ */
+static int __maybe_unused ibmveth_alloc_rx_qstats(struct ibmveth_adapter 
*adapter)
+{
+       adapter->rx_qstats = kcalloc(IBMVETH_MAX_RX_QUEUES,
+                                    sizeof(struct ibmveth_rx_queue_stats),
+                                    GFP_KERNEL);
+       if (!adapter->rx_qstats)
+               return -ENOMEM;
+
+       return 0;
+}
+
+/**
+ * ibmveth_free_rx_qstats - Free per-queue RX statistics
+ * @adapter: ibmveth adapter structure
+ */
+static void __maybe_unused ibmveth_free_rx_qstats(struct ibmveth_adapter 
*adapter)
+{
+       kfree(adapter->rx_qstats);
+       adapter->rx_qstats = NULL;
+}
+
 static int ibmveth_open(struct net_device *netdev)
 {
        struct ibmveth_adapter *adapter = netdev_priv(netdev);
diff --git a/drivers/net/ethernet/ibm/ibmveth.h 
b/drivers/net/ethernet/ibm/ibmveth.h
index b17894695c2e..f0dffe42e8fe 100644
--- a/drivers/net/ethernet/ibm/ibmveth.h
+++ b/drivers/net/ethernet/ibm/ibmveth.h
@@ -290,6 +290,30 @@ static int pool_active[] = { 1, 1, 0, 0, 1};
 
 #define IBM_VETH_INVALID_MAP ((u16)0xffff)
 
+struct ibmveth_hcall_stats {
+       u64 reg_lan_queue;      /* H_REG_LOGICAL_LAN_QUEUE */
+       u64 reg_lan;            /* H_REGISTER_LOGICAL_LAN */
+       u64 add_bufs_queue;     /* H_ADD_LOGICAL_LAN_BUFFERS_QUEUE */
+       u64 add_bufs;           /* H_ADD_LOGICAL_LAN_BUFFERS */
+       u64 add_buf;            /* H_ADD_LOGICAL_LAN_BUFFER */
+       u64 free_lan_queue;     /* H_FREE_LOGICAL_LAN_QUEUE */
+       u64 free_lan;           /* H_FREE_LOGICAL_LAN */
+       u64 send_lan;           /* H_SEND_LOGICAL_LAN */
+};
+
+struct ibmveth_rx_queue_stats {
+       u64 packets;
+       u64 bytes;
+       u64 interrupts;
+       u64 polls;
+       u64 large_packets;
+       u64 invalid_buffers;
+       u64 no_buffer_drops;
+};
+
+#define IBMVETH_NUM_RX_QSTATS \
+       (sizeof(struct ibmveth_rx_queue_stats) / sizeof(u64))
+
 struct ibmveth_buff_pool {
     u32 size;
     u32 index;
@@ -352,6 +376,11 @@ struct ibmveth_adapter {
        u64 tx_send_failed;
        u64 tx_large_packets;
        u64 rx_large_packets;
+
+       /* Multi-queue statistics */
+       struct ibmveth_hcall_stats hcall_stats;
+       struct ibmveth_rx_queue_stats *rx_qstats;
+
        /* Ethtool settings */
        u8 duplex;
        u32 speed;
-- 
2.39.3 (Apple Git-146)


Reply via email to