Re: [BUG] 2.6.30-rc4: Kernel BUG under network load with gianfar

From: David Miller
Date: Thu May 21 2009 - 18:24:51 EST


From: Lennert Buytenhek <buytenh@xxxxxxxxxxxxxx>
Date: Wed, 20 May 2009 23:47:34 +0200

> gianfar puts skbuffs that are in the rx ring back onto the recycle
> list if there was a receive error, but this breaks the following
> invariant: that all skbuffs on the recycle list have skb->data =
> skb->head + NET_SKB_PAD (NET_SKB_PAD being 32 for you).
>
> In this case, the skb's ->data will be skb->head + RXBUF_ALIGNMENT
> (where RXBUF_ALIGNMENT is 64) when it is put onto the recycle list.
> And when gfar_new_skb() picks this skb off the recycle list again,
> it'll do:
>
> alignamount = RXBUF_ALIGNMENT -
> (((unsigned long) skb->data) & (RXBUF_ALIGNMENT - 1));
>
> /* We need the data buffer to be aligned properly. We will reserve
> * as many bytes as needed to align the data properly
> */
> skb_reserve(skb, alignamount);
>
> So now skb->data will be skb->head + 128, and there won't be enough
> space between skb->head and skb->end to hold a full-sized packet.
>
> Something like the patch below would fix it.

Let me know when a final, tested, version of this patch is available
and please make sure it makes it to netdev@xxxxxxxxxxxxxxx

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/