aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>2016-10-09 00:28:52 -0400
committerDavid S. Miller <davem@davemloft.net>2016-10-09 09:30:38 -0400
commitf3d6ad84807254954fc69bdebb6123e5a2883baf (patch)
tree8446d24ca2415e546c738b8d191cf033c9ffd7c9
parent77b696cba961bb6e88aeba36253849443f9a4186 (diff)
be2net: Fix TX stats for TSO packets
TX stats update does not take into account headers which get duplicated when the TSO packet is split into segments by HW. Fix this for both tunneled (vxlan) and non-tunneled TSO packets. Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index dcb930a52613..cece8a08edca 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -724,14 +724,24 @@ void be_link_status_update(struct be_adapter *adapter, u8 link_status)
724 netdev_info(netdev, "Link is %s\n", link_status ? "Up" : "Down"); 724 netdev_info(netdev, "Link is %s\n", link_status ? "Up" : "Down");
725} 725}
726 726
727static int be_gso_hdr_len(struct sk_buff *skb)
728{
729 if (skb->encapsulation)
730 return skb_inner_transport_offset(skb) +
731 inner_tcp_hdrlen(skb);
732 return skb_transport_offset(skb) + tcp_hdrlen(skb);
733}
734
727static void be_tx_stats_update(struct be_tx_obj *txo, struct sk_buff *skb) 735static void be_tx_stats_update(struct be_tx_obj *txo, struct sk_buff *skb)
728{ 736{
729 struct be_tx_stats *stats = tx_stats(txo); 737 struct be_tx_stats *stats = tx_stats(txo);
730 u64 tx_pkts = skb_shinfo(skb)->gso_segs ? : 1; 738 u32 tx_pkts = skb_shinfo(skb)->gso_segs ? : 1;
739 /* Account for headers which get duplicated in TSO pkt */
740 u32 dup_hdr_len = tx_pkts > 1 ? be_gso_hdr_len(skb) * (tx_pkts - 1) : 0;
731 741
732 u64_stats_update_begin(&stats->sync); 742 u64_stats_update_begin(&stats->sync);
733 stats->tx_reqs++; 743 stats->tx_reqs++;
734 stats->tx_bytes += skb->len; 744 stats->tx_bytes += skb->len + dup_hdr_len;
735 stats->tx_pkts += tx_pkts; 745 stats->tx_pkts += tx_pkts;
736 if (skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) 746 if (skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL)
737 stats->tx_vxlan_offload_pkts += tx_pkts; 747 stats->tx_vxlan_offload_pkts += tx_pkts;