aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@citrix.com>2014-03-06 16:48:28 -0500
committerDavid S. Miller <davem@davemloft.net>2014-03-07 15:56:35 -0500
commit1bb332af4cd889e4b64dacbf4a793ceb3a70445d (patch)
tree1aef36c3aa0f6366562e169fbfe7589190d9387e
parent62bad3199a4c20505fc36c169deef20b25e17c5f (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>
-rw-r--r--drivers/net/xen-netback/common.h3
-rw-r--r--drivers/net/xen-netback/interface.c15
-rw-r--r--drivers/net/xen-netback/netback.c9
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
243static int xenvif_get_sset_count(struct net_device *dev, int string_set) 258static 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
1369static inline void xenvif_tx_dealloc_action(struct xenvif *vif) 1376static inline void xenvif_tx_dealloc_action(struct xenvif *vif)