From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: David Howells <dhowells@redhat.com>
Cc: Oleg Nesterov <oleg@redhat.com>, Ingo Molnar <mingo@elte.hu>,
torvalds@osdl.org, Andrew Morton <akpm@linux-foundation.org>,
serue@us.ibm.com, viro@zeniv.linux.org.uk,
Nick Piggin <nickpiggin@yahoo.com.au>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] It may not be assumed that wake_up(), finish_wait() and co. imply a memory barrier
Date: Fri, 24 Apr 2009 11:06:12 -0700 [thread overview]
Message-ID: <20090424180612.GC6754@linux.vnet.ibm.com> (raw)
In-Reply-To: <27891.1240595286@redhat.com>
On Fri, Apr 24, 2009 at 06:48:06PM +0100, David Howells wrote:
> Paul E. McKenney <paulmck@linux.vnet.ibm.com> wrote:
>
> > Because there is no memory barrier between #2 and #3, reordering by
> > either the compiler or the CPU might cause the awakener to update the
> > event_indicated flag in #3 -before- completing its update of shared
> > state in #2.
>
> If the ordering of #2 and #3 is important with respect to each other, then the
> awakener must manually interpolate a barrier of some sort between the two
> _before_ calling wake_up() (or it should wrap them in a lock).
>
> As I've tried to make clear in my documentation:
>
> Sleeping and waking on an event flagged in global data can be viewed as
> an interaction between two pieces of data: ===> the task state of the
> task waiting for the event and the global data used to indicate the
> event <===.
>
> the barrier in wake_up() is only concerned with the ordering of #3 vs #6. That
> is all it _can_ impose an order upon, since #2 and #3 both happen before
> wake_up() is called, and #3 is what causes the sleeper to break out of the
> sleep loop.
>
> > So, for this to work correctly, don't we need at least an smp_wmb()
> > between #2 and #3 and at least an smp_rmb() between #4 and #5? And if
> > #2 does reads (but not writes) at least one variable in the shared state
> > that #5 writes to, don't both barriers need to be smp_mb()?
>
> Yes, but that's beyond the scope of this section. set_current_state() imposes
> the partial ordering { #1, #4 } and wake_up() the partial ordering { #3, #6 }
> because those are the controlling features of the loop.
>
> Managing the data beyond that is up to the caller of set_current_state() and
> the caller of wake_up().
Fair enough!
But I would strongly suggest at least a note calling this out, preferably a
"don't do this" example.
Thanx, Paul
next prev parent reply other threads:[~2009-04-24 18:06 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-13 18:17 [PATCH] slow_work_thread() should do the exclusive wait Oleg Nesterov
2009-04-13 19:03 ` Trond Myklebust
2009-04-13 19:14 ` Oleg Nesterov
2009-04-13 21:40 ` David Howells
2009-04-13 21:48 ` Oleg Nesterov
2009-04-13 21:57 ` Trond Myklebust
2009-04-13 22:24 ` Oleg Nesterov
2009-04-15 23:27 ` Andrew Morton
2009-04-16 9:10 ` David Howells
2009-04-16 14:33 ` Oleg Nesterov
2009-04-22 13:37 ` [PATCH] Document that wake_up(), complete() and co. imply a full memory barrier David Howells
2009-04-22 13:51 ` Ingo Molnar
2009-04-22 14:39 ` Oleg Nesterov
2009-04-22 14:56 ` Ingo Molnar
2009-04-22 15:07 ` Oleg Nesterov
2009-04-22 15:12 ` David Howells
2009-04-22 15:19 ` Ingo Molnar
2009-04-22 16:23 ` David Howells
2009-04-22 17:57 ` Ingo Molnar
2009-04-23 16:32 ` [PATCH] It may not be assumed that wake_up(), finish_wait() and co. imply a " David Howells
2009-04-23 16:55 ` Oleg Nesterov
2009-04-24 11:46 ` David Howells
2009-04-24 15:08 ` Paul E. McKenney
2009-04-24 17:08 ` Oleg Nesterov
2009-04-24 17:43 ` Paul E. McKenney
2009-04-24 17:48 ` David Howells
2009-04-24 18:06 ` Paul E. McKenney [this message]
2009-04-28 10:18 ` David Howells
2009-04-28 13:00 ` Paul E. McKenney
2009-04-24 17:28 ` Oleg Nesterov
2009-04-24 17:53 ` David Howells
2009-04-24 18:30 ` Oleg Nesterov
2009-04-23 17:07 ` Linus Torvalds
2009-04-23 20:35 ` David Howells
2009-04-23 21:12 ` Linus Torvalds
2009-04-23 21:24 ` Ingo Molnar
2009-04-23 16:36 ` [PATCH] Document that wake_up(), complete() and co. imply a full " Oleg Nesterov
2009-04-23 20:37 ` David Howells
2009-04-23 16:00 ` [PATCH] slow_work_thread() should do the exclusive wait David Howells
2009-04-23 16:18 ` Oleg Nesterov
2009-04-13 21:35 ` David Howells
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=20090424180612.GC6754@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=nickpiggin@yahoo.com.au \
--cc=oleg@redhat.com \
--cc=serue@us.ibm.com \
--cc=torvalds@osdl.org \
--cc=viro@zeniv.linux.org.uk \
/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.