[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20160918.222607.1930094684278444086.davem@davemloft.net>
Date: Sun, 18 Sep 2016 22:26:07 -0400 (EDT)
From: David Miller <davem@...emloft.net>
To: vkuznets@...hat.com
Cc: netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
ptalbert@...hat.com, boris.ostrovsky@...cle.com,
david.vrabel@...rix.com, jgross@...e.com,
xen-devel@...ts.xenproject.org
Subject: Re: [PATCH net-next RESEND] xen-netfront: avoid packet loss when
ethernet header crosses page boundary
From: Vitaly Kuznetsov <vkuznets@...hat.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.
Powered by blists - more mailing lists