From: Ingo Molnar <mingo@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
Peter Anvin <hpa@zytor.com>, Dave Hansen <dave@sr71.net>,
Andrew Morton <akpm@linux-foundation.org>,
Peter Zijlstra <peterz@infradead.org>,
Helge Deller <deller@gmx.de>,
Stephen Rothwell <sfr@canb.auug.org.au>,
"linux-tip-commits@vger.kernel.org"
<linux-tip-commits@vger.kernel.org>
Subject: Re: [tip:mm/pkeys] mm/pkeys: Fix siginfo ABI breakage caused by new u64 field
Date: Sat, 5 Mar 2016 14:50:06 +0100 [thread overview]
Message-ID: <20160305135006.GA15928@gmail.com> (raw)
In-Reply-To: <CA+55aFweet30JmSc8zx1+vKGCPADuKFsMBi4CETeF9w4tfi5XA@mail.gmail.com>
* Linus Torvalds <torvalds@linux-foundation.org> wrote:
> On Thu, Mar 3, 2016 at 8:53 AM, tip-bot for Dave Hansen
> <tipbot@zytor.com> wrote:
> >
> > If u64 has a natural alignment of 8 bytes (this is rare, most 32-bit
> > platforms align it to 4 bytes), then the leadup to the _sifields union
> > matters:
>
> Side note: I'm not sure that "this is rare" comment is necessarily correct.
>
> I think natural alignment is pretty common, even for 32-bit targets.
> x86-32 is I think the exception rather than the rule.
>
> There is some real odd case iirc - embedded m68k, which has some
> ridiculous alignment rules. I think it only ever aligns to 16-bit
> boundaries.
So I got curious about this, but couldn't find any good online documentation about
the alignment defaults of various architectures that GCC supports. So I reverted
the fix and added the new check from linux-next:
Revert "mm/pkeys: Fix siginfo ABI breakage caused by new u64 field"
kernel/signal.c: add compile-time check for __ARCH_SI_PREAMBLE_SIZE
... which does:
void __init signals_init(void)
{
+ /* If this check fails, the __ARCH_SI_PREAMBLE_SIZE value is wrong! */
+ BUILD_BUG_ON(__ARCH_SI_PREAMBLE_SIZE
+ != offsetof(struct siginfo, _sifields._pad));
+
and tested it on the -tip cross-arch build testing suite, which gave the following
result (only 32-bit architectures listed):
(warns) (warns)
testing x86-32: -git: pass ( 0), -tip: pass ( 0)
testing arm: -git: pass ( 1), -tip: FAIL .....
testing blackfin: -git: pass ( 0), -tip: pass ( 0)
testing cris: -git: pass ( 32), -tip: pass ( 32)
testing frv: -git: pass ( 1), -tip: FAIL .....
testing m32r: -git: pass ( 6), -tip: pass ( 6)
testing m68k: -git: pass ( 1), -tip: pass ( 1)
testing microblaze: -git: pass ( 0), -tip: pass ( 0)
testing mips: -git: pass ( 1), -tip: FAIL .....
testing openrisc: -git: pass ( 2), -tip: pass ( 2)
testing parisc: -git: pass ( 0), -tip: FAIL .....
testing sh: -git: pass ( 36), -tip: pass ( 36)
testing sparc: -git: pass ( 0), -tip: FAIL .....
testing tile: -git: pass ( 5), -tip: pass ( 5)
testing xtensa: -git: pass ( 0), -tip: FAIL .....
testing powerpc32: -git: pass ( 0), -tip: FAIL .....
so if my test is correct then it's 9 architectures that align u64 to 4 bytes, vs.
7 that align it to 8 bytes.
So naturally aligned u64 is definitely not 'rare' (so the characterisation in my
changelog is wrong), but it's not dominant either.
FWIIW: if we only list 'major' architectures then x86-32 is indeed the odd one
out...
> I do keep coming back to the fact that we should *probably* just do
> something like
>
> typedef unsigned long long __attribute__((aligned(8))) __u64;
>
> and then introduce a separate "u64_unaligned" type for all the legacy
> cases that depended on 32-bit alignment.
>
> It's horrendously nasty to test, though.
So in theory we could test most of it by comparing the disassembly of allyesconfig
builds, but comparing disassemblies is a pretty hard to use method in practice.
A more workable method would be to have a test .c file that includes all UAPI
structures in existence and defines a variable out of every single one, and then
generates a list of sizeof() values or so. But even that isn't perfect: a
structure might shift some fields forward, into a pre-existing hole, without
changing the sizeof? We'd need a list of all field offsets in all structures to be
really sure, and that's nasty.
Thanks,
Ingo
next prev parent reply other threads:[~2016-03-05 13:50 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-01 12:54 [PATCH] [v4] x86, pkeys: fix siginfo ABI breakage from new field Dave Hansen
2016-03-03 15:41 ` Ingo Molnar
2016-03-03 16:53 ` [tip:mm/pkeys] mm/pkeys: Fix siginfo ABI breakage caused by new u64 field tip-bot for Dave Hansen
2016-03-03 17:28 ` Linus Torvalds
2016-03-05 13:50 ` Ingo Molnar [this message]
2016-03-05 16:52 ` Peter Zijlstra
2016-03-06 18:45 ` Linus Torvalds
2016-03-07 8:49 ` Ingo Molnar
2016-03-05 14:03 ` tip-bot for Dave Hansen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160305135006.GA15928@gmail.com \
--to=mingo@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=dave.hansen@linux.intel.com \
--cc=dave@sr71.net \
--cc=deller@gmx.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=sfr@canb.auug.org.au \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.