Message ID | 20181218150619.6964-1-jgross@suse.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | xen/netfront: tolerate frags with no data | expand |
From: Juergen Gross <jgross@suse.com> Date: Tue, 18 Dec 2018 16:06:19 +0100 > At least old Xen net backends seem to send frags with no real data > sometimes. In case such a fragment happens to occur with the frag limit > already reached the frontend will BUG currently even if this situation > is easily recoverable. > > Modify the BUG_ON() condition accordingly. > > Tested-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com> > Signed-off-by: Juergen Gross <jgross@suse.com> Applied and queued up for -stable. But many of these BUG's in the driver should be converted to WARNs and recovery code added.
On 19/12/2018 07:00, David Miller wrote: > From: Juergen Gross <jgross@suse.com> > Date: Tue, 18 Dec 2018 16:06:19 +0100 > >> At least old Xen net backends seem to send frags with no real data >> sometimes. In case such a fragment happens to occur with the frag limit >> already reached the frontend will BUG currently even if this situation >> is easily recoverable. >> >> Modify the BUG_ON() condition accordingly. >> >> Tested-by: Dietmar Hahn <dietmar.hahn@ts.fujitsu.com> >> Signed-off-by: Juergen Gross <jgross@suse.com> > > Applied and queued up for -stable. > > But many of these BUG's in the driver should be converted to > WARNs and recovery code added. > Right, but that will be no stable material then. Will start that effort after Christmas. Juergen
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index f17f602e6171..5b97cc946d70 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -905,7 +905,7 @@ static RING_IDX xennet_fill_frags(struct netfront_queue *queue, if (skb_shinfo(skb)->nr_frags == MAX_SKB_FRAGS) { unsigned int pull_to = NETFRONT_SKB_CB(skb)->pull_to; - BUG_ON(pull_to <= skb_headlen(skb)); + BUG_ON(pull_to < skb_headlen(skb)); __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); } if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) {