public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
@ 2008-04-08 15:05 Johannes Berg
  2008-04-08 15:41 ` Stefan Richter
  2008-04-08 19:11 ` [PATCH] " Roman Zippel
  0 siblings, 2 replies; 7+ messages in thread
From: Johannes Berg @ 2008-04-08 15:05 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Linux Kernel list, Ingo Molnar, sam

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]
---
v5: rename to HAVE_EFFICIENT_UNALIGNED_ACCESS

I have opted to not introduce any symbol associated with the cost
of unaligned accesses, David Woodhouse once suggested that such a
cost should be combined with a probability of (un-)alignment even
in the get_unaligned/put_unaligned macros and I think this should
be combined with a patch introducing a global cost constant.

Also, this would require architecture changes because if some code
knew the likelyhood of unaligned accesses was small enough over
the cost of them, architectures that complain in the trap handle
would still complain in that unlikely case although the code
explicitly made a trade-off based on the cost/probability.

 Documentation/unaligned-memory-access.txt |   32 +++++++++++++++++++++++++++---
 arch/Kconfig                              |   19 +++++++++++++++++
 arch/powerpc/Kconfig                      |    1 
 arch/x86/Kconfig                          |    1 
 4 files changed, 50 insertions(+), 3 deletions(-)

--- everything.orig/Documentation/unaligned-memory-access.txt	2008-04-04 23:42:50.000000000 +0200
+++ everything/Documentation/unaligned-memory-access.txt	2008-04-04 23:52:15.000000000 +0200
@@ -218,9 +218,35 @@ If use of such macros is not convenient,
 where the source or destination (or both) are of type u8* or unsigned char*.
 Due to the byte-wise nature of this operation, unaligned accesses are avoided.
 
+
+Alignment vs. Networking
+========================
+
+On architectures that require aligned loads, networking requires that the IP
+header is aligned on a four-byte boundary to optimise the IP stack. For
+regular ethernet hardware, the constant NET_IP_ALIGN is used, on most
+architectures this constant has the value 2 because the normal ethernet
+header is 14 bytes long, so in order to get proper alignment one needs to
+DMA to an address that is can be expressed as 4*n + 2. One notable exception
+here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
+addresses can be very expensive and dwarf the cost of unaligned loads.
+
+For some ethernet hardware that cannot DMA to unaligned addresses like
+4*n+2 or non-ethernet hardware, this can be a problem, and it is then
+required to copy the incoming frame into an aligned buffer. Because this is
+unnecessary on architectures that can do unaligned accesses, the code can be
+made depend on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:
+
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+	skb = original skb
+#else
+	skb = copy skb
+#endif
+
 --
-Author: Daniel Drake <dsd@gentoo.org>
+Authors: Daniel Drake <dsd@gentoo.org>,
+         Johannes Berg <johannes@sipsolutions.net>
 With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
-Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
-Uli Kunitz, Vadim Lobanov
+Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
+Vadim Lobanov
 
--- everything.orig/arch/powerpc/Kconfig	2008-04-04 23:42:53.000000000 +0200
+++ everything/arch/powerpc/Kconfig	2008-04-04 23:52:15.000000000 +0200
@@ -103,6 +103,7 @@ config PPC
 	select HAVE_OPROFILE
 	select HAVE_KPROBES
 	select HAVE_KRETPROBES
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 config EARLY_PRINTK
 	bool
--- everything.orig/arch/x86/Kconfig	2008-04-04 23:42:50.000000000 +0200
+++ everything/arch/x86/Kconfig	2008-04-04 23:52:15.000000000 +0200
@@ -23,6 +23,7 @@ config X86
 	select HAVE_KPROBES
 	select HAVE_KRETPROBES
 	select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 
 config GENERIC_LOCKBREAK
--- everything.orig/arch/Kconfig	2008-04-04 23:42:50.000000000 +0200
+++ everything/arch/Kconfig	2008-04-04 23:52:15.000000000 +0200
@@ -36,3 +36,22 @@ config HAVE_KPROBES
 
 config HAVE_KRETPROBES
 	def_bool n
+
+config HAVE_EFFICIENT_UNALIGNED_ACCESS
+	def_bool n
+	help
+	  Some architectures are unable to perform unaligned accesses
+	  without the use of get_unaligned/put_unaligned. Others are
+	  unable to perform such accesses efficiently (e.g. trap on
+	  unaligned access and require fixing it up in the exception
+	  handler.)
+
+	  This symbol should be selected by an architecture if it can
+	  perform unaligned accesses efficiently to allow different
+	  code paths to be selected for these cases. Some network
+	  drivers, for example, could opt to not fix up alignment
+	  problems with received packets if doing so would not help
+	  much.
+
+	  See Documentation/unaligned-memory-access.txt for more
+	  information on the topic of unaligned memory accesses.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
  2008-04-08 15:05 [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol Johannes Berg
@ 2008-04-08 15:41 ` Stefan Richter
  2008-04-08 16:00   ` Johannes Berg
  2008-04-08 16:03   ` [PATCH v6] " Johannes Berg
  2008-04-08 19:11 ` [PATCH] " Roman Zippel
  1 sibling, 2 replies; 7+ messages in thread
From: Stefan Richter @ 2008-04-08 15:41 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Andrew Morton, Linux Kernel list, Ingo Molnar, sam

Johannes Berg wrote:
> --- everything.orig/Documentation/unaligned-memory-access.txt	2008-04-04 23:42:50.000000000 +0200
> +++ everything/Documentation/unaligned-memory-access.txt	2008-04-04 23:52:15.000000000 +0200
> @@ -218,9 +218,35 @@ If use of such macros is not convenient,
>  where the source or destination (or both) are of type u8* or unsigned char*.
>  Due to the byte-wise nature of this operation, unaligned accesses are avoided.
>  
> +
> +Alignment vs. Networking
> +========================
> +
> +On architectures that require aligned loads, networking requires that the IP
> +header is aligned on a four-byte boundary to optimise the IP stack. For
> +regular ethernet hardware, the constant NET_IP_ALIGN is used, on most

                                                               . On

> +architectures this constant has the value 2 because the normal ethernet
> +header is 14 bytes long, so in order to get proper alignment one needs to

                          . So

> +DMA to an address that is can be expressed as 4*n + 2. One notable exception

                      which can

> +here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
> +addresses can be very expensive and dwarf the cost of unaligned loads.
> +
> +For some ethernet hardware that cannot DMA to unaligned addresses like
> +4*n+2 or non-ethernet hardware, this can be a problem, and it is then
> +required to copy the incoming frame into an aligned buffer. Because this is
> +unnecessary on architectures that can do unaligned accesses, the code can be
> +made depend on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:

   made dependent on

> +
> +#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
> +	skb = original skb
> +#else
> +	skb = copy skb
> +#endif
> +
>  --
> -Author: Daniel Drake <dsd@gentoo.org>
> +Authors: Daniel Drake <dsd@gentoo.org>,
> +         Johannes Berg <johannes@sipsolutions.net>
>  With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
> -Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
> -Uli Kunitz, Vadim Lobanov
> +Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
> +Vadim Lobanov
>  
> --- everything.orig/arch/powerpc/Kconfig	2008-04-04 23:42:53.000000000 +0200
> +++ everything/arch/powerpc/Kconfig	2008-04-04 23:52:15.000000000 +0200
> @@ -103,6 +103,7 @@ config PPC
>  	select HAVE_OPROFILE
>  	select HAVE_KPROBES
>  	select HAVE_KRETPROBES
> +	select HAVE_EFFICIENT_UNALIGNED_ACCESS
>  
>  config EARLY_PRINTK
>  	bool
> --- everything.orig/arch/x86/Kconfig	2008-04-04 23:42:50.000000000 +0200
> +++ everything/arch/x86/Kconfig	2008-04-04 23:52:15.000000000 +0200
> @@ -23,6 +23,7 @@ config X86
>  	select HAVE_KPROBES
>  	select HAVE_KRETPROBES
>  	select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
> +	select HAVE_EFFICIENT_UNALIGNED_ACCESS
>  
>  
>  config GENERIC_LOCKBREAK
> --- everything.orig/arch/Kconfig	2008-04-04 23:42:50.000000000 +0200
> +++ everything/arch/Kconfig	2008-04-04 23:52:15.000000000 +0200
> @@ -36,3 +36,22 @@ config HAVE_KPROBES
>  
>  config HAVE_KRETPROBES
>  	def_bool n
> +
> +config HAVE_EFFICIENT_UNALIGNED_ACCESS
> +	def_bool n
> +	help
> +	  Some architectures are unable to perform unaligned accesses
> +	  without the use of get_unaligned/put_unaligned. Others are
> +	  unable to perform such accesses efficiently (e.g. trap on

Wouldn't a comment be more appropriate instead of a help text?  This
option shouldn't be a visible make XYZconfig prompt.

I have no comment on the option itself; it's not my domain.
-- 
Stefan Richter
-=====-==--- -=-- -=---
http://arcgraph.de/sr/

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
  2008-04-08 15:41 ` Stefan Richter
@ 2008-04-08 16:00   ` Johannes Berg
  2008-04-08 16:03   ` [PATCH v6] " Johannes Berg
  1 sibling, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2008-04-08 16:00 UTC (permalink / raw)
  To: Stefan Richter; +Cc: Andrew Morton, Linux Kernel list, Ingo Molnar, sam

[-- Attachment #1: Type: text/plain, Size: 1003 bytes --]

Stefan,

Thanks for the text review. I'll follow up with a new version in a
minute.

> > --- everything.orig/arch/Kconfig	2008-04-04 23:42:50.000000000 +0200
> > +++ everything/arch/Kconfig	2008-04-04 23:52:15.000000000 +0200
> > @@ -36,3 +36,22 @@ config HAVE_KPROBES
> >  
> >  config HAVE_KRETPROBES
> >  	def_bool n
> > +
> > +config HAVE_EFFICIENT_UNALIGNED_ACCESS
> > +	def_bool n
> > +	help
> > +	  Some architectures are unable to perform unaligned accesses
> > +	  without the use of get_unaligned/put_unaligned. Others are
> > +	  unable to perform such accesses efficiently (e.g. trap on
> 
> Wouldn't a comment be more appropriate instead of a help text?  This
> option shouldn't be a visible make XYZconfig prompt.
> 
> I have no comment on the option itself; it's not my domain.

Note that the help text doesn't mean the option gets to be visible, only
the one-line description does, as in

config XYZ
	bool "description"

vs.
config XYZ
	bool

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v6] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
  2008-04-08 15:41 ` Stefan Richter
  2008-04-08 16:00   ` Johannes Berg
@ 2008-04-08 16:03   ` Johannes Berg
  1 sibling, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2008-04-08 16:03 UTC (permalink / raw)
  To: Stefan Richter; +Cc: Andrew Morton, Linux Kernel list, Ingo Molnar, sam

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]
---
v5: rename to HAVE_EFFICIENT_UNALIGNED_ACCESS
v6: small text fixes

I have opted to not introduce any symbol associated with the cost
of unaligned accesses, David Woodhouse once suggested that such a
cost should be combined with a probability of (un-)alignment even
in the get_unaligned/put_unaligned macros and I think this should
be combined with a patch introducing a global cost constant.

Also, this would require architecture changes because if some code
knew the likelyhood of unaligned accesses was small enough over
the cost of them, architectures that complain in the trap handle
would still complain in that unlikely case although the code
explicitly made a trade-off based on the cost/probability.

 Documentation/unaligned-memory-access.txt |   32 +++++++++++++++++++++++++++---
 arch/Kconfig                              |   19 +++++++++++++++++
 arch/powerpc/Kconfig                      |    1 
 arch/x86/Kconfig                          |    1 
 4 files changed, 50 insertions(+), 3 deletions(-)

--- everything.orig/Documentation/unaligned-memory-access.txt	2008-04-08 17:07:07.000000000 +0200
+++ everything/Documentation/unaligned-memory-access.txt	2008-04-08 18:02:27.000000000 +0200
@@ -218,9 +218,35 @@ If use of such macros is not convenient,
 where the source or destination (or both) are of type u8* or unsigned char*.
 Due to the byte-wise nature of this operation, unaligned accesses are avoided.
 
+
+Alignment vs. Networking
+========================
+
+On architectures that require aligned loads, networking requires that the IP
+header is aligned on a four-byte boundary to optimise the IP stack. For
+regular ethernet hardware, the constant NET_IP_ALIGN is used. On most
+architectures this constant has the value 2 because the normal ethernet
+header is 14 bytes long, so in order to get proper alignment one needs to
+DMA to an address which can be expressed as 4*n + 2. One notable exception
+here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
+addresses can be very expensive and dwarf the cost of unaligned loads.
+
+For some ethernet hardware that cannot DMA to unaligned addresses like
+4*n+2 or non-ethernet hardware, this can be a problem, and it is then
+required to copy the incoming frame into an aligned buffer. Because this is
+unnecessary on architectures that can do unaligned accesses, the code can be
+made dependent on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:
+
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+	skb = original skb
+#else
+	skb = copy skb
+#endif
+
 --
-Author: Daniel Drake <dsd@gentoo.org>
+Authors: Daniel Drake <dsd@gentoo.org>,
+         Johannes Berg <johannes@sipsolutions.net>
 With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
-Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
-Uli Kunitz, Vadim Lobanov
+Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
+Vadim Lobanov
 
--- everything.orig/arch/powerpc/Kconfig	2008-04-08 17:09:41.000000000 +0200
+++ everything/arch/powerpc/Kconfig	2008-04-08 17:09:42.000000000 +0200
@@ -103,6 +103,7 @@ config PPC
 	select HAVE_OPROFILE
 	select HAVE_KPROBES
 	select HAVE_KRETPROBES
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 config EARLY_PRINTK
 	bool
--- everything.orig/arch/x86/Kconfig	2008-04-08 17:07:07.000000000 +0200
+++ everything/arch/x86/Kconfig	2008-04-08 17:09:42.000000000 +0200
@@ -23,6 +23,7 @@ config X86
 	select HAVE_KPROBES
 	select HAVE_KRETPROBES
 	select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 
 config GENERIC_LOCKBREAK
--- everything.orig/arch/Kconfig	2008-04-08 17:07:07.000000000 +0200
+++ everything/arch/Kconfig	2008-04-08 17:09:42.000000000 +0200
@@ -36,3 +36,22 @@ config HAVE_KPROBES
 
 config HAVE_KRETPROBES
 	def_bool n
+
+config HAVE_EFFICIENT_UNALIGNED_ACCESS
+	def_bool n
+	help
+	  Some architectures are unable to perform unaligned accesses
+	  without the use of get_unaligned/put_unaligned. Others are
+	  unable to perform such accesses efficiently (e.g. trap on
+	  unaligned access and require fixing it up in the exception
+	  handler.)
+
+	  This symbol should be selected by an architecture if it can
+	  perform unaligned accesses efficiently to allow different
+	  code paths to be selected for these cases. Some network
+	  drivers, for example, could opt to not fix up alignment
+	  problems with received packets if doing so would not help
+	  much.
+
+	  See Documentation/unaligned-memory-access.txt for more
+	  information on the topic of unaligned memory accesses.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
  2008-04-08 15:05 [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol Johannes Berg
  2008-04-08 15:41 ` Stefan Richter
@ 2008-04-08 19:11 ` Roman Zippel
  2008-04-09 13:43   ` Johannes Berg
  1 sibling, 1 reply; 7+ messages in thread
From: Roman Zippel @ 2008-04-08 19:11 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Andrew Morton, Linux Kernel list, Ingo Molnar, sam

Hi,

On Tuesday 8. April 2008, Johannes Berg wrote:

> 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.

Please CC linux-arch@vger.kernel.org for such changes, so it's more likely 
noticed by more arch maintainers, so a list can be compiled what is 
appropriate for the various archs.
The scope of this symbol is IMO a little unclear, is it intended for one-time 
accesses to small object or also for repeated accesses to larger objects?
Anyway, this probably should be set for m68k as well.

bye, Roman

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
  2008-04-08 19:11 ` [PATCH] " Roman Zippel
@ 2008-04-09 13:43   ` Johannes Berg
  0 siblings, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2008-04-09 13:43 UTC (permalink / raw)
  To: Roman Zippel; +Cc: Andrew Morton, Linux Kernel list, Ingo Molnar, sam

[-- Attachment #1: Type: text/plain, Size: 752 bytes --]

Hi,

> Please CC linux-arch@vger.kernel.org for such changes, so it's more likely 
> noticed by more arch maintainers, so a list can be compiled what is 
> appropriate for the various archs.

Hah. I thought there was such a list but it didn't show up in
MAINTAINERS so I thought I was wrong.

> The scope of this symbol is IMO a little unclear, is it intended for one-time 
> accesses to small object or also for repeated accesses to larger objects?
> Anyway, this probably should be set for m68k as well.

Also for repeated accesses, for example network packets where the IPv4
header might not always be aligned. That's why we want it to be
"efficient", not just "possible" (as an earlier version of the patch
called it.)

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol
@ 2008-05-07 21:05 Johannes Berg
  0 siblings, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2008-05-07 21:05 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-arch, netdev, Linux Kernel list, Ingo Molnar, Sam Ravnborg

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]
---
v5: rename to HAVE_EFFICIENT_UNALIGNED_ACCESS
v6: small text fixes

I have opted to not introduce any symbol associated with the cost
of unaligned accesses, David Woodhouse once suggested that such a
cost should be combined with a probability of (un-)alignment even
in the get_unaligned/put_unaligned macros and I think this should
be combined with a patch introducing a global cost constant.

Also, this would require architecture changes because if some code
knew the likelihood of unaligned accesses was small enough over
the cost of them, architectures that complain in the trap handle
would still complain in that unlikely case although the code
explicitly made a trade-off based on the cost/probability.

I can roll more architectures that want this into this patch, or you can
merge extra patches once this is in, I don't care either way but the
latter might be quicker/easier.

 Documentation/unaligned-memory-access.txt |   32 +++++++++++++++++++++++++++---
 arch/Kconfig                              |   19 +++++++++++++++++
 arch/powerpc/Kconfig                      |    1 
 arch/x86/Kconfig                          |    1 
 4 files changed, 50 insertions(+), 3 deletions(-)

--- everything.orig/Documentation/unaligned-memory-access.txt	2008-05-07 21:50:09.000000000 +0200
+++ everything/Documentation/unaligned-memory-access.txt	2008-05-07 21:53:01.000000000 +0200
@@ -218,9 +218,35 @@ If use of such macros is not convenient,
 where the source or destination (or both) are of type u8* or unsigned char*.
 Due to the byte-wise nature of this operation, unaligned accesses are avoided.
 
+
+Alignment vs. Networking
+========================
+
+On architectures that require aligned loads, networking requires that the IP
+header is aligned on a four-byte boundary to optimise the IP stack. For
+regular ethernet hardware, the constant NET_IP_ALIGN is used. On most
+architectures this constant has the value 2 because the normal ethernet
+header is 14 bytes long, so in order to get proper alignment one needs to
+DMA to an address which can be expressed as 4*n + 2. One notable exception
+here is powerpc which defines NET_IP_ALIGN to 0 because DMA to unaligned
+addresses can be very expensive and dwarf the cost of unaligned loads.
+
+For some ethernet hardware that cannot DMA to unaligned addresses like
+4*n+2 or non-ethernet hardware, this can be a problem, and it is then
+required to copy the incoming frame into an aligned buffer. Because this is
+unnecessary on architectures that can do unaligned accesses, the code can be
+made dependent on CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS like so:
+
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+	skb = original skb
+#else
+	skb = copy skb
+#endif
+
 --
-Author: Daniel Drake <dsd@gentoo.org>
+Authors: Daniel Drake <dsd@gentoo.org>,
+         Johannes Berg <johannes@sipsolutions.net>
 With help from: Alan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt,
-Johannes Berg, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock,
-Uli Kunitz, Vadim Lobanov
+Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz,
+Vadim Lobanov
 
--- everything.orig/arch/powerpc/Kconfig	2008-05-07 21:50:43.000000000 +0200
+++ everything/arch/powerpc/Kconfig	2008-05-07 21:53:01.000000000 +0200
@@ -110,6 +110,7 @@ config PPC
 	select HAVE_KPROBES
 	select HAVE_KRETPROBES
 	select HAVE_LMB
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 config EARLY_PRINTK
 	bool
--- everything.orig/arch/x86/Kconfig	2008-05-07 21:50:44.000000000 +0200
+++ everything/arch/x86/Kconfig	2008-05-07 21:53:01.000000000 +0200
@@ -24,6 +24,7 @@ config X86
 	select HAVE_KRETPROBES
 	select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
 	select HAVE_ARCH_KGDB if !X86_VOYAGER
+	select HAVE_EFFICIENT_UNALIGNED_ACCESS
 
 config DEFCONFIG_LIST
 	string
--- everything.orig/arch/Kconfig	2008-05-07 21:50:41.000000000 +0200
+++ everything/arch/Kconfig	2008-05-07 21:53:01.000000000 +0200
@@ -39,3 +39,22 @@ config HAVE_KRETPROBES
 
 config HAVE_DMA_ATTRS
 	def_bool n
+
+config HAVE_EFFICIENT_UNALIGNED_ACCESS
+	def_bool n
+	help
+	  Some architectures are unable to perform unaligned accesses
+	  without the use of get_unaligned/put_unaligned. Others are
+	  unable to perform such accesses efficiently (e.g. trap on
+	  unaligned access and require fixing it up in the exception
+	  handler.)
+
+	  This symbol should be selected by an architecture if it can
+	  perform unaligned accesses efficiently to allow different
+	  code paths to be selected for these cases. Some network
+	  drivers, for example, could opt to not fix up alignment
+	  problems with received packets if doing so would not help
+	  much.
+
+	  See Documentation/unaligned-memory-access.txt for more
+	  information on the topic of unaligned memory accesses.



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-05-07 21:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-08 15:05 [PATCH] introduce HAVE_EFFICIENT_UNALIGNED_ACCESS Kconfig symbol Johannes Berg
2008-04-08 15:41 ` Stefan Richter
2008-04-08 16:00   ` Johannes Berg
2008-04-08 16:03   ` [PATCH v6] " Johannes Berg
2008-04-08 19:11 ` [PATCH] " Roman Zippel
2008-04-09 13:43   ` Johannes Berg
  -- strict thread matches above, loose matches on Subject: below --
2008-05-07 21:05 Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox