Commit 58340a07c194e0aed7bc58b61ff24330bb2a409f

Authored by Johannes Berg
Committed by Linus Torvalds
1 parent e0ce0da9fe

introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol

In many cases, especially in networking, it can be beneficial to know at
compile time whether the architecture can do unaligned accesses efficiently.
This patch introduces a new Kconfig symbol

	HAVE_EFFICIENT_UNALIGNED_ACCESS

for that purpose and adds it to the powerpc and x86 architectures.  Also add
some documentation about alignment and networking, and especially one intended
use of this symbol.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Ingo Molnar <mingo@elte.hu> [x86 architecture part]
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 4 changed files with 50 additions and 3 deletions Side-by-side Diff

Documentation/unaligned-memory-access.txt
... ... @@ -218,9 +218,35 @@
218 218 where the source or destination (or both) are of type u8* or unsigned char*.
219 219 Due to the byte-wise nature of this operation, unaligned accesses are avoided.
220 220  
  221 +
  222 +Alignment vs. Networking
  223 +========================
  224 +
  225 +On architectures that require aligned loads, networking requires that the IP
  226 +header is aligned on a four-byte boundary to optimise the IP stack. For
  227 +regular ethernet hardware, the constant NET_IP_ALIGN is used. On most
  228 +architectures this constant has the value 2 because the normal ethernet
  229 +header is 14 bytes long, so in order to get proper alignment one needs to
  230 +DMA to an address which can be expressed as 4*n + 2. One notable exception
  231 +here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
  232 +addresses can be very expensive and dwarf the cost of unaligned loads.
  233 +
  234 +For some ethernet hardware that cannot DMA to unaligned addresses like
  235 +4*n+2 or non-ethernet hardware, this can be a problem, and it is then
  236 +required to copy the incoming frame into an aligned buffer. Because this is
  237 +unnecessary on architectures that can do unaligned accesses, the code can be
  238 +made dependent on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:
  239 +
  240 +#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
  241 + skb = original skb
  242 +#else
  243 + skb = copy skb
  244 +#endif
  245 +
221 246 --
222   -Author: Daniel Drake <dsd@gentoo.org>
  247 +Authors: Daniel Drake <dsd@gentoo.org>,
  248 + Johannes Berg <johannes@sipsolutions.net>
223 249 With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
224   -Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
225   -Uli Kunitz, Vadim Lobanov
  250 +Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
  251 +Vadim Lobanov
... ... @@ -27,6 +27,25 @@
27 27 for kernel debugging, non-intrusive instrumentation and testing.
28 28 If in doubt, say "N".
29 29  
  30 +config HAVE_EFFICIENT_UNALIGNED_ACCESS
  31 + def_bool n
  32 + help
  33 + Some architectures are unable to perform unaligned accesses
  34 + without the use of get_unaligned/put_unaligned. Others are
  35 + unable to perform such accesses efficiently (e.g. trap on
  36 + unaligned access and require fixing it up in the exception
  37 + handler.)
  38 +
  39 + This symbol should be selected by an architecture if it can
  40 + perform unaligned accesses efficiently to allow different
  41 + code paths to be selected for these cases. Some network
  42 + drivers, for example, could opt to not fix up alignment
  43 + problems with received packets if doing so would not help
  44 + much.
  45 +
  46 + See Documentation/unaligned-memory-access.txt for more
  47 + information on the topic of unaligned memory accesses.
  48 +
30 49 config KRETPROBES
31 50 def_bool y
32 51 depends on KPROBES && HAVE_KRETPROBES
arch/powerpc/Kconfig
... ... @@ -112,6 +112,7 @@
112 112 select HAVE_FTRACE
113 113 select HAVE_IDE
114 114 select HAVE_IOREMAP_PROT
  115 + select HAVE_EFFICIENT_UNALIGNED_ACCESS
115 116 select HAVE_KPROBES
116 117 select HAVE_ARCH_KGDB
117 118 select HAVE_KRETPROBES
... ... @@ -28,6 +28,7 @@
28 28 select HAVE_FTRACE
29 29 select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
30 30 select HAVE_ARCH_KGDB if !X86_VOYAGER
  31 + select HAVE_EFFICIENT_UNALIGNED_ACCESS
31 32  
32 33 config ARCH_DEFCONFIG
33 34 string