aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2015-03-04 06:14:48 -0500
committerDavid S. Miller <davem@davemloft.net>2015-03-05 14:58:18 -0500
commitb0c21badf174eb00160f842398f3918d7b365853 (patch)
treeecb76c714145e1306435ab184a182721d45f0852 /drivers/net/xen-netback
parent49d9991a18f9aae7b14abbd9c1cc87555330a769 (diff)
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>
Diffstat (limited to 'drivers/net/xen-netback')
-rw-r--r--drivers/net/xen-netback/netback.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index f1d84fb1eba8..cab9f5257f57 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1390,27 +1390,24 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s
1390 skb_frag_size_set(&frags[i], len); 1390 skb_frag_size_set(&frags[i], len);
1391 } 1391 }
1392 1392
1393 /* Copied all the bits from the frag list -- free it. */
1394 skb_frag_list_init(skb);
1395 xenvif_skb_zerocopy_prepare(queue, nskb);
1396 kfree_skb(nskb);
1397
1393 /* Release all the original (foreign) frags. */ 1398 /* Release all the original (foreign) frags. */
1394 for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) 1399 for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
1395 skb_frag_unref(skb, f); 1400 skb_frag_unref(skb, f);
1396
1397 /* swap out with old one */
1398 memcpy(skb_shinfo(skb)->frags,
1399 frags,
1400 i * sizeof(skb_frag_t));
1401 skb_shinfo(skb)->nr_frags = i;
1402 skb->truesize += i * PAGE_SIZE;
1403
1404 /* remove traces of mapped pages and frag_list */
1405 skb_frag_list_init(skb);
1406 uarg = skb_shinfo(skb)->destructor_arg; 1401 uarg = skb_shinfo(skb)->destructor_arg;
1407 /* increase inflight counter to offset decrement in callback */ 1402 /* increase inflight counter to offset decrement in callback */
1408 atomic_inc(&queue->inflight_packets); 1403 atomic_inc(&queue->inflight_packets);
1409 uarg->callback(uarg, true); 1404 uarg->callback(uarg, true);
1410 skb_shinfo(skb)->destructor_arg = NULL; 1405 skb_shinfo(skb)->destructor_arg = NULL;
1411 1406
1412 xenvif_skb_zerocopy_prepare(queue, nskb); 1407 /* Fill the skb with the new (local) frags. */
1413 kfree_skb(nskb); 1408 memcpy(skb_shinfo(skb)->frags, frags, i * sizeof(skb_frag_t));
1409 skb_shinfo(skb)->nr_frags = i;
1410 skb->truesize += i * PAGE_SIZE;
1414 1411
1415 return 0; 1412 return 0;
1416} 1413}