On 11/8/18 2:00 PM, Matthew Wilcox wrote:
> struct a {
>       char c;
>       struct b b;
> };
> 
> we want struct b to start at offset 8, but with __packed, it will start
> at offset 1.

You're talking about how we want the struct laid out in memory if we
have control over the layout.  I'm talking about what happens if
something *else* tells us the layout, like a hardware specification
which is what is in play with the XSAVE instruction dictated layout
that's in question here.

What I'm concerned about is a structure like this:

struct foo {
        u32 i1;
        u64 i2;
};

If we leave that to natural alignment, we end up with a 16-byte
structure laid out like this:

        0-3     i1
        3-8     alignment gap
        8-15    i2

Which isn't what we want.  We want a 12-byte structure, laid out like this:

        0-3     i1
        4-11    i2

Which we get with:


struct foo {
        u32 i1;
        u64 i2;
} __packed;

Now, looking at Yu-cheng's specific example, it doesn't matter.  We've
got 64-bit types and natural 64-bit alignment.  Without __packed, we
need to look out for natural alignment screwing us up.  With __packed,
it just does what it *looks* like it does.

Reply via email to