From: Cyrill Gorcunov <gorcunov@gmail.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nick Piggin <npiggin@suse.de>, Ingo Molnar <mingo@elte.hu>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [patch][rfc] x86, mutex: non-atomic unlock (and a rant)
Date: Mon, 2 Nov 2009 19:46:26 +0300 [thread overview]
Message-ID: <20091102164626.GA10072@lenovo> (raw)
In-Reply-To: <alpine.LFD.2.01.0911020710030.31845@localhost.localdomain>
[Linus Torvalds - Mon, Nov 02, 2009 at 07:20:08AM -0800]
|
| On Mon, 2 Nov 2009, Nick Piggin wrote:
| >
| > Non-atomic unlock for mutexs maybe? I do this by relying on cache
| > coherence on a cacheline basis for ordering rather than the memory
| > consistency of the x86. Linus I know you've told me this is an incorrect
| > assumption in the past, but I'm not so sure.
|
| I'm sure.
|
| This is simply buggy:
|
| > + atomic_set(&lock->count, 1);
| > + barrier();
| > + if (unlikely(lock->waiters))
| > + fail_fn(lock);
|
| because it doesn't matter one whit whether 'lock->count' and
| 'lock->waiters' are in the same cacheline or not.
|
| The cache coherency deals in cachelines, but the instruction re-ordering
| logic does not. It's entirely possible that the CPU will turn this into
|
| tmp = lock->waiters;
| ...
| atomic_set(&lock->count, 1);
| if (tmp)
| fail_fn(lock);
|
| and your "barrier()" did absolutely nothing.
...
If we write it as
atomic_set(&lock->count, 1);
some-serializing-op(); /* say cpuid() */
if (unlikely(lock->waiters))
fail_fn(lock);
This should do the trick, though this serializing operation
is always cost too much.
The other option could be that we put two mem-write operations
like
int tmp;
atomic_set(&lock->count, 1);
tmp = lock->waiters;
rmb();
lock->waiters = tmp;
if (unlikely(lock->waiters))
fail_fn(lock);
Which should work faster then cpuid (and we have to be sure somehow
that gcc doesn't suppress this redundant operations).
-- Cyrill
next prev parent reply other threads:[~2009-11-02 16:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-02 12:07 [patch][rfc] x86, mutex: non-atomic unlock (and a rant) Nick Piggin
2009-11-02 15:20 ` Linus Torvalds
2009-11-02 16:00 ` Nick Piggin
2009-11-02 16:46 ` Cyrill Gorcunov [this message]
2009-11-02 18:09 ` Cyrill Gorcunov
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=20091102164626.GA10072@lenovo \
--to=gorcunov@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=torvalds@linux-foundation.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