Date: Thu, 25 Oct 2012 04:07:28 +0200 From: Andre Oppermann <andre@freebsd.org> To: attilio@FreeBSD.org Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Jim Harris <jim.harris@gmail.com>, John Baldwin <jhb@freebsd.org> Subject: Re: svn commit: r242014 - head/sys/kern Message-ID: <50889EE0.8030105@freebsd.org> In-Reply-To: <508855DA.1080903@freebsd.org> References: <201210241836.q9OIafqo073002@svn.freebsd.org> <201210241443.25988.jhb@freebsd.org> <CAJP=Hc9wLv02sX%2BWnzZtaKccSAFzqg8jT0oP13nLw1jMfwOEBQ@mail.gmail.com> <CAJ-FndDzBdq8q6J7QKqf=abi_702s_ia=pa3XbBv80rxbGb-SA@mail.gmail.com> <50884E9F.3090706@freebsd.org> <CAJ-FndBH2cjF2ukt4373BwMsoWEeLykBhPQNnXUgpJ=4jd3LJg@mail.gmail.com> <508855DA.1080903@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 24.10.2012 22:55, Andre Oppermann wrote: > On 24.10.2012 22:29, Attilio Rao wrote: >> On Wed, Oct 24, 2012 at 9:25 PM, Andre Oppermann <andre@freebsd.org> wrote: >>> On 24.10.2012 21:06, Attilio Rao wrote: >>>> As I've already said in another thread __align() doesn't work on >>>> object declaration, so what that won't pad it either if it is global >>>> or part of a struct. >>>> It is just implemented as __attribute__((aligned(X))): >>>> http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html >>> >>> >>> Actually it seems gcc itself doesn't really care and it up to the >>> linker to honor that. >> >> Yes but the concept being that if you use __aligned() properly (when >> defining a struct) the object will be correctly sized, so you will get >> padding automatically. > > Yes. With __aligned() the start of the element/structure should > begin on an address evenly dividable by the align value *and* it > should pad out any remaining space up to the next evenly dividable > address. > > The problem we have is that is apparently doesn't work correctly > within gcc when creating structs nor within the linker when placing > such supposedly aligned structs in the .bss section (at least the > padding is missing). I spoke too soon. Attilio is completely right in his assessment. It does work when done on the struct definition: struct mtx { ... } __aligned(CACHE_LINE_SIZE); /* works including .bss alignment & padding */ When creating a struct (in globals at least) it doesn't work: struct mtx __aligned(CACHE_LINE_SIZE) foo_mtx; /* doesn't work */ > It seems to come down to either a) fixing gcc+ld; or b) hacking > around it by magically padding the structs that require it. The question now becomes of whether we can (should?) make the latter case above work or find another workaround. -- Andre
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50889EE0.8030105>