netvsc: account for packets/bytes transmitted after completion
Most drivers do not increment transmit statistics until after the transmit is completed. This will also be necessary for BQL support. Slight additional complexity because the netvsc driver aggregates multiple packets into one transmit. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
46b4f7f5d1
commit
793e395555
@@ -364,7 +364,6 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
u32 rndis_msg_size;
|
||||
struct rndis_per_packet_info *ppi;
|
||||
u32 hash;
|
||||
u32 skb_length;
|
||||
struct hv_page_buffer page_buf[MAX_PAGE_BUFFER_COUNT];
|
||||
struct hv_page_buffer *pb = page_buf;
|
||||
|
||||
@@ -374,7 +373,6 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
* more pages we try linearizing it.
|
||||
*/
|
||||
|
||||
skb_length = skb->len;
|
||||
num_data_pgs = netvsc_get_slots(skb) + 2;
|
||||
|
||||
if (unlikely(num_data_pgs > MAX_PAGE_BUFFER_COUNT)) {
|
||||
@@ -407,6 +405,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
packet->q_idx = skb_get_queue_mapping(skb);
|
||||
|
||||
packet->total_data_buflen = skb->len;
|
||||
packet->total_bytes = skb->len;
|
||||
packet->total_packets = 1;
|
||||
|
||||
rndis_msg = (struct rndis_message *)skb->head;
|
||||
|
||||
@@ -517,15 +517,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
skb_tx_timestamp(skb);
|
||||
ret = netvsc_send(net_device_ctx->device_ctx, packet,
|
||||
rndis_msg, &pb, skb);
|
||||
if (likely(ret == 0)) {
|
||||
struct netvsc_stats *tx_stats = this_cpu_ptr(net_device_ctx->tx_stats);
|
||||
|
||||
u64_stats_update_begin(&tx_stats->syncp);
|
||||
tx_stats->packets++;
|
||||
tx_stats->bytes += skb_length;
|
||||
u64_stats_update_end(&tx_stats->syncp);
|
||||
if (likely(ret == 0))
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
if (ret == -EAGAIN) {
|
||||
++net_device_ctx->eth_stats.tx_busy;
|
||||
|
Reference in New Issue
Block a user