Skip site navigation (1)Skip section navigation (2)
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>