diff options
| -rw-r--r-- | Documentation/RCU/NMI-RCU.txt | 3 | ||||
| -rw-r--r-- | Documentation/RCU/RTFP.txt | 108 | ||||
| -rw-r--r-- | Documentation/RCU/checklist.txt | 89 | ||||
| -rw-r--r-- | Documentation/RCU/whatisRCU.txt | 58 |
4 files changed, 210 insertions, 48 deletions
diff --git a/Documentation/RCU/NMI-RCU.txt b/Documentation/RCU/NMI-RCU.txt index c64158ecde43..a6d32e65d222 100644 --- a/Documentation/RCU/NMI-RCU.txt +++ b/Documentation/RCU/NMI-RCU.txt | |||
| @@ -93,6 +93,9 @@ Since NMI handlers disable preemption, synchronize_sched() is guaranteed | |||
| 93 | not to return until all ongoing NMI handlers exit. It is therefore safe | 93 | not to return until all ongoing NMI handlers exit. It is therefore safe |
| 94 | to free up the handler's data as soon as synchronize_sched() returns. | 94 | to free up the handler's data as soon as synchronize_sched() returns. |
| 95 | 95 | ||
| 96 | Important note: for this to work, the architecture in question must | ||
| 97 | invoke irq_enter() and irq_exit() on NMI entry and exit, respectively. | ||
| 98 | |||
| 96 | 99 | ||
| 97 | Answer to Quick Quiz | 100 | Answer to Quick Quiz |
| 98 | 101 | ||
diff --git a/Documentation/RCU/RTFP.txt b/Documentation/RCU/RTFP.txt index 39ad8f56783a..9f711d2df91b 100644 --- a/Documentation/RCU/RTFP.txt +++ b/Documentation/RCU/RTFP.txt | |||
| @@ -52,6 +52,10 @@ of each iteration. Unfortunately, chaotic relaxation requires highly | |||
| 52 | structured data, such as the matrices used in scientific programs, and | 52 | structured data, such as the matrices used in scientific programs, and |
| 53 | is thus inapplicable to most data structures in operating-system kernels. | 53 | is thus inapplicable to most data structures in operating-system kernels. |
| 54 | 54 | ||
| 55 | In 1992, Henry (now Alexia) Massalin completed a dissertation advising | ||
| 56 | parallel programmers to defer processing when feasible to simplify | ||
| 57 | synchronization. RCU makes extremely heavy use of this advice. | ||
| 58 | |||
| 55 | In 1993, Jacobson [Jacobson93] verbally described what is perhaps the | 59 | In 1993, Jacobson [Jacobson93] verbally described what is perhaps the |
| 56 | simplest deferred-free technique: simply waiting a fixed amount of time | 60 | simplest deferred-free technique: simply waiting a fixed amount of time |
| 57 | before freeing blocks awaiting deferred free. Jacobson did not describe | 61 | before freeing blocks awaiting deferred free. Jacobson did not describe |
| @@ -138,6 +142,13 @@ blocking in read-side critical sections appeared [PaulEMcKenney2006c], | |||
| 138 | Robert Olsson described an RCU-protected trie-hash combination | 142 | Robert Olsson described an RCU-protected trie-hash combination |
| 139 | [RobertOlsson2006a]. | 143 | [RobertOlsson2006a]. |
| 140 | 144 | ||
| 145 | 2007 saw the journal version of the award-winning RCU paper from 2006 | ||
| 146 | [ThomasEHart2007a], as well as a paper demonstrating use of Promela | ||
| 147 | and Spin to mechanically verify an optimization to Oleg Nesterov's | ||
| 148 | QRCU [PaulEMcKenney2007QRCUspin], a design document describing | ||
| 149 | preemptible RCU [PaulEMcKenney2007PreemptibleRCU], and the three-part | ||
| 150 | LWN "What is RCU?" series [PaulEMcKenney2007WhatIsRCUFundamentally, | ||
| 151 | PaulEMcKenney2008WhatIsRCUUsage, and PaulEMcKenney2008WhatIsRCUAPI]. | ||
| 141 | 152 | ||
| 142 | Bibtex Entries | 153 | Bibtex Entries |
| 143 | 154 | ||
| @@ -202,6 +213,20 @@ Bibtex Entries | |||
| 202 | ,Year="1991" | 213 | ,Year="1991" |
| 203 | } | 214 | } |
| 204 | 215 | ||
| 216 | @phdthesis{HMassalinPhD | ||
| 217 | ,author="H. Massalin" | ||
| 218 | ,title="Synthesis: An Efficient Implementation of Fundamental Operating | ||
| 219 | System Services" | ||
| 220 | ,school="Columbia University" | ||
| 221 | ,address="New York, NY" | ||
| 222 | ,year="1992" | ||
| 223 | ,annotation=" | ||
| 224 | Mondo optimizing compiler. | ||
| 225 | Wait-free stuff. | ||
| 226 | Good advice: defer work to avoid synchronization. | ||
| 227 | " | ||
| 228 | } | ||
| 229 | |||
| 205 | @unpublished{Jacobson93 | 230 | @unpublished{Jacobson93 |
| 206 | ,author="Van Jacobson" | 231 | ,author="Van Jacobson" |
| 207 | ,title="Avoid Read-Side Locking Via Delayed Free" | 232 | ,title="Avoid Read-Side Locking Via Delayed Free" |
| @@ -635,3 +660,86 @@ Revised: | |||
| 635 | " | 660 | " |
| 636 | } | 661 | } |
| 637 | 662 | ||
| 663 | @unpublished{PaulEMcKenney2007PreemptibleRCU | ||
| 664 | ,Author="Paul E. McKenney" | ||
| 665 | ,Title="The design of preemptible read-copy-update" | ||
| 666 | ,month="October" | ||
| 667 | ,day="8" | ||
| 668 | ,year="2007" | ||
| 669 | ,note="Available: | ||
| 670 | \url{http://lwn.net/Articles/253651/} | ||
| 671 | [Viewed October 25, 2007]" | ||
| 672 | ,annotation=" | ||
| 673 | LWN article describing the design of preemptible RCU. | ||
| 674 | " | ||
| 675 | } | ||
| 676 | |||
| 677 | ######################################################################## | ||
| 678 | # | ||
| 679 | # "What is RCU?" LWN series. | ||
| 680 | # | ||
| 681 | |||
| 682 | @unpublished{PaulEMcKenney2007WhatIsRCUFundamentally | ||
| 683 | ,Author="Paul E. McKenney and Jonathan Walpole" | ||
| 684 | ,Title="What is {RCU}, Fundamentally?" | ||
| 685 | ,month="December" | ||
| 686 | ,day="17" | ||
| 687 | ,year="2007" | ||
| 688 | ,note="Available: | ||
| 689 | \url{http://lwn.net/Articles/262464/} | ||
| 690 | [Viewed December 27, 2007]" | ||
| 691 | ,annotation=" | ||
| 692 | Lays out the three basic components of RCU: (1) publish-subscribe, | ||
| 693 | (2) wait for pre-existing readers to complete, and (2) maintain | ||
| 694 | multiple versions. | ||
| 695 | " | ||
| 696 | } | ||
| 697 | |||
| 698 | @unpublished{PaulEMcKenney2008WhatIsRCUUsage | ||
| 699 | ,Author="Paul E. McKenney" | ||
| 700 | ,Title="What is {RCU}? Part 2: Usage" | ||
| 701 | ,month="January" | ||
| 702 | ,day="4" | ||
| 703 | ,year="2008" | ||
| 704 | ,note="Available: | ||
| 705 | \url{http://lwn.net/Articles/263130/} | ||
| 706 | [Viewed January 4, 2008]" | ||
| 707 | ,annotation=" | ||
| 708 | Lays out six uses of RCU: | ||
| 709 | 1. RCU is a Reader-Writer Lock Replacement | ||
| 710 | 2. RCU is a Restricted Reference-Counting Mechanism | ||
| 711 | 3. RCU is a Bulk Reference-Counting Mechanism | ||
| 712 | 4. RCU is a Poor Man's Garbage Collector | ||
| 713 | 5. RCU is a Way of Providing Existence Guarantees | ||
| 714 | 6. RCU is a Way of Waiting for Things to Finish | ||
| 715 | " | ||
| 716 | } | ||
| 717 | |||
| 718 | @unpublished{PaulEMcKenney2008WhatIsRCUAPI | ||
| 719 | ,Author="Paul E. McKenney" | ||
| 720 | ,Title="{RCU} part 3: the {RCU} {API}" | ||
| 721 | ,month="January" | ||
| 722 | ,day="17" | ||
| 723 | ,year="2008" | ||
| 724 | ,note="Available: | ||
| 725 | \url{http://lwn.net/Articles/264090/} | ||
| 726 | [Viewed January 10, 2008]" | ||
| 727 | ,annotation=" | ||
| 728 | Gives an overview of the Linux-kernel RCU API and a brief annotated RCU | ||
| 729 | bibliography. | ||
| 730 | " | ||
| 731 | } | ||
| 732 | |||
| 733 | @article{DinakarGuniguntala2008IBMSysJ | ||
| 734 | ,author="D. Guniguntala and P. E. McKenney and J. Triplett and J. Walpole" | ||
| 735 | ,title="The read-copy-update mechanism for supporting real-time applications on shared-memory multiprocessor systems with {Linux}" | ||
| 736 | ,Year="2008" | ||
| 737 | ,Month="April" | ||
| 738 | ,journal="IBM Systems Journal" | ||
| 739 | ,volume="47" | ||
| 740 | ,number="2" | ||
| 741 | ,pages="@@-@@" | ||
| 742 | ,annotation=" | ||
| 743 | RCU, realtime RCU, sleepable RCU, performance. | ||
| 744 | " | ||
| 745 | } | ||
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index 42b01bc2e1b4..cf5562cbe356 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt | |||
| @@ -13,10 +13,13 @@ over a rather long period of time, but improvements are always welcome! | |||
| 13 | detailed performance measurements show that RCU is nonetheless | 13 | detailed performance measurements show that RCU is nonetheless |
| 14 | the right tool for the job. | 14 | the right tool for the job. |
| 15 | 15 | ||
| 16 | The other exception would be where performance is not an issue, | 16 | Another exception is where performance is not an issue, and RCU |
| 17 | and RCU provides a simpler implementation. An example of this | 17 | provides a simpler implementation. An example of this situation |
| 18 | situation is the dynamic NMI code in the Linux 2.6 kernel, | 18 | is the dynamic NMI code in the Linux 2.6 kernel, at least on |
| 19 | at least on architectures where NMIs are rare. | 19 | architectures where NMIs are rare. |
| 20 | |||
| 21 | Yet another exception is where the low real-time latency of RCU's | ||
| 22 | read-side primitives is critically important. | ||
| 20 | 23 | ||
| 21 | 1. Does the update code have proper mutual exclusion? | 24 | 1. Does the update code have proper mutual exclusion? |
| 22 | 25 | ||
| @@ -39,9 +42,10 @@ over a rather long period of time, but improvements are always welcome! | |||
| 39 | 42 | ||
| 40 | 2. Do the RCU read-side critical sections make proper use of | 43 | 2. Do the RCU read-side critical sections make proper use of |
| 41 | rcu_read_lock() and friends? These primitives are needed | 44 | rcu_read_lock() and friends? These primitives are needed |
| 42 | to suppress preemption (or bottom halves, in the case of | 45 | to prevent grace periods from ending prematurely, which |
| 43 | rcu_read_lock_bh()) in the read-side critical sections, | 46 | could result in data being unceremoniously freed out from |
| 44 | and are also an excellent aid to readability. | 47 | under your read-side code, which can greatly increase the |
| 48 | actuarial risk of your kernel. | ||
| 45 | 49 | ||
| 46 | As a rough rule of thumb, any dereference of an RCU-protected | 50 | As a rough rule of thumb, any dereference of an RCU-protected |
| 47 | pointer must be covered by rcu_read_lock() or rcu_read_lock_bh() | 51 | pointer must be covered by rcu_read_lock() or rcu_read_lock_bh() |
| @@ -54,15 +58,30 @@ over a rather long period of time, but improvements are always welcome! | |||
| 54 | be running while updates are in progress. There are a number | 58 | be running while updates are in progress. There are a number |
| 55 | of ways to handle this concurrency, depending on the situation: | 59 | of ways to handle this concurrency, depending on the situation: |
| 56 | 60 | ||
| 57 | a. Make updates appear atomic to readers. For example, | 61 | a. Use the RCU variants of the list and hlist update |
| 62 | primitives to add, remove, and replace elements on an | ||
| 63 | RCU-protected list. Alternatively, use the RCU-protected | ||
| 64 | trees that have been added to the Linux kernel. | ||
| 65 | |||
| 66 | This is almost always the best approach. | ||
| 67 | |||
| 68 | b. Proceed as in (a) above, but also maintain per-element | ||
| 69 | locks (that are acquired by both readers and writers) | ||
| 70 | that guard per-element state. Of course, fields that | ||
| 71 | the readers refrain from accessing can be guarded by the | ||
| 72 | update-side lock. | ||
| 73 | |||
| 74 | This works quite well, also. | ||
| 75 | |||
| 76 | c. Make updates appear atomic to readers. For example, | ||
| 58 | pointer updates to properly aligned fields will appear | 77 | pointer updates to properly aligned fields will appear |
| 59 | atomic, as will individual atomic primitives. Operations | 78 | atomic, as will individual atomic primitives. Operations |
| 60 | performed under a lock and sequences of multiple atomic | 79 | performed under a lock and sequences of multiple atomic |
| 61 | primitives will -not- appear to be atomic. | 80 | primitives will -not- appear to be atomic. |
| 62 | 81 | ||
| 63 | This is almost always the best approach. | 82 | This can work, but is starting to get a bit tricky. |
| 64 | 83 | ||
| 65 | b. Carefully order the updates and the reads so that | 84 | d. Carefully order the updates and the reads so that |
| 66 | readers see valid data at all phases of the update. | 85 | readers see valid data at all phases of the update. |
| 67 | This is often more difficult than it sounds, especially | 86 | This is often more difficult than it sounds, especially |
| 68 | given modern CPUs' tendency to reorder memory references. | 87 | given modern CPUs' tendency to reorder memory references. |
| @@ -123,18 +142,22 @@ over a rather long period of time, but improvements are always welcome! | |||
| 123 | when publicizing a pointer to a structure that can | 142 | when publicizing a pointer to a structure that can |
| 124 | be traversed by an RCU read-side critical section. | 143 | be traversed by an RCU read-side critical section. |
| 125 | 144 | ||
| 126 | 5. If call_rcu(), or a related primitive such as call_rcu_bh(), | 145 | 5. If call_rcu(), or a related primitive such as call_rcu_bh() or |
| 127 | is used, the callback function must be written to be called | 146 | call_rcu_sched(), is used, the callback function must be |
| 128 | from softirq context. In particular, it cannot block. | 147 | written to be called from softirq context. In particular, |
| 148 | it cannot block. | ||
| 129 | 149 | ||
| 130 | 6. Since synchronize_rcu() can block, it cannot be called from | 150 | 6. Since synchronize_rcu() can block, it cannot be called from |
| 131 | any sort of irq context. | 151 | any sort of irq context. Ditto for synchronize_sched() and |
| 152 | synchronize_srcu(). | ||
| 132 | 153 | ||
| 133 | 7. If the updater uses call_rcu(), then the corresponding readers | 154 | 7. If the updater uses call_rcu(), then the corresponding readers |
| 134 | must use rcu_read_lock() and rcu_read_unlock(). If the updater | 155 | must use rcu_read_lock() and rcu_read_unlock(). If the updater |
| 135 | uses call_rcu_bh(), then the corresponding readers must use | 156 | uses call_rcu_bh(), then the corresponding readers must use |
| 136 | rcu_read_lock_bh() and rcu_read_unlock_bh(). Mixing things up | 157 | rcu_read_lock_bh() and rcu_read_unlock_bh(). If the updater |
| 137 | will result in confusion and broken kernels. | 158 | uses call_rcu_sched(), then the corresponding readers must |
| 159 | disable preemption. Mixing things up will result in confusion | ||
| 160 | and broken kernels. | ||
| 138 | 161 | ||
| 139 | One exception to this rule: rcu_read_lock() and rcu_read_unlock() | 162 | One exception to this rule: rcu_read_lock() and rcu_read_unlock() |
| 140 | may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh() | 163 | may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh() |
| @@ -143,9 +166,9 @@ over a rather long period of time, but improvements are always welcome! | |||
| 143 | such cases is a must, of course! And the jury is still out on | 166 | such cases is a must, of course! And the jury is still out on |
| 144 | whether the increased speed is worth it. | 167 | whether the increased speed is worth it. |
| 145 | 168 | ||
| 146 | 8. Although synchronize_rcu() is a bit slower than is call_rcu(), | 169 | 8. Although synchronize_rcu() is slower than is call_rcu(), it |
| 147 | it usually results in simpler code. So, unless update | 170 | usually results in simpler code. So, unless update performance |
| 148 | performance is critically important or the updaters cannot block, | 171 | is critically important or the updaters cannot block, |
| 149 | synchronize_rcu() should be used in preference to call_rcu(). | 172 | synchronize_rcu() should be used in preference to call_rcu(). |
| 150 | 173 | ||
| 151 | An especially important property of the synchronize_rcu() | 174 | An especially important property of the synchronize_rcu() |
| @@ -187,23 +210,23 @@ over a rather long period of time, but improvements are always welcome! | |||
| 187 | number of updates per grace period. | 210 | number of updates per grace period. |
| 188 | 211 | ||
| 189 | 9. All RCU list-traversal primitives, which include | 212 | 9. All RCU list-traversal primitives, which include |
| 190 | list_for_each_rcu(), list_for_each_entry_rcu(), | 213 | rcu_dereference(), list_for_each_rcu(), list_for_each_entry_rcu(), |
| 191 | list_for_each_continue_rcu(), and list_for_each_safe_rcu(), | 214 | list_for_each_continue_rcu(), and list_for_each_safe_rcu(), |
| 192 | must be within an RCU read-side critical section. RCU | 215 | must be either within an RCU read-side critical section or |
| 216 | must be protected by appropriate update-side locks. RCU | ||
| 193 | read-side critical sections are delimited by rcu_read_lock() | 217 | read-side critical sections are delimited by rcu_read_lock() |
| 194 | and rcu_read_unlock(), or by similar primitives such as | 218 | and rcu_read_unlock(), or by similar primitives such as |
| 195 | rcu_read_lock_bh() and rcu_read_unlock_bh(). | 219 | rcu_read_lock_bh() and rcu_read_unlock_bh(). |
| 196 | 220 | ||
| 197 | Use of the _rcu() list-traversal primitives outside of an | 221 | The reason that it is permissible to use RCU list-traversal |
| 198 | RCU read-side critical section causes no harm other than | 222 | primitives when the update-side lock is held is that doing so |
| 199 | a slight performance degradation on Alpha CPUs. It can | 223 | can be quite helpful in reducing code bloat when common code is |
| 200 | also be quite helpful in reducing code bloat when common | 224 | shared between readers and updaters. |
| 201 | code is shared between readers and updaters. | ||
| 202 | 225 | ||
| 203 | 10. Conversely, if you are in an RCU read-side critical section, | 226 | 10. Conversely, if you are in an RCU read-side critical section, |
| 204 | you -must- use the "_rcu()" variants of the list macros. | 227 | and you don't hold the appropriate update-side lock, you -must- |
| 205 | Failing to do so will break Alpha and confuse people reading | 228 | use the "_rcu()" variants of the list macros. Failing to do so |
| 206 | your code. | 229 | will break Alpha and confuse people reading your code. |
| 207 | 230 | ||
| 208 | 11. Note that synchronize_rcu() -only- guarantees to wait until | 231 | 11. Note that synchronize_rcu() -only- guarantees to wait until |
| 209 | all currently executing rcu_read_lock()-protected RCU read-side | 232 | all currently executing rcu_read_lock()-protected RCU read-side |
| @@ -230,6 +253,14 @@ over a rather long period of time, but improvements are always welcome! | |||
| 230 | must use whatever locking or other synchronization is required | 253 | must use whatever locking or other synchronization is required |
| 231 | to safely access and/or modify that data structure. | 254 | to safely access and/or modify that data structure. |
| 232 | 255 | ||
| 256 | RCU callbacks are -usually- executed on the same CPU that executed | ||
| 257 | the corresponding call_rcu(), call_rcu_bh(), or call_rcu_sched(), | ||
| 258 | but are by -no- means guaranteed to be. For example, if a given | ||
| 259 | CPU goes offline while having an RCU callback pending, then that | ||
| 260 | RCU callback will execute on some surviving CPU. (If this was | ||
| 261 | not the case, a self-spawning RCU callback would prevent the | ||
| 262 | victim CPU from ever going offline.) | ||
| 263 | |||
| 233 | 14. SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu()) | 264 | 14. SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu()) |
| 234 | may only be invoked from process context. Unlike other forms of | 265 | may only be invoked from process context. Unlike other forms of |
| 235 | RCU, it -is- permissible to block in an SRCU read-side critical | 266 | RCU, it -is- permissible to block in an SRCU read-side critical |
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index e0d6d99b8f9b..e04d643a9f57 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | Please note that the "What is RCU?" LWN series is an excellent place | ||
| 2 | to start learning about RCU: | ||
| 3 | |||
| 4 | 1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/ | ||
| 5 | 2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/ | ||
| 6 | 3. RCU part 3: the RCU API http://lwn.net/Articles/264090/ | ||
| 7 | |||
| 8 | |||
| 1 | What is RCU? | 9 | What is RCU? |
| 2 | 10 | ||
| 3 | RCU is a synchronization mechanism that was added to the Linux kernel | 11 | RCU is a synchronization mechanism that was added to the Linux kernel |
| @@ -772,26 +780,18 @@ Linux-kernel source code, but it helps to have a full list of the | |||
| 772 | APIs, since there does not appear to be a way to categorize them | 780 | APIs, since there does not appear to be a way to categorize them |
| 773 | in docbook. Here is the list, by category. | 781 | in docbook. Here is the list, by category. |
| 774 | 782 | ||
| 775 | Markers for RCU read-side critical sections: | ||
| 776 | |||
| 777 | rcu_read_lock | ||
| 778 | rcu_read_unlock | ||
| 779 | rcu_read_lock_bh | ||
| 780 | rcu_read_unlock_bh | ||
| 781 | srcu_read_lock | ||
| 782 | srcu_read_unlock | ||
| 783 | |||
| 784 | RCU pointer/list traversal: | 783 | RCU pointer/list traversal: |
| 785 | 784 | ||
| 786 | rcu_dereference | 785 | rcu_dereference |
| 786 | list_for_each_entry_rcu | ||
| 787 | hlist_for_each_entry_rcu | ||
| 788 | |||
| 787 | list_for_each_rcu (to be deprecated in favor of | 789 | list_for_each_rcu (to be deprecated in favor of |
| 788 | list_for_each_entry_rcu) | 790 | list_for_each_entry_rcu) |
| 789 | list_for_each_entry_rcu | ||
| 790 | list_for_each_continue_rcu (to be deprecated in favor of new | 791 | list_for_each_continue_rcu (to be deprecated in favor of new |
| 791 | list_for_each_entry_continue_rcu) | 792 | list_for_each_entry_continue_rcu) |
| 792 | hlist_for_each_entry_rcu | ||
| 793 | 793 | ||
| 794 | RCU pointer update: | 794 | RCU pointer/list update: |
| 795 | 795 | ||
| 796 | rcu_assign_pointer | 796 | rcu_assign_pointer |
| 797 | list_add_rcu | 797 | list_add_rcu |
| @@ -799,16 +799,36 @@ RCU pointer update: | |||
| 799 | list_del_rcu | 799 | list_del_rcu |
| 800 | list_replace_rcu | 800 | list_replace_rcu |
| 801 | hlist_del_rcu | 801 | hlist_del_rcu |
| 802 | hlist_add_after_rcu | ||
| 803 | hlist_add_before_rcu | ||
| 802 | hlist_add_head_rcu | 804 | hlist_add_head_rcu |
| 805 | hlist_replace_rcu | ||
| 806 | list_splice_init_rcu() | ||
| 803 | 807 | ||
| 804 | RCU grace period: | 808 | RCU: Critical sections Grace period Barrier |
| 809 | |||
| 810 | rcu_read_lock synchronize_net rcu_barrier | ||
| 811 | rcu_read_unlock synchronize_rcu | ||
| 812 | call_rcu | ||
| 813 | |||
| 814 | |||
| 815 | bh: Critical sections Grace period Barrier | ||
| 816 | |||
| 817 | rcu_read_lock_bh call_rcu_bh rcu_barrier_bh | ||
| 818 | rcu_read_unlock_bh | ||
| 819 | |||
| 820 | |||
| 821 | sched: Critical sections Grace period Barrier | ||
| 822 | |||
| 823 | [preempt_disable] synchronize_sched rcu_barrier_sched | ||
| 824 | [and friends] call_rcu_sched | ||
| 825 | |||
| 826 | |||
| 827 | SRCU: Critical sections Grace period Barrier | ||
| 828 | |||
| 829 | srcu_read_lock synchronize_srcu N/A | ||
| 830 | srcu_read_unlock | ||
| 805 | 831 | ||
| 806 | synchronize_net | ||
| 807 | synchronize_sched | ||
| 808 | synchronize_rcu | ||
| 809 | synchronize_srcu | ||
| 810 | call_rcu | ||
| 811 | call_rcu_bh | ||
| 812 | 832 | ||
| 813 | See the comment headers in the source code (or the docbook generated | 833 | See the comment headers in the source code (or the docbook generated |
| 814 | from them) for more information. | 834 | from them) for more information. |
