Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;
+15 −0
Original line number Original line Diff line number Diff line
@@ -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)
+8 −1
Original line number Original line Diff line number Diff line
@@ -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)
		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)