Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ibmvnic: Add stat for tx direct vs tx batched

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>

authored by

Nick Child and committed by
Jakub Kicinski
2ee73c54 4c5107b8

+18 -8
+16 -7
drivers/net/ethernet/ibm/ibmvnic.c
··· 2310 2310 tx_buff = &tx_pool->tx_buff[index]; 2311 2311 adapter->netdev->stats.tx_packets--; 2312 2312 adapter->netdev->stats.tx_bytes -= tx_buff->skb->len; 2313 - adapter->tx_stats_buffers[queue_num].packets--; 2313 + adapter->tx_stats_buffers[queue_num].batched_packets--; 2314 2314 adapter->tx_stats_buffers[queue_num].bytes -= 2315 2315 tx_buff->skb->len; 2316 2316 dev_kfree_skb_any(tx_buff->skb); ··· 2402 2402 unsigned int tx_map_failed = 0; 2403 2403 union sub_crq indir_arr[16]; 2404 2404 unsigned int tx_dropped = 0; 2405 - unsigned int tx_packets = 0; 2405 + unsigned int tx_dpackets = 0; 2406 + unsigned int tx_bpackets = 0; 2406 2407 unsigned int tx_bytes = 0; 2407 2408 dma_addr_t data_dma_addr; 2408 2409 struct netdev_queue *txq; ··· 2574 2573 if (lpar_rc != H_SUCCESS) 2575 2574 goto tx_err; 2576 2575 2576 + tx_dpackets++; 2577 2577 goto early_exit; 2578 2578 } 2579 2579 ··· 2603 2601 goto tx_err; 2604 2602 } 2605 2603 2604 + tx_bpackets++; 2605 + 2606 2606 early_exit: 2607 2607 if (atomic_add_return(num_entries, &tx_scrq->used) 2608 2608 >= adapter->req_tx_entries_per_subcrq) { ··· 2612 2608 netif_stop_subqueue(netdev, queue_num); 2613 2609 } 2614 2610 2615 - tx_packets++; 2616 2611 tx_bytes += skb->len; 2617 2612 txq_trans_cond_update(txq); 2618 2613 ret = NETDEV_TX_OK; ··· 2641 2638 rcu_read_unlock(); 2642 2639 netdev->stats.tx_dropped += tx_dropped; 2643 2640 netdev->stats.tx_bytes += tx_bytes; 2644 - netdev->stats.tx_packets += tx_packets; 2641 + netdev->stats.tx_packets += tx_bpackets + tx_dpackets; 2645 2642 adapter->tx_send_failed += tx_send_failed; 2646 2643 adapter->tx_map_failed += tx_map_failed; 2647 - adapter->tx_stats_buffers[queue_num].packets += tx_packets; 2644 + adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets; 2645 + adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets; 2648 2646 adapter->tx_stats_buffers[queue_num].bytes += tx_bytes; 2649 2647 adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped; 2650 2648 ··· 3810 3806 memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN); 3811 3807 3812 3808 for (i = 0; i < adapter->req_tx_queues; i++) { 3813 - snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i); 3809 + snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i); 3810 + data += ETH_GSTRING_LEN; 3811 + 3812 + snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i); 3814 3813 data += ETH_GSTRING_LEN; 3815 3814 3816 3815 snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i); ··· 3878 3871 (adapter, ibmvnic_stats[i].offset)); 3879 3872 3880 3873 for (j = 0; j < adapter->req_tx_queues; j++) { 3881 - data[i] = adapter->tx_stats_buffers[j].packets; 3874 + data[i] = adapter->tx_stats_buffers[j].batched_packets; 3875 + i++; 3876 + data[i] = adapter->tx_stats_buffers[j].direct_packets; 3882 3877 i++; 3883 3878 data[i] = adapter->tx_stats_buffers[j].bytes; 3884 3879 i++;
+2 -1
drivers/net/ethernet/ibm/ibmvnic.h
··· 213 213 214 214 #define NUM_TX_STATS 3 215 215 struct ibmvnic_tx_queue_stats { 216 - u64 packets; 216 + u64 batched_packets; 217 + u64 direct_packets; 217 218 u64 bytes; 218 219 u64 dropped_packets; 219 220 };