[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: gcc 4.5 and TLS



On Sun, Jun 06, 2010 at 08:51:05PM +0200, Geert Uytterhoeven wrote:
> On Sun, Jun 6, 2010 at 20:37, Brad Boyer <flar@allandria.com> wrote:
> > On Sun, Jun 06, 2010 at 10:42:40AM +0200, Andreas Schwab wrote:
> >> Brad Boyer <flar@allandria.com> writes:
> >>
> >> > I may be missing something obvious, but why don't we just change the
> >> > kernel to allow 2-byte alignment for m68k? The comment in futex.c
> >> > just says "natural" alignment but is then hard-coded for sizeof(u32).
> >>
> >> Natural alignment *is* sizeof.
> >
> > OK, then I guess my real question is "why does it need alignment"? I
> > obviously don't have a good understanding of the futex code, but this
> > seems like something that could have pretty significant effects. It
> > looks like the need for natural alignment is to avoid alignment
> > exceptions in the kernel or something like that, but m68k doesn't
> > have such a thing since the hardware always does it. Please let
> > me know what I missing here. I even looked at the 68040 UM to see
> > if the CAS instruction does anything odd, since I know some other
> > chips have some weird limits on atomic instructions.
> 
> As Andreas already pointed out:
> 
> kernel/futex.c:
> 
> | static void get_futex_key_refs(union futex_key *key)
> | {
> |         if (!key->both.ptr)
> |                 return;
> |
> |         switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) {
> |         case FUT_OFF_INODE:
> |                 atomic_inc(&key->shared.inode->i_count);
> |                break;
> |         case FUT_OFF_MMSHARED:
> |                 atomic_inc(&key->private.mm->mm_count);
> |                 break;
> |         }
> | }
> 
> and include/linux/futex.h:
> 
> | /*
> |  * Futexes are matched on equal values of this key.
> |  * The key type depends on whether it's a shared or private mapping.
> |  * Don't rearrange members without looking at hash_futex().
> |  *
> |  * offset is aligned to a multiple of sizeof(u32) (== 4) by definition.
> |  * We use the two low order bits of offset to tell what is the kind of key :
> |  *  00 : Private process futex (PTHREAD_PROCESS_PRIVATE)
> |  *       (no reference on an inode or mm)
> |  *  01 : Shared futex (PTHREAD_PROCESS_SHARED)
> |  *      mapped on a file (reference on the underlying inode)
> |  *  10 : Shared futex (PTHREAD_PROCESS_SHARED)
> |  *       (but private mapping on an mm, and reference taken on it)
> | */
> |
> | #define FUT_OFF_INODE    1 /* We set bit 0 if key has a reference on inode */
> | #define FUT_OFF_MMSHARED 2 /* We set bit 1 if key has a reference on mm */
> 
> I.e. the futex code uses the two low order bits for its private
> purposes (nihil novi sub sole).
> Not much we can do about that...

why does not a simple "__attribute__ ((aligned (4)))" work?

Richard


Reply to: