Thread (32 messages) 32 messages, 9 authors, 2007-06-16

Re: [PATCH] Introduce compat_u64 and compat_s64 types

From: Arnd Bergmann <arnd@arndb.de>
Date: 2007-06-15 12:43:27
Also in: lkml

On Friday 15 June 2007, Matthew Wilcox wrote:
You're relying on compat_[us]64 being only used in structures which are
already packed.  If someone uses them in a non-packed struct, they won't
decrease the alignment.  I think it would be more effective to specify
it as:

__attribute__((aligned(4), packed))
That's what I thought as well at first, since this is how the gcc 
documentation seems to describe it. However, recent version of gcc
complain about this:

gcc-4.1 -Wall -O2 test.c  -c
test.c:1: warning: 'packed' attribute ignored

I have tested versions 2.95, 3.3 and 4.1, an they all ignore do the
right thing when you do not specify the packed attribute.
The other problem is that if someone defines a struct like this:

struct foo {
        short bar;
        compat_s64 baz;
} __attribute__((packed))

it'll have different definitions on x86 and ia64.

So I think we should be aiming for the ((aligned, packed)) definition and
remove the __attribute__((packed)) from the struct definitions.  What do
you think?
There should never be an __attribute__((packed)) to solve this alignment
problem, neither in the definition of compat_s64 nor in the definition of
a data structure using it.

We might ask the gcc developers to clarify the documentation, which as of 4.1
states:

     The `aligned' attribute can only increase the alignment; but you
     can decrease it by specifying `packed' as well.  See below.

My understanding is that this only applies to statically allocated variables,
but not to automatic stack variables and to usage of the type inside of
a data structure.

	Arnd <><
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help