@@ -2103,9 +2103,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
21032103 tx_pool -> num_buffers - 1 :
21042104 tx_pool -> consumer_index - 1 ;
21052105 tx_buff = & tx_pool -> tx_buff [index ];
2106- adapter -> netdev -> stats .tx_packets -- ;
2107- adapter -> netdev -> stats .tx_bytes -= tx_buff -> skb -> len ;
2108- adapter -> tx_stats_buffers [queue_num ].packets -- ;
2106+ adapter -> tx_stats_buffers [queue_num ].batched_packets -- ;
21092107 adapter -> tx_stats_buffers [queue_num ].bytes -=
21102108 tx_buff -> skb -> len ;
21112109 dev_kfree_skb_any (tx_buff -> skb );
@@ -2196,7 +2194,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
21962194 unsigned int tx_map_failed = 0 ;
21972195 union sub_crq indir_arr [16 ];
21982196 unsigned int tx_dropped = 0 ;
2199- unsigned int tx_packets = 0 ;
2197+ unsigned int tx_dpackets = 0 ;
2198+ unsigned int tx_bpackets = 0 ;
22002199 unsigned int tx_bytes = 0 ;
22012200 dma_addr_t data_dma_addr ;
22022201 struct netdev_queue * txq ;
@@ -2370,6 +2369,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
23702369 if (lpar_rc != H_SUCCESS )
23712370 goto tx_err ;
23722371
2372+ tx_dpackets ++ ;
23732373 goto early_exit ;
23742374 }
23752375
@@ -2397,6 +2397,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
23972397 if (lpar_rc != H_SUCCESS )
23982398 goto tx_err ;
23992399 }
2400+ tx_bpackets ++ ;
24002401
24012402early_exit :
24022403 if (atomic_add_return (num_entries , & tx_scrq -> used )
@@ -2405,7 +2406,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24052406 netif_stop_subqueue (netdev , queue_num );
24062407 }
24072408
2408- tx_packets ++ ;
24092409 tx_bytes += skblen ;
24102410 txq_trans_cond_update (txq );
24112411 ret = NETDEV_TX_OK ;
@@ -2433,12 +2433,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24332433 }
24342434out :
24352435 rcu_read_unlock ();
2436- netdev -> stats .tx_dropped += tx_dropped ;
2437- netdev -> stats .tx_bytes += tx_bytes ;
2438- netdev -> stats .tx_packets += tx_packets ;
24392436 adapter -> tx_send_failed += tx_send_failed ;
24402437 adapter -> tx_map_failed += tx_map_failed ;
2441- adapter -> tx_stats_buffers [queue_num ].packets += tx_packets ;
2438+ adapter -> tx_stats_buffers [queue_num ].batched_packets += tx_bpackets ;
2439+ adapter -> tx_stats_buffers [queue_num ].direct_packets += tx_dpackets ;
24422440 adapter -> tx_stats_buffers [queue_num ].bytes += tx_bytes ;
24432441 adapter -> tx_stats_buffers [queue_num ].dropped_packets += tx_dropped ;
24442442
@@ -3237,6 +3235,25 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
32373235 return - ret ;
32383236}
32393237
3238+ static void ibmvnic_get_stats64 (struct net_device * netdev ,
3239+ struct rtnl_link_stats64 * stats )
3240+ {
3241+ struct ibmvnic_adapter * adapter = netdev_priv (netdev );
3242+ int i ;
3243+
3244+ for (i = 0 ; i < adapter -> req_rx_queues ; i ++ ) {
3245+ stats -> rx_packets += adapter -> rx_stats_buffers [i ].packets ;
3246+ stats -> rx_bytes += adapter -> rx_stats_buffers [i ].bytes ;
3247+ }
3248+
3249+ for (i = 0 ; i < adapter -> req_tx_queues ; i ++ ) {
3250+ stats -> tx_packets += adapter -> tx_stats_buffers [i ].batched_packets ;
3251+ stats -> tx_packets += adapter -> tx_stats_buffers [i ].direct_packets ;
3252+ stats -> tx_bytes += adapter -> tx_stats_buffers [i ].bytes ;
3253+ stats -> tx_dropped += adapter -> tx_stats_buffers [i ].dropped_packets ;
3254+ }
3255+ }
3256+
32403257static void ibmvnic_tx_timeout (struct net_device * dev , unsigned int txqueue )
32413258{
32423259 struct ibmvnic_adapter * adapter = netdev_priv (dev );
@@ -3352,8 +3369,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)
33523369
33533370 length = skb -> len ;
33543371 napi_gro_receive (napi , skb ); /* send it up */
3355- netdev -> stats .rx_packets ++ ;
3356- netdev -> stats .rx_bytes += length ;
33573372 adapter -> rx_stats_buffers [scrq_num ].packets ++ ;
33583373 adapter -> rx_stats_buffers [scrq_num ].bytes += length ;
33593374 frames_processed ++ ;
@@ -3463,6 +3478,7 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
34633478 .ndo_set_rx_mode = ibmvnic_set_multi ,
34643479 .ndo_set_mac_address = ibmvnic_set_mac ,
34653480 .ndo_validate_addr = eth_validate_addr ,
3481+ .ndo_get_stats64 = ibmvnic_get_stats64 ,
34663482 .ndo_tx_timeout = ibmvnic_tx_timeout ,
34673483 .ndo_change_mtu = ibmvnic_change_mtu ,
34683484 .ndo_features_check = ibmvnic_features_check ,
@@ -3627,7 +3643,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
36273643 memcpy (data , ibmvnic_stats [i ].name , ETH_GSTRING_LEN );
36283644
36293645 for (i = 0 ; i < adapter -> req_tx_queues ; i ++ ) {
3630- snprintf (data , ETH_GSTRING_LEN , "tx%d_packets" , i );
3646+ snprintf (data , ETH_GSTRING_LEN , "tx%d_batched_packets" , i );
3647+ data += ETH_GSTRING_LEN ;
3648+
3649+ snprintf (data , ETH_GSTRING_LEN , "tx%d_direct_packets" , i );
36313650 data += ETH_GSTRING_LEN ;
36323651
36333652 snprintf (data , ETH_GSTRING_LEN , "tx%d_bytes" , i );
@@ -3705,7 +3724,9 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
37053724 (adapter , ibmvnic_stats [i ].offset ));
37063725
37073726 for (j = 0 ; j < adapter -> req_tx_queues ; j ++ ) {
3708- data [i ] = adapter -> tx_stats_buffers [j ].packets ;
3727+ data [i ] = adapter -> tx_stats_buffers [j ].batched_packets ;
3728+ i ++ ;
3729+ data [i ] = adapter -> tx_stats_buffers [j ].direct_packets ;
37093730 i ++ ;
37103731 data [i ] = adapter -> tx_stats_buffers [j ].bytes ;
37113732 i ++ ;
0 commit comments