From: Alex Shi <alex.shi@intel.com>
To: Arnd Bergmann <arnd@arndb.de>, gcc@gcc.gnu.org
Cc: Ingo Molnar <mingo@elte.hu>,
tglx@linutronix.de, "mingo@redhat.com" <mingo@redhat.com>,
hpa@zytor.com, akpm@linux-foundation.org,
linux-kernel@vger.kernel.org, x86@kernel.org,
andi.kleen@intel.com, gcc-help@gcc.gnu.org
Subject: Re: [RFC patch] spindep: add cross cache lines checking
Date: Wed, 07 Mar 2012 16:23:27 +0800 [thread overview]
Message-ID: <1331108607.18835.343.camel@debian> (raw)
In-Reply-To: <201203060932.45223.arnd@arndb.de>
On Tue, 2012-03-06 at 09:32 +0000, Arnd Bergmann wrote:
> On Tuesday 06 March 2012, Alex Shi wrote:
> > I have one concern and one questions here:
> > concern: maybe the lock is in a well designed 'packed' struct, and it is
> > safe for cross lines issue. but __alignof__ will return 1;
> >
> > struct abc{
> > raw_spinlock_t lock1;
> > char a;
> > char b;
> > }__attribute__((packed));
> >
> > Since the lock is the first object of struct, usually it is well placed.
>
> No, it's actually not. The structure has an external alignment of 1, so
> if you have an array of these or put it into another struct like
>
> struct xyz {
> char x;
> struct abc a;
> };
>
> then it will be misaligned. Thre is no such thing as a well designed 'packed'
> struct. The only reason to use packing is to describe structures we have no
> control over such as hardware layouts and on-wire formats that have unusal
> alignments, and those will never have a spinlock on them.
Understand. thx. So is the following checking that your wanted?
===
diff --git a/include/linux/rwlock.h b/include/linux/rwlock.h
index bc2994e..64828a3 100644
--- a/include/linux/rwlock.h
+++ b/include/linux/rwlock.h
@@ -21,10 +21,12 @@
do { \
static struct lock_class_key __key; \
\
+ BUILD_BUG_ON(__alignof__(lock) == 1); \
__rwlock_init((lock), #lock, &__key); \
} while (0)
#else
# define rwlock_init(lock) \
+ BUILD_BUG_ON(__alignof__(lock) == 1); \
do { *(lock) = __RW_LOCK_UNLOCKED(lock); } while (0)
#endif
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
index 7df6c17..df8a992 100644
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -96,11 +96,13 @@
do { \
static struct lock_class_key __key; \
\
+ BUILD_BUG_ON(__alignof__(lock) == 1); \
__raw_spin_lock_init((lock), #lock, &__key); \
} while (0)
#else
# define raw_spin_lock_init(lock) \
+ BUILD_BUG_ON(__alignof__(lock) == 1); \
do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
#endif
===
Btw,
1, it is alignof bug for default gcc on my fc15 and Ubuntu 11.10 etc?
struct sub {
int raw_lock;
char a;
};
struct foo {
struct sub z;
int slk;
char y;
}__attribute__((packed));
struct foo f1;
__alignof__(f1.z.raw_lock) is 4, but its address actually can align on
one byte.
>
> Arnd
next prev parent reply other threads:[~2012-03-07 8:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-05 3:20 [RFC patch] spin_lock: add cross cache lines checking Alex Shi
2012-03-05 3:24 ` Alex Shi
2012-03-05 5:43 ` [RFC patch] spindep: " Alex Shi
2012-03-05 5:48 ` Alex Shi
2012-03-05 9:41 ` Arnd Bergmann
2012-03-05 10:43 ` Ingo Molnar
2012-03-06 6:13 ` Alex Shi
2012-03-06 6:18 ` Alex Shi
2012-03-06 9:32 ` Arnd Bergmann
2012-03-07 8:23 ` Alex Shi [this message]
2012-03-07 11:54 ` Arnd Bergmann
2012-03-07 13:13 ` Alex Shi
2012-03-07 13:39 ` Ingo Molnar
2012-03-08 2:21 ` Alex Shi
2012-03-08 7:13 ` Ingo Molnar
2012-03-09 1:20 ` Alex Shi
2012-03-08 2:30 ` Alex Shi
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=1331108607.18835.343.camel@debian \
--to=alex.shi@intel.com \
--cc=akpm@linux-foundation.org \
--cc=andi.kleen@intel.com \
--cc=arnd@arndb.de \
--cc=gcc-help@gcc.gnu.org \
--cc=gcc@gcc.gnu.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.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.