mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
xen-netback: refactor xenvif_handle_frag_list()
When handling a from-guest frag list, xenvif_handle_frag_list() replaces the frags before calling the destructor to clean up the original (foreign) frags. Whilst this is safe (the destructor doesn't actually use the frags), it looks odd. Reorder the function to be less confusing. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
49d9991a18
commit
b0c21badf1
1 changed files with 9 additions and 12 deletions
|
@ -1390,27 +1390,24 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s
|
||||||
skb_frag_size_set(&frags[i], len);
|
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. */
|
/* Release all the original (foreign) frags. */
|
||||||
for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
|
for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
|
||||||
skb_frag_unref(skb, f);
|
skb_frag_unref(skb, f);
|
||||||
|
|
||||||
/* swap out with old one */
|
|
||||||
memcpy(skb_shinfo(skb)->frags,
|
|
||||||
frags,
|
|
||||||
i * sizeof(skb_frag_t));
|
|
||||||
skb_shinfo(skb)->nr_frags = i;
|
|
||||||
skb->truesize += i * PAGE_SIZE;
|
|
||||||
|
|
||||||
/* remove traces of mapped pages and frag_list */
|
|
||||||
skb_frag_list_init(skb);
|
|
||||||
uarg = skb_shinfo(skb)->destructor_arg;
|
uarg = skb_shinfo(skb)->destructor_arg;
|
||||||
/* increase inflight counter to offset decrement in callback */
|
/* increase inflight counter to offset decrement in callback */
|
||||||
atomic_inc(&queue->inflight_packets);
|
atomic_inc(&queue->inflight_packets);
|
||||||
uarg->callback(uarg, true);
|
uarg->callback(uarg, true);
|
||||||
skb_shinfo(skb)->destructor_arg = NULL;
|
skb_shinfo(skb)->destructor_arg = NULL;
|
||||||
|
|
||||||
xenvif_skb_zerocopy_prepare(queue, nskb);
|
/* Fill the skb with the new (local) frags. */
|
||||||
kfree_skb(nskb);
|
memcpy(skb_shinfo(skb)->frags, frags, i * sizeof(skb_frag_t));
|
||||||
|
skb_shinfo(skb)->nr_frags = i;
|
||||||
|
skb->truesize += i * PAGE_SIZE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue