__u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr,
                             const struct in6_addr *raddr);
 
+static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       struct net_device_stats *stats = &dev->stats;
+       int pkt_len, err;
+
+       nf_reset(skb);
+       pkt_len = skb->len;
+       err = ip6_local_out(skb);
+
+       if (net_xmit_eval(err) == 0) {
+               struct pcpu_tstats *tstats = this_cpu_ptr(dev->tstats);
+               u64_stats_update_begin(&tstats->syncp);
+               tstats->tx_bytes += pkt_len;
+               tstats->tx_packets++;
+               u64_stats_update_end(&tstats->syncp);
+       } else {
+               stats->tx_errors++;
+               stats->tx_aborted_errors++;
+       }
+}
 #endif
 
        struct net_device_stats *stats = &tunnel->dev->stats;
        int err = -1;
        u8 proto;
-       int pkt_len;
        struct sk_buff *new_skb;
 
        if (dev->type == ARPHRD_ETHER)
                }
        }
 
-       nf_reset(skb);
-       pkt_len = skb->len;
-       err = ip6_local_out(skb);
-
-       if (net_xmit_eval(err) == 0) {
-               struct pcpu_tstats *tstats = this_cpu_ptr(tunnel->dev->tstats);
-
-               tstats->tx_bytes += pkt_len;
-               tstats->tx_packets++;
-       } else {
-               stats->tx_errors++;
-               stats->tx_aborted_errors++;
-       }
-
+       ip6tunnel_xmit(skb, dev);
        if (ndst)
                ip6_tnl_dst_store(tunnel, ndst);
-
        return 0;
 tx_err_link_failure:
        stats->tx_carrier_errors++;
 
        unsigned int max_headroom = sizeof(struct ipv6hdr);
        u8 proto;
        int err = -1;
-       int pkt_len;
 
        if (!fl6->flowi6_mark)
                dst = ip6_tnl_dst_check(t);
        ipv6h->nexthdr = proto;
        ipv6h->saddr = fl6->saddr;
        ipv6h->daddr = fl6->daddr;
-       nf_reset(skb);
-       pkt_len = skb->len;
-       err = ip6_local_out(skb);
-
-       if (net_xmit_eval(err) == 0) {
-               struct pcpu_tstats *tstats = this_cpu_ptr(t->dev->tstats);
-
-               tstats->tx_bytes += pkt_len;
-               tstats->tx_packets++;
-       } else {
-               stats->tx_errors++;
-               stats->tx_aborted_errors++;
-       }
+       ip6tunnel_xmit(skb, dev);
        if (ndst)
                ip6_tnl_dst_store(t, ndst);
        return 0;