Commit 58340a07c194e0aed7bc58b61ff24330bb2a409f
Committed by
Linus Torvalds
1 parent
e0ce0da9fe
Exists in
master
and in
39 other branches
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 |
arch/Kconfig
... | ... | @@ -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
arch/x86/Kconfig