Thread (26 messages) 26 messages, 6 authors, 2014-10-13

Re: [PATCH] flow-dissector: Fix alignment issue in __skb_flow_get_ports

flat view

From: Alexander Duyck <hidden>
Date: 2014-10-10 14:43:02

On 10/09/2014 09:47 PM, David Miller wrote:
From: alexander.duyck@gmail.com
Date: Thu, 09 Oct 2014 21:03:28 -0700
quoted
From: Alexander Duyck <redacted>

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@davemloft.net>
Signed-off-by: Alexander Duyck <redacted>
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 needed we could convert ports to a __be16 I suppose.
If the types have a given alignment, the compiler can legitimately
expand the memcpy() inline with suitably sized loads and stores.
That is what I get for trying to come up with a fix at the end of the day.  Although it does leave me scratching my head why the IPv4 and IPv6 addresses were not causing unaligned accesses or were they triggering them as well?
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.
The problem is the igb / ixgbe / fm10k hardware doesn't have a means of inserting padding from its side.  The whole point of the xxx_get_headlen functions was to determine the size needed in order to generate the correct memcpy so that we could generate an aligned header.  It sounds like we can't do that with this function now because there are multiple instances where the data will be accessed unaligned if it isn't aligned in the first place.

The way I see it now there are two possible solutions.  The first one being to update the flow hash functions to work with unaligned accesses, and the second being to split the get_headlen code flow off and for now use my original code which already had all the alignment issues resolved.  I'm open to suggestions either way, but for now I will try to just address the items you have pointed out here with the current patch and submit a v2.

Thanks,

Alex
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help