@@ -27,7 +27,7 @@ Explanation of the Linux-Kernel Memory Consistency Model
27
27
19. AND THEN THERE WAS ALPHA
28
28
20. THE HAPPENS-BEFORE RELATION: hb
29
29
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
31
31
23. LOCKING
32
32
24. ODDS AND ENDS
33
33
@@ -1425,8 +1425,8 @@ they execute means that it cannot have cycles. This requirement is
1425
1425
the content of the LKMM's "propagation" axiom.
1426
1426
1427
1427
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
+ ------------------------------------------------------------------------
1430
1430
1431
1431
RCU (Read-Copy-Update) is a powerful synchronization mechanism. It
1432
1432
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
1536
1536
after X ends.) Similarly, X ->rcu-rscsi Y ->rcu-link Z says that X is
1537
1537
the end of a critical section which starts before Z begins.
1538
1538
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
1540
1540
rcu-gp and rcu-rscsi links separated by rcu-link links, in which the
1541
1541
number of rcu-gp links is >= the number of rcu-rscsi links. For
1542
1542
example:
1543
1543
1544
1544
X ->rcu-gp Y ->rcu-link Z ->rcu-rscsi T ->rcu-link U ->rcu-gp V
1545
1545
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
1547
1547
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:
1549
1549
1550
1550
X ->rcu-rscsi Y ->rcu-link Z ->rcu-rscsi T ->rcu-link U ->rcu-gp V
1551
1551
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
1553
1553
one rcu-gp link but two rcu-rscsi links.
1554
1554
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.)
1562
1562
1563
1563
To prove this in full generality requires some intellectual effort.
1564
1564
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.
1585
1585
In particular, the write propagates to every CPU before F finishes
1586
1586
executing and hence before any instruction po-after F can execute.
1587
1587
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!)
1589
1608
1590
1609
Finally, the LKMM defines the RCU-before (rb) relation in terms of
1591
1610
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).
1596
1615
Putting this all together, the LKMM expresses the Grace Period
1597
1616
Guarantee by requiring that the rb relation does not contain a cycle.
1598
1617
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,
1600
1619
the axiom requires that there are no cycles consisting of rcu-gp and
1601
1620
rcu-rscsi alternating with rcu-link, where the number of rcu-gp links
1602
1621
is >= the number of rcu-rscsi links.
@@ -1750,7 +1769,7 @@ addition to normal RCU. The ideas involved are much the same as
1750
1769
above, with new relations srcu-gp and srcu-rscsi added to represent
1751
1770
SRCU grace periods and read-side critical sections. There is a
1752
1771
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
1754
1773
links having the same SRCU domain with proper nesting); the details
1755
1774
are relatively unimportant.
1756
1775
0 commit comments