2004-03-18 10:53:08

by Måns Rullgård

[permalink] [raw]
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
[email protected]


2004-03-18 11:26:03

by Måns Rullgård

[permalink] [raw]
Subject: Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare

[email protected] (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
[email protected]

2004-03-18 18:30:15

by David Miller

[permalink] [raw]
Subject: Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare

On Thu, 18 Mar 2004 12:25:57 +0100
[email protected] (M?ns Rullg?rd) wrote:

> [email protected] (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.

2004-03-18 19:42:01

by Måns Rullgård

[permalink] [raw]
Subject: Re: [BUG] alignment problem in net/core/flow.c:flow_key_compare

"David S. Miller" <[email protected]> writes:

> On Thu, 18 Mar 2004 12:25:57 +0100
> [email protected] (M?ns Rullg?rd) wrote:
>
>> [email protected] (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
[email protected]