xen-netback: Add stat counters for zerocopy
authorZoltan Kiss <zoltan.kiss@citrix.com>
Thu, 6 Mar 2014 21:48:28 +0000 (21:48 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Mar 2014 20:56:35 +0000 (15:56 -0500)
These counters help determine how often the buffers had to be copied. Also
they help find out if packets are leaked, as if "sent != success + fail",
there are probably packets never freed up properly.

NOTE: if bisect brought you here, you should apply the series up until
"xen-netback: Timeout packets in RX path", otherwise Windows guests can't work
properly and malicious guests can block other guests by not releasing their sent
packets.

Signed-off-by: Zoltan Kiss <zoltan.kiss@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netback/common.h
drivers/net/xen-netback/interface.c
drivers/net/xen-netback/netback.c

index 49109afa2253c8c9ee728c0288adfd034ab20f6c..683d30160a7c016fea24c9185f580e0a52df35ac 100644 (file)
@@ -179,6 +179,9 @@ struct xenvif {
 
        /* Statistics */
        unsigned long rx_gso_checksum_fixup;
+       unsigned long tx_zerocopy_sent;
+       unsigned long tx_zerocopy_success;
+       unsigned long tx_zerocopy_fail;
 
        /* Miscellaneous private stuff. */
        struct net_device *dev;
index 1fe9fe523cc8131a4905b03cc532bbc0e1956aa7..44df8581b4d7c363cd314e90431ed62a635e768f 100644 (file)
@@ -238,6 +238,21 @@ static const struct xenvif_stat {
                "rx_gso_checksum_fixup",
                offsetof(struct xenvif, rx_gso_checksum_fixup)
        },
+       /* If (sent != success + fail), there are probably packets never
+        * freed up properly!
+        */
+       {
+               "tx_zerocopy_sent",
+               offsetof(struct xenvif, tx_zerocopy_sent),
+       },
+       {
+               "tx_zerocopy_success",
+               offsetof(struct xenvif, tx_zerocopy_success),
+       },
+       {
+               "tx_zerocopy_fail",
+               offsetof(struct xenvif, tx_zerocopy_fail)
+       },
 };
 
 static int xenvif_get_sset_count(struct net_device *dev, int string_set)
index 46a75706cb78384726087f7963a9a9b6efe1f4cb..3cb586357df716999a91995aece35fbf0dfe19ab 100644 (file)
@@ -1323,8 +1323,10 @@ static int xenvif_tx_submit(struct xenvif *vif)
                 * do a skb_copy_ubufs while we are still in control of the
                 * skb. E.g. the __pskb_pull_tail earlier can do such thing.
                 */
-               if (skb_shinfo(skb)->destructor_arg)
+               if (skb_shinfo(skb)->destructor_arg) {
                        skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
+                       vif->tx_zerocopy_sent++;
+               }
 
                netif_receive_skb(skb);
        }
@@ -1364,6 +1366,11 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success)
                napi_schedule(&vif->napi);
                local_bh_enable();
        }
+
+       if (likely(zerocopy_success))
+               vif->tx_zerocopy_success++;
+       else
+               vif->tx_zerocopy_fail++;
 }
 
 static inline void xenvif_tx_dealloc_action(struct xenvif *vif)