[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 10 Oct 2014 00:47:08 -0400 (EDT)
From: David Miller <davem@...emloft.net>
To: alexander.duyck@...il.com
Cc: netdev@...r.kernel.org
Subject: Re: [PATCH] flow-dissector: Fix alignment issue in
__skb_flow_get_ports
From: alexander.duyck@...il.com
Date: Thu, 09 Oct 2014 21:03:28 -0700
> From: Alexander Duyck <alexander.h.duyck@...hat.com>
>
> This patch addresses a kernel unaligned access bug seen on a sparc64 system
> with an igb adapter. Specifically the __skb_flow_get_ports was returning a
> be32 pointer which was then having the value directly returned.
>
> In order to keep the handling of the ports consistent with how we were
> handling the IPv4 and IPv6 addresses I have instead replaced the assignment
> with a memcpy to the flow key ports value. This way it should stay a
> memcpy on systems that cannot handle unaligned access, and will likely be
> converted to a 32b assignment on the systems that can support it.
>
> Reported-by: David S. Miller <davem@...emloft.net>
> Signed-off-by: Alexander Duyck <alexander.h.duyck@...hat.com>
Guess what the compiler will output for the memcpy()....
*(u32 *)dest = *(u32 *)src;
Using memcpy() is never a valid way to avoid misaligned loads and
stores.
If the types have a given alignment, the compiler can legitimately
expand the memcpy() inline with suitably sized loads and stores.
Please see my other reply in the original thread, we have to use
the hardware when we can to manage this situation, by configuring
it to output two garbage bytes before the packet contents when
DMA'ing into power-of-2 aligned blocks of memory.
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists