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);
                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,
                                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;