Skip to content

Commit

Permalink
xen-netback: Add stat counters for zerocopy
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Zoltan Kiss authored and David S. Miller committed Mar 7, 2014
1 parent 62bad31 commit 1bb332a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
3 changes: 3 additions & 0 deletions drivers/net/xen-netback/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
15 changes: 15 additions & 0 deletions drivers/net/xen-netback/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 8 additions & 1 deletion drivers/net/xen-netback/netback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 1bb332a

Please sign in to comment.