|
|
@@ -1072,11 +1072,6 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s
|
|
|
skb_frag_size_set(&frags[i], len);
|
|
|
}
|
|
|
|
|
|
- /* Copied all the bits from the frag list -- free it. */
|
|
|
- skb_frag_list_init(skb);
|
|
|
- xenvif_skb_zerocopy_prepare(queue, nskb);
|
|
|
- kfree_skb(nskb);
|
|
|
-
|
|
|
/* Release all the original (foreign) frags. */
|
|
|
for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
|
|
|
skb_frag_unref(skb, f);
|
|
|
@@ -1145,6 +1140,8 @@ static int xenvif_tx_submit(struct xenvif_queue *queue)
|
|
|
xenvif_fill_frags(queue, skb);
|
|
|
|
|
|
if (unlikely(skb_has_frag_list(skb))) {
|
|
|
+ struct sk_buff *nskb = skb_shinfo(skb)->frag_list;
|
|
|
+ xenvif_skb_zerocopy_prepare(queue, nskb);
|
|
|
if (xenvif_handle_frag_list(queue, skb)) {
|
|
|
if (net_ratelimit())
|
|
|
netdev_err(queue->vif->dev,
|
|
|
@@ -1153,6 +1150,9 @@ static int xenvif_tx_submit(struct xenvif_queue *queue)
|
|
|
kfree_skb(skb);
|
|
|
continue;
|
|
|
}
|
|
|
+ /* Copied all the bits from the frag list -- free it. */
|
|
|
+ skb_frag_list_init(skb);
|
|
|
+ kfree_skb(nskb);
|
|
|
}
|
|
|
|
|
|
skb->dev = queue->vif->dev;
|