[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <27891.1240595286@redhat.com>
Date: Fri, 24 Apr 2009 18:48:06 +0100
From: David Howells <dhowells@...hat.com>
To: paulmck@...ux.vnet.ibm.com
Cc: dhowells@...hat.com, Oleg Nesterov <oleg@...hat.com>,
Ingo Molnar <mingo@...e.hu>, torvalds@...l.org,
Andrew Morton <akpm@...ux-foundation.org>, serue@...ibm.com,
viro@...iv.linux.org.uk, Nick Piggin <nickpiggin@...oo.com.au>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] It may not be assumed that wake_up(), finish_wait() and co. imply a memory barrier
Paul E. McKenney <paulmck@...ux.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().
David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists