Commit 1bb332af authored by Zoltan Kiss's avatar Zoltan Kiss Committed by David S. Miller

xen-netback: Add stat counters for zerocopy

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: default avatarZoltan Kiss <zoltan.kiss@citrix.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 62bad319
...@@ -179,6 +179,9 @@ struct xenvif { ...@@ -179,6 +179,9 @@ struct xenvif {
/* Statistics */ /* Statistics */
unsigned long rx_gso_checksum_fixup; unsigned long rx_gso_checksum_fixup;
unsigned long tx_zerocopy_sent;
unsigned long tx_zerocopy_success;
unsigned long tx_zerocopy_fail;
/* Miscellaneous private stuff. */ /* Miscellaneous private stuff. */
struct net_device *dev; struct net_device *dev;
......
...@@ -238,6 +238,21 @@ static const struct xenvif_stat { ...@@ -238,6 +238,21 @@ static const struct xenvif_stat {
"rx_gso_checksum_fixup", "rx_gso_checksum_fixup",
offsetof(struct xenvif, 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) static int xenvif_get_sset_count(struct net_device *dev, int string_set)
......
...@@ -1323,8 +1323,10 @@ static int xenvif_tx_submit(struct xenvif *vif) ...@@ -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 * 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. * 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; skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
vif->tx_zerocopy_sent++;
}
netif_receive_skb(skb); netif_receive_skb(skb);
} }
...@@ -1364,6 +1366,11 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success) ...@@ -1364,6 +1366,11 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success)
napi_schedule(&vif->napi); napi_schedule(&vif->napi);
local_bh_enable(); 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) static inline void xenvif_tx_dealloc_action(struct xenvif *vif)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment