OSDN Git Service

documentation: Clarify wake-up/memory-barrier relationship
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 13 May 2014 17:14:51 +0000 (10:14 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 8 Jul 2014 15:13:03 +0000 (08:13 -0700)
This commit adds an example demonstrating that if a wake_up() doesn't
actually wake something up, no memory ordering is provided.

Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Documentation/memory-barriers.txt

index f1dc4a2..a6ca533 100644 (file)
@@ -1893,6 +1893,21 @@ between the STORE to indicate the event and the STORE to set TASK_RUNNING:
            <general barrier>             STORE current->state
        LOAD event_indicated
 
+To repeat, this write memory barrier is present if and only if something
+is actually awakened.  To see this, consider the following sequence of
+events, where X and Y are both initially zero:
+
+       CPU 1                           CPU 2
+       =============================== ===============================
+       X = 1;                          STORE event_indicated
+       smp_mb();                       wake_up();
+       Y = 1;                          wait_event(wq, Y == 1);
+       wake_up();                        load from Y sees 1, no memory barrier
+                                       load from X might see 0
+
+In contrast, if a wakeup does occur, CPU 2's load from X would be guaranteed
+to see 1.
+
 The available waker functions include:
 
        complete();