Message ID | 20100721143245.GA8423@redhat.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Michael S. Tsirkin <mst@redhat.com> wrote: > There are still some LRO cards that cause GSO errors in tun, > and BUG on this is an unfriendly way to tell the admin > to disable LRO. > > Further, experience shows we might have more GSO bugs lurking. > See https://bugzilla.kernel.org/show_bug.cgi?id=16413 > as a recent example. > dumping a packet will make it easier to figure it out. > > Replace BUG with warning+dump+drop the packet to make > GSO errors in tun less critical and easier to debug. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > Tested-by: Alex Unigovsky <unik@compot.ru> Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
From: Herbert Xu <herbert@gondor.apana.org.au> Date: Thu, 22 Jul 2010 21:05:12 +0800 > Michael S. Tsirkin <mst@redhat.com> wrote: >> There are still some LRO cards that cause GSO errors in tun, >> and BUG on this is an unfriendly way to tell the admin >> to disable LRO. >> >> Further, experience shows we might have more GSO bugs lurking. >> See https://bugzilla.kernel.org/show_bug.cgi?id=16413 >> as a recent example. >> dumping a packet will make it easier to figure it out. >> >> Replace BUG with warning+dump+drop the packet to make >> GSO errors in tun less critical and easier to debug. >> >> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> >> Tested-by: Alex Unigovsky <unik@compot.ru> > > Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Applied, thanks everyone. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 6ad6fe7..6304259 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -736,8 +736,18 @@ static __inline__ ssize_t tun_put_user(struct tun_struct *tun, gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; else if (sinfo->gso_type & SKB_GSO_UDP) gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; - else - BUG(); + else { + printk(KERN_ERR "tun: unexpected GSO type: " + "0x%x, gso_size %d, hdr_len %d\n", + sinfo->gso_type, gso.gso_size, + gso.hdr_len); + print_hex_dump(KERN_ERR, "tun: ", + DUMP_PREFIX_NONE, + 16, 1, skb->head, + min((int)gso.hdr_len, 64), true); + WARN_ON_ONCE(1); + return -EINVAL; + } if (sinfo->gso_type & SKB_GSO_TCP_ECN) gso.gso_type |= VIRTIO_NET_HDR_GSO_ECN; } else