mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
62bad3199a
commit
1bb332af4c
|
@ -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 {
|
||||||
"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)
|
||||||
* 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)
|
||||||
|
|
Loading…
Reference in New Issue