Skip to content

Commit 58340a0

Browse files
jmbergtorvalds
authored andcommitted
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>
1 parent e0ce0da commit 58340a0

File tree

4 files changed

+50
-3
lines changed

4 files changed

+50
-3
lines changed

Documentation/unaligned-memory-access.txt

+29-3
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,35 @@ If use of such macros is not convenient, another option is to use memcpy(),
218218
where the source or destination (or both) are of type u8* or unsigned char*.
219219
Due to the byte-wise nature of this operation, unaligned accesses are avoided.
220220

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+
221246
--
222-
Author: Daniel Drake <dsd@gentoo.org>
247+
Authors: Daniel Drake <dsd@gentoo.org>,
248+
Johannes Berg <johannes@sipsolutions.net>
223249
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
226252

arch/Kconfig

+19
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,25 @@ config KPROBES
2727
for kernel debugging, non-intrusive instrumentation and testing.
2828
If in doubt, say "N".
2929

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+
3049
config KRETPROBES
3150
def_bool y
3251
depends on KPROBES && HAVE_KRETPROBES

arch/powerpc/Kconfig

+1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ config PPC
112112
select HAVE_FTRACE
113113
select HAVE_IDE
114114
select HAVE_IOREMAP_PROT
115+
select HAVE_EFFICIENT_UNALIGNED_ACCESS
115116
select HAVE_KPROBES
116117
select HAVE_ARCH_KGDB
117118
select HAVE_KRETPROBES

arch/x86/Kconfig

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ config X86
2828
select HAVE_FTRACE
2929
select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
3030
select HAVE_ARCH_KGDB if !X86_VOYAGER
31+
select HAVE_EFFICIENT_UNALIGNED_ACCESS
3132

3233
config ARCH_DEFCONFIG
3334
string

0 commit comments

Comments
 (0)