From: Vitaly Kuznetsov <vkuzn...@redhat.com>
Date: Fri, 16 Sep 2016 12:59:14 +0200

> @@ -595,6 +596,19 @@ static int xennet_start_xmit(struct sk_buff *skb, struct 
> net_device *dev)
>       offset = offset_in_page(skb->data);
>       len = skb_headlen(skb);
>  
> +     /* The first req should be at least ETH_HLEN size or the packet will be
> +      * dropped by netback.
> +      */
> +     if (unlikely(PAGE_SIZE - offset < ETH_HLEN)) {
> +             nskb = skb_copy(skb, GFP_ATOMIC);
> +             if (!nskb)
> +                     goto drop;
> +             dev_kfree_skb_any(skb);
> +             skb = nskb;
> +             page = virt_to_page(skb->data);
> +             offset = offset_in_page(skb->data);
> +     }
> +
>       spin_lock_irqsave(&queue->tx_lock, flags);

I think you also have to recalculate 'len' in this case too, as
skb_headlen() will definitely be different for nskb.

In fact, I can't see how this code can work properly without that fix.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to