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