Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Johannes Berg and committed by
Linus Torvalds
58340a07 e0ce0da9

+50 -3
+29 -3
Documentation/unaligned-memory-access.txt
··· 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 226 252
+19
arch/Kconfig
··· 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
+1
arch/powerpc/Kconfig
··· 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
+1
arch/x86/Kconfig
··· 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