Skip to content

Commit ddc8299

Browse files
AlanSternpaulmckrcu
authored andcommitted
tools/memory-model/Documentation: Put redefinition of rcu-fence into explanation.txt
This patch updates the Linux Kernel Memory Model's explanation.txt file to incorporate the introduction of the rcu-order relation and the redefinition of rcu-fence made by commit 15aa25c ("tools/memory-model: Change definition of rcu-fence"). Signed-off-by: Alan Stern <[email protected]> Acked-by: Andrea Parri <[email protected]> Signed-off-by: Paul E. McKenney <[email protected]>
1 parent 3321ea1 commit ddc8299

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

tools/memory-model/Documentation/explanation.txt

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Explanation of the Linux-Kernel Memory Consistency Model
2727
19. AND THEN THERE WAS ALPHA
2828
20. THE HAPPENS-BEFORE RELATION: hb
2929
21. THE PROPAGATES-BEFORE RELATION: pb
30-
22. RCU RELATIONS: rcu-link, rcu-gp, rcu-rscsi, rcu-fence, and rb
30+
22. RCU RELATIONS: rcu-link, rcu-gp, rcu-rscsi, rcu-order, rcu-fence, and rb
3131
23. LOCKING
3232
24. ODDS AND ENDS
3333

@@ -1425,8 +1425,8 @@ they execute means that it cannot have cycles. This requirement is
14251425
the content of the LKMM's "propagation" axiom.
14261426

14271427

1428-
RCU RELATIONS: rcu-link, rcu-gp, rcu-rscsi, rcu-fence, and rb
1429-
-------------------------------------------------------------
1428+
RCU RELATIONS: rcu-link, rcu-gp, rcu-rscsi, rcu-order, rcu-fence, and rb
1429+
------------------------------------------------------------------------
14301430

14311431
RCU (Read-Copy-Update) is a powerful synchronization mechanism. It
14321432
rests on two concepts: grace periods and read-side critical sections.
@@ -1536,29 +1536,29 @@ Z's CPU before Z begins but doesn't propagate to some other CPU until
15361536
after X ends.) Similarly, X ->rcu-rscsi Y ->rcu-link Z says that X is
15371537
the end of a critical section which starts before Z begins.
15381538

1539-
The LKMM goes on to define the rcu-fence relation as a sequence of
1539+
The LKMM goes on to define the rcu-order relation as a sequence of
15401540
rcu-gp and rcu-rscsi links separated by rcu-link links, in which the
15411541
number of rcu-gp links is >= the number of rcu-rscsi links. For
15421542
example:
15431543

15441544
X ->rcu-gp Y ->rcu-link Z ->rcu-rscsi T ->rcu-link U ->rcu-gp V
15451545

1546-
would imply that X ->rcu-fence V, because this sequence contains two
1546+
would imply that X ->rcu-order V, because this sequence contains two
15471547
rcu-gp links and one rcu-rscsi link. (It also implies that
1548-
X ->rcu-fence T and Z ->rcu-fence V.) On the other hand:
1548+
X ->rcu-order T and Z ->rcu-order V.) On the other hand:
15491549

15501550
X ->rcu-rscsi Y ->rcu-link Z ->rcu-rscsi T ->rcu-link U ->rcu-gp V
15511551

1552-
does not imply X ->rcu-fence V, because the sequence contains only
1552+
does not imply X ->rcu-order V, because the sequence contains only
15531553
one rcu-gp link but two rcu-rscsi links.
15541554

1555-
The rcu-fence relation is important because the Grace Period Guarantee
1556-
means that rcu-fence acts kind of like a strong fence. In particular,
1557-
E ->rcu-fence F implies not only that E begins before F ends, but also
1558-
that any write po-before E will propagate to every CPU before any
1559-
instruction po-after F can execute. (However, it does not imply that
1560-
E must execute before F; in fact, each synchronize_rcu() fence event
1561-
is linked to itself by rcu-fence as a degenerate case.)
1555+
The rcu-order relation is important because the Grace Period Guarantee
1556+
means that rcu-order links act kind of like strong fences. In
1557+
particular, E ->rcu-order F implies not only that E begins before F
1558+
ends, but also that any write po-before E will propagate to every CPU
1559+
before any instruction po-after F can execute. (However, it does not
1560+
imply that E must execute before F; in fact, each synchronize_rcu()
1561+
fence event is linked to itself by rcu-order as a degenerate case.)
15621562

15631563
To prove this in full generality requires some intellectual effort.
15641564
We'll consider just a very simple case:
@@ -1585,7 +1585,26 @@ G's CPU before G starts must propagate to every CPU before C starts.
15851585
In particular, the write propagates to every CPU before F finishes
15861586
executing and hence before any instruction po-after F can execute.
15871587
This sort of reasoning can be extended to handle all the situations
1588-
covered by rcu-fence.
1588+
covered by rcu-order.
1589+
1590+
The rcu-fence relation is a simple extension of rcu-order. While
1591+
rcu-order only links certain fence events (calls to synchronize_rcu(),
1592+
rcu_read_lock(), or rcu_read_unlock()), rcu-fence links any events
1593+
that are separated by an rcu-order link. This is analogous to the way
1594+
the strong-fence relation links events that are separated by an
1595+
smp_mb() fence event (as mentioned above, rcu-order links act kind of
1596+
like strong fences). Written symbolically, X ->rcu-fence Y means
1597+
there are fence events E and F such that:
1598+
1599+
X ->po E ->rcu-order F ->po Y.
1600+
1601+
From the discussion above, we see this implies not only that X
1602+
executes before Y, but also (if X is a store) that X propagates to
1603+
every CPU before Y executes. Thus rcu-fence is sort of a
1604+
"super-strong" fence: Unlike the original strong fences (smp_mb() and
1605+
synchronize_rcu()), rcu-fence is able to link events on different
1606+
CPUs. (Perhaps this fact should lead us to say that rcu-fence isn't
1607+
really a fence at all!)
15891608

15901609
Finally, the LKMM defines the RCU-before (rb) relation in terms of
15911610
rcu-fence. This is done in essentially the same way as the pb
@@ -1596,7 +1615,7 @@ before F, just as E ->pb F does (and for much the same reasons).
15961615
Putting this all together, the LKMM expresses the Grace Period
15971616
Guarantee by requiring that the rb relation does not contain a cycle.
15981617
Equivalently, this "rcu" axiom requires that there are no events E
1599-
and F with E ->rcu-link F ->rcu-fence E. Or to put it a third way,
1618+
and F with E ->rcu-link F ->rcu-order E. Or to put it a third way,
16001619
the axiom requires that there are no cycles consisting of rcu-gp and
16011620
rcu-rscsi alternating with rcu-link, where the number of rcu-gp links
16021621
is >= the number of rcu-rscsi links.
@@ -1750,7 +1769,7 @@ addition to normal RCU. The ideas involved are much the same as
17501769
above, with new relations srcu-gp and srcu-rscsi added to represent
17511770
SRCU grace periods and read-side critical sections. There is a
17521771
restriction on the srcu-gp and srcu-rscsi links that can appear in an
1753-
rcu-fence sequence (the srcu-rscsi links must be paired with srcu-gp
1772+
rcu-order sequence (the srcu-rscsi links must be paired with srcu-gp
17541773
links having the same SRCU domain with proper nesting); the details
17551774
are relatively unimportant.
17561775

0 commit comments

Comments
 (0)