* [BUG] alignment problem in net/core/flow.c:flow_key_compare
@ 2004-03-18 10:53 Måns Rullgård
2004-03-18 11:25 ` Måns Rullgård
0 siblings, 1 reply; 9+ messages in thread
From: Måns Rullgård @ 2004-03-18 10:53 UTC (permalink / raw)
To: linux-kernel
There is a problem with alignment in the flow_key_compare function in
net/core/flow.c. It takes arguments of type struct flowi * and casts
them to flow_compare_t *, which is 64 bits on 64-bit machines. It
then proceeds to read and compare 64-bit values from these pointers.
The problem is that struct flowi only requires 32-bit alignment, so
these reads cause numerous unaligned exceptions. On average, I get
nearly 1000 unaligned exceptions per second.
The solutions I see are either to force the alignment of struct flowi
to 64 bits, or to use 32-bit access in flow_key_compare.
--
Måns Rullgård
mru@kth.se
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-18 10:53 Måns Rullgård
@ 2004-03-18 11:25 ` Måns Rullgård
2004-03-18 18:30 ` David S. Miller
0 siblings, 1 reply; 9+ messages in thread
From: Måns Rullgård @ 2004-03-18 11:25 UTC (permalink / raw)
To: linux-kernel
mru@kth.se (Måns Rullgård) writes:
> There is a problem with alignment in the flow_key_compare function in
> net/core/flow.c. It takes arguments of type struct flowi * and casts
> them to flow_compare_t *, which is 64 bits on 64-bit machines. It
> then proceeds to read and compare 64-bit values from these pointers.
> The problem is that struct flowi only requires 32-bit alignment, so
> these reads cause numerous unaligned exceptions. On average, I get
> nearly 1000 unaligned exceptions per second.
>
> The solutions I see are either to force the alignment of struct flowi
> to 64 bits, or to use 32-bit access in flow_key_compare.
I forgot to mention that this is kernel 2.6.4.
--
Måns Rullgård
mru@kth.se
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-18 11:25 ` Måns Rullgård
@ 2004-03-18 18:30 ` David S. Miller
2004-03-18 19:41 ` Måns Rullgård
0 siblings, 1 reply; 9+ messages in thread
From: David S. Miller @ 2004-03-18 18:30 UTC (permalink / raw)
To: Måns Rullgård; +Cc: linux-kernel
On Thu, 18 Mar 2004 12:25:57 +0100
mru@kth.se (Måns Rullgård) wrote:
> mru@kth.se (Måns Rullgård) writes:
>
> > The solutions I see are either to force the alignment of struct flowi
> > to 64 bits, or to use 32-bit access in flow_key_compare.
>
> I forgot to mention that this is kernel 2.6.4.
Yes, just add an alignment attribute of some kind to the struct
is probably the best idea.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-18 18:30 ` David S. Miller
@ 2004-03-18 19:41 ` Måns Rullgård
0 siblings, 0 replies; 9+ messages in thread
From: Måns Rullgård @ 2004-03-18 19:41 UTC (permalink / raw)
To: David S. Miller; +Cc: linux-kernel
"David S. Miller" <davem@redhat.com> writes:
> On Thu, 18 Mar 2004 12:25:57 +0100
> mru@kth.se (Måns Rullgård) wrote:
>
>> mru@kth.se (Måns Rullgård) writes:
>>
>> > The solutions I see are either to force the alignment of struct flowi
>> > to 64 bits, or to use 32-bit access in flow_key_compare.
>>
>> I forgot to mention that this is kernel 2.6.4.
>
> Yes, just add an alignment attribute of some kind to the struct
> is probably the best idea.
What's the proper way of doing that in kernel code? Should I use gcc
__attribute__ directly or is there some macro that's preferred?
--
Måns Rullgård
mru@kth.se
^ permalink raw reply [flat|nested] 9+ messages in thread
* Fw: [BUG] alignment problem in net/core/flow.c:flow_key_compare
@ 2004-03-19 0:29 Andrew Morton
2004-03-19 2:55 ` YOSHIFUJI Hideaki / 吉藤英明
0 siblings, 1 reply; 9+ messages in thread
From: Andrew Morton @ 2004-03-19 0:29 UTC (permalink / raw)
To: netdev
This is in 2.6.4:
Begin forwarded message:
Date: Thu, 18 Mar 2004 11:53:02 +0100
From: mru@kth.se (Måns Rullgård)
To: linux-kernel@vger.kernel.org
Subject: [BUG] alignment problem in net/core/flow.c:flow_key_compare
There is a problem with alignment in the flow_key_compare function in
net/core/flow.c. It takes arguments of type struct flowi * and casts
them to flow_compare_t *, which is 64 bits on 64-bit machines. It
then proceeds to read and compare 64-bit values from these pointers.
The problem is that struct flowi only requires 32-bit alignment, so
these reads cause numerous unaligned exceptions. On average, I get
nearly 1000 unaligned exceptions per second.
The solutions I see are either to force the alignment of struct flowi
to 64 bits, or to use 32-bit access in flow_key_compare.
--
Måns Rullgård
mru@kth.se
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-19 0:29 Fw: [BUG] alignment problem in net/core/flow.c:flow_key_compare Andrew Morton
@ 2004-03-19 2:55 ` YOSHIFUJI Hideaki / 吉藤英明
2004-03-19 2:59 ` Andrew Morton
0 siblings, 1 reply; 9+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2004-03-19 2:55 UTC (permalink / raw)
To: davem; +Cc: netdev, akpm, mru
In article <20040318162903.59192d13.akpm@osdl.org> (at Thu, 18 Mar 2004 16:29:03 -0800), Andrew Morton <akpm@osdl.org> says:
> The solutions I see are either to force the alignment of struct flowi
> to 64 bits, or to use 32-bit access in flow_key_compare.
Here's the patch.
===== include/net/flow.h 1.10 vs edited =====
--- 1.10/include/net/flow.h Thu Jan 15 17:18:43 2004
+++ edited/include/net/flow.h Fri Mar 19 11:45:54 2004
@@ -10,6 +10,12 @@
#include <linux/in6.h>
#include <asm/atomic.h>
+#if (BITS_PER_LONG == 64)
+#define FLOWI_ALIGN_BYTES 8
+#else
+#define FLOWI_ALIGN_BYTES 4
+#endif
+
struct flowi {
int oif;
int iif;
@@ -77,7 +83,7 @@
#define fl_icmp_type uli_u.icmpt.type
#define fl_icmp_code uli_u.icmpt.code
#define fl_ipsec_spi uli_u.spi
-};
+} __attribute__((__aligned__(FLOWI_ALIGN_BYTES)));
#define FLOW_DIR_IN 0
#define FLOW_DIR_OUT 1
--
Hideaki YOSHIFUJI @ USAGI Project <yoshfuji@linux-ipv6.org>
GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-19 2:55 ` YOSHIFUJI Hideaki / 吉藤英明
@ 2004-03-19 2:59 ` Andrew Morton
2004-03-19 4:21 ` David S. Miller
2004-03-19 5:00 ` YOSHIFUJI Hideaki / 吉藤英明
0 siblings, 2 replies; 9+ messages in thread
From: Andrew Morton @ 2004-03-19 2:59 UTC (permalink / raw)
To: YOSHIFUJI Hideaki / ____________; +Cc: davem, netdev, mru
YOSHIFUJI Hideaki / ____________ <yoshfuji@linux-ipv6.org> wrote:
>
>
> +#if (BITS_PER_LONG == 64)
> +#define FLOWI_ALIGN_BYTES 8
> +#else
> +#define FLOWI_ALIGN_BYTES 4
> +#endif
> +
> struct flowi {
> int oif;
> int iif;
> @@ -77,7 +83,7 @@
> #define fl_icmp_type uli_u.icmpt.type
> #define fl_icmp_code uli_u.icmpt.code
> #define fl_ipsec_spi uli_u.spi
> -};
> +} __attribute__((__aligned__(FLOWI_ALIGN_BYTES)));
>
Why not simply
> +} __attribute__((__aligned__(BITS_PER_LONG/8)));
?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-19 2:59 ` Andrew Morton
@ 2004-03-19 4:21 ` David S. Miller
2004-03-19 5:00 ` YOSHIFUJI Hideaki / 吉藤英明
1 sibling, 0 replies; 9+ messages in thread
From: David S. Miller @ 2004-03-19 4:21 UTC (permalink / raw)
To: Andrew Morton; +Cc: yoshfuji, netdev, mru
On Thu, 18 Mar 2004 18:59:40 -0800
Andrew Morton <akpm@osdl.org> wrote:
> > -};
> > +} __attribute__((__aligned__(FLOWI_ALIGN_BYTES)));
> >
>
> Why not simply
>
> > +} __attribute__((__aligned__(BITS_PER_LONG/8)));
Works for me :-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare
2004-03-19 2:59 ` Andrew Morton
2004-03-19 4:21 ` David S. Miller
@ 2004-03-19 5:00 ` YOSHIFUJI Hideaki / 吉藤英明
1 sibling, 0 replies; 9+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2004-03-19 5:00 UTC (permalink / raw)
To: akpm, davem; +Cc: netdev, mru, yoshfuji
In article <20040318185940.45108d6a.akpm@osdl.org> (at Thu, 18 Mar 2004 18:59:40 -0800), Andrew Morton <akpm@osdl.org> says:
> Why not simply
>
> > +} __attribute__((__aligned__(BITS_PER_LONG/8)));
>
> ?
Okay;
===== include/net/flow.h 1.10 vs edited =====
--- 1.10/include/net/flow.h Thu Jan 15 17:18:43 2004
+++ edited/include/net/flow.h Fri Mar 19 12:04:32 2004
@@ -77,7 +77,7 @@
#define fl_icmp_type uli_u.icmpt.type
#define fl_icmp_code uli_u.icmpt.code
#define fl_ipsec_spi uli_u.spi
-};
+} __attribute__((__aligned__(BITS_PER_LONG/8)));
#define FLOW_DIR_IN 0
#define FLOW_DIR_OUT 1
--
Hideaki YOSHIFUJI @ USAGI Project <yoshfuji@linux-ipv6.org>
GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-03-19 5:00 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-19 0:29 Fw: [BUG] alignment problem in net/core/flow.c:flow_key_compare Andrew Morton
2004-03-19 2:55 ` YOSHIFUJI Hideaki / 吉藤英明
2004-03-19 2:59 ` Andrew Morton
2004-03-19 4:21 ` David S. Miller
2004-03-19 5:00 ` YOSHIFUJI Hideaki / 吉藤英明
-- strict thread matches above, loose matches on Subject: below --
2004-03-18 10:53 Måns Rullgård
2004-03-18 11:25 ` Måns Rullgård
2004-03-18 18:30 ` David S. Miller
2004-03-18 19:41 ` Måns Rullgård
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.