diff options
author | Zoltan Kiss <zoltan.kiss@citrix.com> | 2014-03-06 16:48:28 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-03-07 15:56:35 -0500 |
commit | 1bb332af4cd889e4b64dacbf4a793ceb3a70445d (patch) | |
tree | 1aef36c3aa0f6366562e169fbfe7589190d9387e /drivers/net/xen-netback | |
parent | 62bad3199a4c20505fc36c169deef20b25e17c5f (diff) |
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: Zoltan Kiss <zoltan.kiss@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/xen-netback')
-rw-r--r-- | drivers/net/xen-netback/common.h | 3 | ||||
-rw-r--r-- | drivers/net/xen-netback/interface.c | 15 | ||||
-rw-r--r-- | drivers/net/xen-netback/netback.c | 9 |
3 files changed, 26 insertions, 1 deletions
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h index 49109afa2253..683d30160a7c 100644 --- a/drivers/net/xen-netback/common.h +++ b/drivers/net/xen-netback/common.h | |||
@@ -179,6 +179,9 @@ struct xenvif { | |||
179 | 179 | ||
180 | /* Statistics */ | 180 | /* Statistics */ |
181 | unsigned long rx_gso_checksum_fixup; | 181 | unsigned long rx_gso_checksum_fixup; |
182 | unsigned long tx_zerocopy_sent; | ||
183 | unsigned long tx_zerocopy_success; | ||
184 | unsigned long tx_zerocopy_fail; | ||
182 | 185 | ||
183 | /* Miscellaneous private stuff. */ | 186 | /* Miscellaneous private stuff. */ |
184 | struct net_device *dev; | 187 | struct net_device *dev; |
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 1fe9fe523cc8..44df8581b4d7 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
@@ -238,6 +238,21 @@ static const struct xenvif_stat { | |||
238 | "rx_gso_checksum_fixup", | 238 | "rx_gso_checksum_fixup", |
239 | offsetof(struct xenvif, rx_gso_checksum_fixup) | 239 | offsetof(struct xenvif, rx_gso_checksum_fixup) |
240 | }, | 240 | }, |
241 | /* If (sent != success + fail), there are probably packets never | ||
242 | * freed up properly! | ||
243 | */ | ||
244 | { | ||
245 | "tx_zerocopy_sent", | ||
246 | offsetof(struct xenvif, tx_zerocopy_sent), | ||
247 | }, | ||
248 | { | ||
249 | "tx_zerocopy_success", | ||
250 | offsetof(struct xenvif, tx_zerocopy_success), | ||
251 | }, | ||
252 | { | ||
253 | "tx_zerocopy_fail", | ||
254 | offsetof(struct xenvif, tx_zerocopy_fail) | ||
255 | }, | ||
241 | }; | 256 | }; |
242 | 257 | ||
243 | static int xenvif_get_sset_count(struct net_device *dev, int string_set) | 258 | static int xenvif_get_sset_count(struct net_device *dev, int string_set) |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 46a75706cb78..3cb586357df7 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -1323,8 +1323,10 @@ static int xenvif_tx_submit(struct xenvif *vif) | |||
1323 | * do a skb_copy_ubufs while we are still in control of the | 1323 | * do a skb_copy_ubufs while we are still in control of the |
1324 | * skb. E.g. the __pskb_pull_tail earlier can do such thing. | 1324 | * skb. E.g. the __pskb_pull_tail earlier can do such thing. |
1325 | */ | 1325 | */ |
1326 | if (skb_shinfo(skb)->destructor_arg) | 1326 | if (skb_shinfo(skb)->destructor_arg) { |
1327 | skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; | 1327 | skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; |
1328 | vif->tx_zerocopy_sent++; | ||
1329 | } | ||
1328 | 1330 | ||
1329 | netif_receive_skb(skb); | 1331 | netif_receive_skb(skb); |
1330 | } | 1332 | } |
@@ -1364,6 +1366,11 @@ void xenvif_zerocopy_callback(struct ubuf_info *ubuf, bool zerocopy_success) | |||
1364 | napi_schedule(&vif->napi); | 1366 | napi_schedule(&vif->napi); |
1365 | local_bh_enable(); | 1367 | local_bh_enable(); |
1366 | } | 1368 | } |
1369 | |||
1370 | if (likely(zerocopy_success)) | ||
1371 | vif->tx_zerocopy_success++; | ||
1372 | else | ||
1373 | vif->tx_zerocopy_fail++; | ||
1367 | } | 1374 | } |
1368 | 1375 | ||
1369 | static inline void xenvif_tx_dealloc_action(struct xenvif *vif) | 1376 | static inline void xenvif_tx_dealloc_action(struct xenvif *vif) |