public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
From: "Van Maren, Kevin" <kevin.vanmaren@unisys.com>
To: linux-ia64@vger.kernel.org
Subject: RE: [Linux-ia64] spin_unlock() problem
Date: Fri, 04 Apr 2003 14:43:29 +0000	[thread overview]
Message-ID: <marc-linux-ia64-105590723705417@msgid-missing> (raw)
In-Reply-To: <marc-linux-ia64-105590723705414@msgid-missing>

Hi Jes,

I think I have a decent understanding, but every time I start to
think that my brain explodes on another case...

> I have been tracing a problem with tty->count hitting an unidenfied
> state and I am starting to ponder if our current spin_unlock()
> implementation is sufficient.
>
> Currently the spin_unlock() implementation looks like this:

> #define spin_unlock(x)  do { barrier(); ((spinlock_t *) x)->lock
= 0;} while (0)

> barrier() doesn't guarantee memory ordering, in other words, we are not
> guaranteed that writes have been flushed to physical memory on exit. Now
> Jesse pointed out to me that spin_lock() uses aquire semantics which
> should take care of this, however this is only the case if the other CPU
> grabs a spin lock before reading the variable we wrote while holding the
> lock.

Yes, I think spin_unlock should have release semantics.
barrier() is used to prevent the compiler from reordering loads/stores,
but does not stop the processor from doing so.

...

> With our weak memory ordering, b might have been written back to memory
> while a still hasn't made it out. Or am I missing something here?

> The question is, shouldn't our spin_unlock() implementation call wmb()
> instead of barrier()? I noticed Alpha calls mb() in their spin_unlock()
> implementation.

The first example you gave certainly should work (but may not due to
the missing release on unlock); the second one you gave is NOT guaranteed
to work without you changing the code: the store to b can pass
the unlock, even with release semantics, and hence also the store to a,
(although it cannot pass the spin_lock).  (Note: if you use a wbm,
it will work, since that implements fence semantics instead of just release
semantics)

Kevin


  parent reply	other threads:[~2003-04-04 14:43 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-04  4:51 [Linux-ia64] spin_unlock() problem Jes Sorensen
2003-04-04  5:04 ` Jes Sorensen
2003-04-04 14:43 ` Van Maren, Kevin [this message]
2003-04-04 14:49 ` Van Maren, Kevin
2003-04-04 15:13 ` Jes Sorensen
2003-04-07 21:09 ` David Mosberger
2003-04-07 21:14 ` David Mosberger
2003-04-07 22:09 ` Jes Sorensen
2003-04-07 22:18 ` Luck, Tony
2003-04-07 22:58 ` David Mosberger
2003-04-07 23:13 ` Jes Sorensen
2003-04-07 23:30 ` Jim Hull
2003-04-07 23:38 ` Chen, Kenneth W
2003-04-08  0:14 ` David Mosberger
2003-04-08  0:15 ` David Mosberger

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=marc-linux-ia64-105590723705417@msgid-missing \
    --to=kevin.vanmaren@unisys.com \
    --cc=linux-ia64@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox