@@ -2308,9 +2308,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
23082308 tx_pool -> num_buffers - 1 :
23092309 tx_pool -> consumer_index - 1 ;
23102310 tx_buff = & tx_pool -> tx_buff [index ];
2311- adapter -> netdev -> stats .tx_packets -- ;
2312- adapter -> netdev -> stats .tx_bytes -= tx_buff -> skb -> len ;
2313- adapter -> tx_stats_buffers [queue_num ].packets -- ;
2311+ adapter -> tx_stats_buffers [queue_num ].batched_packets -- ;
23142312 adapter -> tx_stats_buffers [queue_num ].bytes -=
23152313 tx_buff -> skb -> len ;
23162314 dev_kfree_skb_any (tx_buff -> skb );
@@ -2402,7 +2400,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24022400 unsigned int tx_map_failed = 0 ;
24032401 union sub_crq indir_arr [16 ];
24042402 unsigned int tx_dropped = 0 ;
2405- unsigned int tx_packets = 0 ;
2403+ unsigned int tx_dpackets = 0 ;
2404+ unsigned int tx_bpackets = 0 ;
24062405 unsigned int tx_bytes = 0 ;
24072406 dma_addr_t data_dma_addr ;
24082407 struct netdev_queue * txq ;
@@ -2577,6 +2576,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
25772576 if (lpar_rc != H_SUCCESS )
25782577 goto tx_err ;
25792578
2579+ tx_dpackets ++ ;
25802580 goto early_exit ;
25812581 }
25822582
@@ -2604,6 +2604,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26042604 if (lpar_rc != H_SUCCESS )
26052605 goto tx_err ;
26062606 }
2607+ tx_bpackets ++ ;
26072608
26082609early_exit :
26092610 if (atomic_add_return (num_entries , & tx_scrq -> used )
@@ -2612,7 +2613,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26122613 netif_stop_subqueue (netdev , queue_num );
26132614 }
26142615
2615- tx_packets ++ ;
26162616 tx_bytes += skblen ;
26172617 txq_trans_cond_update (txq );
26182618 ret = NETDEV_TX_OK ;
@@ -2640,12 +2640,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26402640 }
26412641out :
26422642 rcu_read_unlock ();
2643- netdev -> stats .tx_dropped += tx_dropped ;
2644- netdev -> stats .tx_bytes += tx_bytes ;
2645- netdev -> stats .tx_packets += tx_packets ;
26462643 adapter -> tx_send_failed += tx_send_failed ;
26472644 adapter -> tx_map_failed += tx_map_failed ;
2648- adapter -> tx_stats_buffers [queue_num ].packets += tx_packets ;
2645+ adapter -> tx_stats_buffers [queue_num ].batched_packets += tx_bpackets ;
2646+ adapter -> tx_stats_buffers [queue_num ].direct_packets += tx_dpackets ;
26492647 adapter -> tx_stats_buffers [queue_num ].bytes += tx_bytes ;
26502648 adapter -> tx_stats_buffers [queue_num ].dropped_packets += tx_dropped ;
26512649
@@ -3444,6 +3442,25 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
34443442 return - ret ;
34453443}
34463444
3445+ static void ibmvnic_get_stats64 (struct net_device * netdev ,
3446+ struct rtnl_link_stats64 * stats )
3447+ {
3448+ struct ibmvnic_adapter * adapter = netdev_priv (netdev );
3449+ int i ;
3450+
3451+ for (i = 0 ; i < adapter -> req_rx_queues ; i ++ ) {
3452+ stats -> rx_packets += adapter -> rx_stats_buffers [i ].packets ;
3453+ stats -> rx_bytes += adapter -> rx_stats_buffers [i ].bytes ;
3454+ }
3455+
3456+ for (i = 0 ; i < adapter -> req_tx_queues ; i ++ ) {
3457+ stats -> tx_packets += adapter -> tx_stats_buffers [i ].batched_packets ;
3458+ stats -> tx_packets += adapter -> tx_stats_buffers [i ].direct_packets ;
3459+ stats -> tx_bytes += adapter -> tx_stats_buffers [i ].bytes ;
3460+ stats -> tx_dropped += adapter -> tx_stats_buffers [i ].dropped_packets ;
3461+ }
3462+ }
3463+
34473464static void ibmvnic_tx_timeout (struct net_device * dev , unsigned int txqueue )
34483465{
34493466 struct ibmvnic_adapter * adapter = netdev_priv (dev );
@@ -3559,8 +3576,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)
35593576
35603577 length = skb -> len ;
35613578 napi_gro_receive (napi , skb ); /* send it up */
3562- netdev -> stats .rx_packets ++ ;
3563- netdev -> stats .rx_bytes += length ;
35643579 adapter -> rx_stats_buffers [scrq_num ].packets ++ ;
35653580 adapter -> rx_stats_buffers [scrq_num ].bytes += length ;
35663581 frames_processed ++ ;
@@ -3670,6 +3685,7 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
36703685 .ndo_set_rx_mode = ibmvnic_set_multi ,
36713686 .ndo_set_mac_address = ibmvnic_set_mac ,
36723687 .ndo_validate_addr = eth_validate_addr ,
3688+ .ndo_get_stats64 = ibmvnic_get_stats64 ,
36733689 .ndo_tx_timeout = ibmvnic_tx_timeout ,
36743690 .ndo_change_mtu = ibmvnic_change_mtu ,
36753691 .ndo_features_check = ibmvnic_features_check ,
@@ -3810,7 +3826,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
38103826 memcpy (data , ibmvnic_stats [i ].name , ETH_GSTRING_LEN );
38113827
38123828 for (i = 0 ; i < adapter -> req_tx_queues ; i ++ ) {
3813- snprintf (data , ETH_GSTRING_LEN , "tx%d_packets" , i );
3829+ snprintf (data , ETH_GSTRING_LEN , "tx%d_batched_packets" , i );
3830+ data += ETH_GSTRING_LEN ;
3831+
3832+ snprintf (data , ETH_GSTRING_LEN , "tx%d_direct_packets" , i );
38143833 data += ETH_GSTRING_LEN ;
38153834
38163835 snprintf (data , ETH_GSTRING_LEN , "tx%d_bytes" , i );
@@ -3875,7 +3894,9 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
38753894 (adapter , ibmvnic_stats [i ].offset ));
38763895
38773896 for (j = 0 ; j < adapter -> req_tx_queues ; j ++ ) {
3878- data [i ] = adapter -> tx_stats_buffers [j ].packets ;
3897+ data [i ] = adapter -> tx_stats_buffers [j ].batched_packets ;
3898+ i ++ ;
3899+ data [i ] = adapter -> tx_stats_buffers [j ].direct_packets ;
38793900 i ++ ;
38803901 data [i ] = adapter -> tx_stats_buffers [j ].bytes ;
38813902 i ++ ;
0 commit comments