Commit | Line | Data |
---|---|---|
a9f0969c | 1 | .. _rcu_doc: |
1da177e4 | 2 | |
a9f0969c JC |
3 | RCU Concepts |
4 | ============ | |
1da177e4 LT |
5 | |
6 | The basic idea behind RCU (read-copy update) is to split destructive | |
7 | operations into two parts, one that prevents anyone from seeing the data | |
8 | item being destroyed, and one that actually carries out the destruction. | |
9 | A "grace period" must elapse between the two parts, and this grace period | |
10 | must be long enough that any readers accessing the item being deleted have | |
11 | since dropped their references. For example, an RCU-protected deletion | |
12 | from a linked list would first remove the item from the list, wait for | |
404147fa AY |
13 | a grace period to elapse, then free the element. See listRCU.rst for more |
14 | information on using RCU with linked lists. | |
1da177e4 LT |
15 | |
16 | Frequently Asked Questions | |
a9f0969c | 17 | -------------------------- |
1da177e4 | 18 | |
a9f0969c | 19 | - Why would anyone want to use RCU? |
1da177e4 | 20 | |
a9f0969c JC |
21 | The advantage of RCU's two-part approach is that RCU readers need |
22 | not acquire any locks, perform any atomic instructions, write to | |
23 | shared memory, or (on CPUs other than Alpha) execute any memory | |
24 | barriers. The fact that these operations are quite expensive | |
25 | on modern CPUs is what gives RCU its performance advantages | |
26 | in read-mostly situations. The fact that RCU readers need not | |
27 | acquire locks can also greatly simplify deadlock-avoidance code. | |
1da177e4 | 28 | |
a9f0969c JC |
29 | - How can the updater tell when a grace period has completed |
30 | if the RCU readers give no indication when they are done? | |
1da177e4 | 31 | |
a9f0969c JC |
32 | Just as with spinlocks, RCU readers are not permitted to |
33 | block, switch to user-mode execution, or enter the idle loop. | |
34 | Therefore, as soon as a CPU is seen passing through any of these | |
35 | three states, we know that that CPU has exited any previous RCU | |
36 | read-side critical sections. So, if we remove an item from a | |
37 | linked list, and then wait until all CPUs have switched context, | |
38 | executed in user mode, or executed in the idle loop, we can | |
39 | safely free up that item. | |
1da177e4 | 40 | |
a9f0969c JC |
41 | Preemptible variants of RCU (CONFIG_PREEMPT_RCU) get the |
42 | same effect, but require that the readers manipulate CPU-local | |
43 | counters. These counters allow limited types of blocking within | |
44 | RCU read-side critical sections. SRCU also uses CPU-local | |
45 | counters, and permits general blocking within RCU read-side | |
46 | critical sections. These variants of RCU detect grace periods | |
47 | by sampling these counters. | |
f85d6c71 | 48 | |
a9f0969c JC |
49 | - If I am running on a uniprocessor kernel, which can only do one |
50 | thing at a time, why should I wait for a grace period? | |
1da177e4 | 51 | |
404147fa | 52 | See UP.rst for more information. |
1da177e4 | 53 | |
a9f0969c | 54 | - How can I see where RCU is currently used in the Linux kernel? |
1da177e4 | 55 | |
a9f0969c JC |
56 | Search for "rcu_read_lock", "rcu_read_unlock", "call_rcu", |
57 | "rcu_read_lock_bh", "rcu_read_unlock_bh", "srcu_read_lock", | |
58 | "srcu_read_unlock", "synchronize_rcu", "synchronize_net", | |
59 | "synchronize_srcu", and the other RCU primitives. Or grab one | |
60 | of the cscope databases from: | |
f85d6c71 | 61 | |
a9f0969c | 62 | (http://www.rdrop.com/users/paulmck/RCU/linuxusage/rculocktab.html). |
1da177e4 | 63 | |
a9f0969c | 64 | - What guidelines should I follow when writing code that uses RCU? |
1da177e4 | 65 | |
404147fa | 66 | See checklist.rst. |
1da177e4 | 67 | |
a9f0969c | 68 | - Why the name "RCU"? |
1da177e4 | 69 | |
be289568 | 70 | "RCU" stands for "read-copy update". |
404147fa AY |
71 | listRCU.rst has more information on where this name came from, search |
72 | for "read-copy update" to find it. | |
1da177e4 | 73 | |
a9f0969c | 74 | - I hear that RCU is patented? What is with that? |
1da177e4 | 75 | |
a9f0969c | 76 | Yes, it is. There are several known patents related to RCU, |
6a534b29 | 77 | search for the string "Patent" in Documentation/RCU/RTFP.txt to find them. |
a9f0969c JC |
78 | Of these, one was allowed to lapse by the assignee, and the |
79 | others have been contributed to the Linux kernel under GPL. | |
647dd4cd | 80 | Many (but not all) have long since expired. |
a9f0969c | 81 | There are now also LGPL implementations of user-level RCU |
06a649b3 | 82 | available (https://liburcu.org/). |
1da177e4 | 83 | |
a9f0969c | 84 | - I hear that RCU needs work in order to support realtime kernels? |
dd81eca8 | 85 | |
647dd4cd | 86 | Realtime-friendly RCU are enabled via the CONFIG_PREEMPTION |
a9f0969c | 87 | kernel configuration parameter. |
dd81eca8 | 88 | |
a9f0969c | 89 | - Where can I find more information on RCU? |
1da177e4 | 90 | |
6a534b29 | 91 | See the Documentation/RCU/RTFP.txt file. |
3f58c55e PM |
92 | Or point your browser at (https://docs.google.com/document/d/1X0lThx8OK0ZgLMqVoXiR4ZrGURHrXK6NyLRbeXe3Xac/edit) |
93 | or (https://docs.google.com/document/d/1GCdQC8SDbb54W1shjEXqGZ0Rq8a6kIeYutdSIajfpLA/edit?usp=sharing). |