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 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.