|
@@ -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)
|