[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20090521.152439.79009648.davem@davemloft.net>
Date: Thu, 21 May 2009 15:24:39 -0700 (PDT)
From: David Miller <davem@...emloft.net>
To: buytenh@...tstofly.org
Cc: mike@...loops.com, afleming@...escale.com,
linux-kernel@...r.kernel.org, rjw@...k.pl
Subject: Re: [BUG] 2.6.30-rc4: Kernel BUG under network load with gianfar
From: Lennert Buytenhek <buytenh@...tstofly.org>
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@...r.kernel.org
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists