Subject: Re: Kernel Oops in UDP w/ ARM architecture

From: Eric Dumazet <[email-masked]>
Date: Mon, 09 Mar 2009 21:24:10 +0100

Ron Yorgason a écrit :
> On Mon, Mar 9, 2009 at 1:21 PM, Eric Dumazet <[email-masked]> wrote:
>> Please dont top post on this mailing list
>>
>> Ron Yorgason a écrit :
>>> We're using the fec driver, found in drivers/net/fec.c.  I modified
>>> this driver slightly to get the MAC address from the redboot
>>> configuration stored in flash memory, but it's otherwise untouched.  I
>>> can send my version of the file if that would help.
>>>
>>> --Ron
>>>
>>>
>> Given that ARM seems to be picky about non aligned accesses, you might
>> try this patch. This should force IP header to be aligned.
>>
>> diff -u linux-2.6.19/drivers/net/fec.c.old linux-2.6.19/drivers/net/fec.c
>> --- linux-2.6.19/drivers/net/fec.c.old
>> +++ linux-2.6.19/drivers/net/fec.c
>> @@ -641,13 +641,14 @@
>>         * include that when passing upstream as it messes up
>>         * bridging applications.
>>         */
>> -       skb = dev_alloc_skb(pkt_len-4);
>> +       skb = dev_alloc_skb((pkt_len - 4) + 2);
>>
>>        if (skb == NULL) {
>>                printk("%s: Memory squeeze, dropping packet.\n", dev->name);
>>                fep->stats.rx_dropped++;
>>        } else {
>>                skb->dev = dev;
>> +               skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
>>                skb_put(skb,pkt_len-4); /* Make room */
>>                eth_copy_and_sum(skb, data, pkt_len-4, 0);
>>                skb->protocol=eth_type_trans(skb,dev);
>>
>>
> 
> Thanks for the patch.  It looks like Freescale modified this section
> of the code in our BSP, so I'm looking at how to best merge things in.
>  Also, since we're allocating an extra 2 bytes in dev_alloc_skb(), do
> we need to account for those bytes in skb_put() and
> eth_copy_and_sum(), or does the skb_reserve() call handle that?

We allocate 2 extra bytes, because skb_reserve() will advance skb->data pointer
by two bytes. Those two bytes plus 14 bytes ethernet header : total 16 bytes,
so that IP header is aligned on 16 byte boundaries.

No other changes are necessary.

Then, maybe this patch is not necessary at all on your platform, since crash happens
a *long* time after boot. It may be a shoot in the dark...