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