Re: [PATCH] net: fec_main: dma_map() only the length of the skb
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: 2013-11-28 11:24:31
On 11/28/2013 02:18 AM, Fugang Duan wrote: - [off-list ref] because MTA complains (now really)
quoted
On 11/27/2013 02:08 PM, Fugang Duan wrote:quoted
In fact, there have one memory copy for enet as below since enet have 16bytes data buffer alignment request.quoted
if (((unsigned long) bufaddr) & FEC_ALIGNMENT) { memcpy(fep->tx_bounce[index], skb->data, skb->len); bufaddr = fep->tx_bounce[index]; }This memcpy() is only executed if the buffer isn't properly aligned which shouldn't be the rule but an exception. This aligment check is also available in v2.6.31 where the BUG_ON() statement was triggered.In fact, the skb->data address is not aligned with FEC_ALIGNMENT, so memcpy() always is called at here.
I am aware of NET_IP_ALIGN. The pointers I mentioned in the log were from a printk() shortly before that bug triggered. So I am not making this up :) I am not aware of the load that triggered this. Anyway, adding this WARN_ON(!((unsigned long)skb->data & 0xf)); in my e1000 on v3.12 triggers shortly after boot and according to the backtrace it comes aoe. So that is at least one user :) Since that aligment is for IP, I am not sure if non-IP based protocol are using this. I know however that the workload, that triggered the problem, is not IP-based.
Thanks, Andy
Sebastian