]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ibmvnic: Add stat for tx direct vs tx batched
authorNick Child <nnac123@linux.ibm.com>
Tue, 1 Oct 2024 16:35:31 +0000 (11:35 -0500)
committerJakub Kicinski <kuba@kernel.org>
Fri, 4 Oct 2024 00:37:32 +0000 (17:37 -0700)
Allow tracking of packets sent with send_subcrq direct vs
indirect. `ethtool -S <dev>` will now provide a counter
of the number of uses of each xmit method. This metric will
be useful in performance debugging.

Signed-off-by: Nick Child <nnac123@linux.ibm.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241001163531.1803152-1-nnac123@linux.ibm.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ibm/ibmvnic.c
drivers/net/ethernet/ibm/ibmvnic.h

index 87e693a814331ad2f57d1a1832d3a9e30a87b50b..53b309ddc63b97516d3f3d6d053ff658ea1fa4df 100644 (file)
@@ -2310,7 +2310,7 @@ 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].packets--;
+               adapter->tx_stats_buffers[queue_num].batched_packets--;
                adapter->tx_stats_buffers[queue_num].bytes -=
                                                tx_buff->skb->len;
                dev_kfree_skb_any(tx_buff->skb);
@@ -2402,7 +2402,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
        unsigned int tx_map_failed = 0;
        union sub_crq indir_arr[16];
        unsigned int tx_dropped = 0;
-       unsigned int tx_packets = 0;
+       unsigned int tx_dpackets = 0;
+       unsigned int tx_bpackets = 0;
        unsigned int tx_bytes = 0;
        dma_addr_t data_dma_addr;
        struct netdev_queue *txq;
@@ -2573,6 +2574,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
                if (lpar_rc != H_SUCCESS)
                        goto tx_err;
 
+               tx_dpackets++;
                goto early_exit;
        }
 
@@ -2601,6 +2603,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
                        goto tx_err;
        }
 
+       tx_bpackets++;
+
 early_exit:
        if (atomic_add_return(num_entries, &tx_scrq->used)
                                        >= adapter->req_tx_entries_per_subcrq) {
@@ -2608,7 +2612,6 @@ early_exit:
                netif_stop_subqueue(netdev, queue_num);
        }
 
-       tx_packets++;
        tx_bytes += skb->len;
        txq_trans_cond_update(txq);
        ret = NETDEV_TX_OK;
@@ -2638,10 +2641,11 @@ out:
        rcu_read_unlock();
        netdev->stats.tx_dropped += tx_dropped;
        netdev->stats.tx_bytes += tx_bytes;
-       netdev->stats.tx_packets += tx_packets;
+       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].packets += tx_packets;
+       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;
 
@@ -3806,7 +3810,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
                memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
 
        for (i = 0; i < adapter->req_tx_queues; i++) {
-               snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
+               snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i);
+               data += ETH_GSTRING_LEN;
+
+               snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i);
                data += ETH_GSTRING_LEN;
 
                snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
@@ -3871,7 +3878,9 @@ 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].packets;
+               data[i] = adapter->tx_stats_buffers[j].batched_packets;
+               i++;
+               data[i] = adapter->tx_stats_buffers[j].direct_packets;
                i++;
                data[i] = adapter->tx_stats_buffers[j].bytes;
                i++;
index 94ac36b1408be960d340d7fbdd63c63e42e5a0c1..a189038d88df03b6267f1f5b5d86e9e6b2d3e8e7 100644 (file)
@@ -213,7 +213,8 @@ struct ibmvnic_statistics {
 
 #define NUM_TX_STATS 3
 struct ibmvnic_tx_queue_stats {
-       u64 packets;
+       u64 batched_packets;
+       u64 direct_packets;
        u64 bytes;
        u64 dropped_packets;
 };