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]
[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]
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.
"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]