gre: Optimize tx path.
[sliver-openvswitch.git] / datapath / linux-2.6 / compat-2.6 / include / net / ipip.h
index 604ece2..7fa0b28 100644 (file)
@@ -3,6 +3,10 @@
 
 #include <linux/version.h>
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+#define HAVE_NETDEV_QUEUE_STATS
+#endif
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
 
 #include <linux/if_tunnel.h>
@@ -48,6 +52,16 @@ struct ip_tunnel_prl_entry
        spinlock_t                      lock;
 };
 
+#ifdef HAVE_NETDEV_QUEUE_STATS
+#define UPDATE_TX_STATS()                                              \
+       txq->tx_bytes += pkt_len;                                       \
+       txq->tx_packets++;
+#else
+#define UPDATE_TX_STATS()                                              \
+       stats->tx_bytes += pkt_len;                                     \
+       stats->tx_packets++;
+#endif
+
 #define IPTUNNEL_XMIT() do {                                           \
        int err;                                                        \
        int pkt_len = skb->len - skb_transport_offset(skb);             \
@@ -56,9 +70,8 @@ struct ip_tunnel_prl_entry
        ip_select_ident(iph, &rt->u.dst, NULL);                         \
                                                                        \
        err = ip_local_out(skb);                                        \
-       if (net_xmit_eval(err) == 0) {                                  \
-               stats->tx_bytes += pkt_len;                             \
-               stats->tx_packets++;                                    \
+       if (likely(net_xmit_eval(err) == 0)) {                          \
+               UPDATE_TX_STATS();                                      \
        } else {                                                        \
                stats->tx_errors++;                                     \
                stats->tx_aborted_errors++;                             \