| RCU Concepts |
| |
| |
| The basic idea behind RCU (read-copy update) is to split destructive |
| operations into two parts, one that prevents anyone from seeing the data |
| item being destroyed, and one that actually carries out the destruction. |
| A "grace period" must elapse between the two parts, and this grace period |
| must be long enough that any readers accessing the item being deleted have |
| since dropped their references. For example, an RCU-protected deletion |
| from a linked list would first remove the item from the list, wait for |
| a grace period to elapse, then free the element. See the listRCU.txt |
| file for more information on using RCU with linked lists. |
| |
| |
| Frequently Asked Questions |
| |
| o Why would anyone want to use RCU? |
| |
| The advantage of RCU's two-part approach is that RCU readers need |
| not acquire any locks, perform any atomic instructions, write to |
| shared memory, or (on CPUs other than Alpha) execute any memory |
| barriers. The fact that these operations are quite expensive |
| on modern CPUs is what gives RCU its performance advantages |
| in read-mostly situations. The fact that RCU readers need not |
| acquire locks can also greatly simplify deadlock-avoidance code. |
| |
| o How can the updater tell when a grace period has completed |
| if the RCU readers give no indication when they are done? |
| |
| Just as with spinlocks, RCU readers are not permitted to |
| block, switch to user-mode execution, or enter the idle loop. |
| Therefore, as soon as a CPU is seen passing through any of these |
| three states, we know that that CPU has exited any previous RCU |
| read-side critical sections. So, if we remove an item from a |
| linked list, and then wait until all CPUs have switched context, |
| executed in user mode, or executed in the idle loop, we can |
| safely free up that item. |
| |
| Preemptible variants of RCU (CONFIG_PREEMPT_RCU) get the |
| same effect, but require that the readers manipulate CPU-local |
| counters. These counters allow limited types of blocking |
| within RCU read-side critical sections. SRCU also uses |
| CPU-local counters, and permits general blocking within |
| RCU read-side critical sections. These two variants of |
| RCU detect grace periods by sampling these counters. |
| |
| o If I am running on a uniprocessor kernel, which can only do one |
| thing at a time, why should I wait for a grace period? |
| |
| See the UP.txt file in this directory. |
| |
| o How can I see where RCU is currently used in the Linux kernel? |
| |
| Search for "rcu_read_lock", "rcu_read_unlock", "call_rcu", |
| "rcu_read_lock_bh", "rcu_read_unlock_bh", "call_rcu_bh", |
| "srcu_read_lock", "srcu_read_unlock", "synchronize_rcu", |
| "synchronize_net", "synchronize_srcu", and the other RCU |
| primitives. Or grab one of the cscope databases from: |
| |
| http://www.rdrop.com/users/paulmck/RCU/linuxusage/rculocktab.html |
| |
| o What guidelines should I follow when writing code that uses RCU? |
| |
| See the checklist.txt file in this directory. |
| |
| o Why the name "RCU"? |
| |
| "RCU" stands for "read-copy update". The file listRCU.txt has |
| more information on where this name came from, search for |
| "read-copy update" to find it. |
| |
| o I hear that RCU is patented? What is with that? |
| |
| Yes, it is. There are several known patents related to RCU, |
| search for the string "Patent" in RTFP.txt to find them. |
| Of these, one was allowed to lapse by the assignee, and the |
| others have been contributed to the Linux kernel under GPL. |
| |
| o I hear that RCU needs work in order to support realtime kernels? |
| |
| This work is largely completed. Realtime-friendly RCU can be |
| enabled via the CONFIG_PREEMPT_RCU kernel configuration parameter. |
| However, work is in progress for enabling priority boosting of |
| preempted RCU read-side critical sections. This is needed if you |
| have CPU-bound realtime threads. |
| |
| o Where can I find more information on RCU? |
| |
| See the RTFP.txt file in this directory. |
| Or point your browser at http://www.rdrop.com/users/paulmck/RCU/. |
| |
| o What are all these files in this directory? |
| |
| |
| NMI-RCU.txt |
| |
| Describes how to use RCU to implement dynamic |
| NMI handlers, which can be revectored on the fly, |
| without rebooting. |
| |
| RTFP.txt |
| |
| List of RCU-related publications and web sites. |
| |
| UP.txt |
| |
| Discussion of RCU usage in UP kernels. |
| |
| arrayRCU.txt |
| |
| Describes how to use RCU to protect arrays, with |
| resizeable arrays whose elements reference other |
| data structures being of the most interest. |
| |
| checklist.txt |
| |
| Lists things to check for when inspecting code that |
| uses RCU. |
| |
| listRCU.txt |
| |
| Describes how to use RCU to protect linked lists. |
| This is the simplest and most common use of RCU |
| in the Linux kernel. |
| |
| rcu.txt |
| |
| You are reading it! |
| |
| rcuref.txt |
| |
| Describes how to combine use of reference counts |
| with RCU. |
| |
| whatisRCU.txt |
| |
| Overview of how the RCU implementation works. Along |
| the way, presents a conceptual view of RCU. |