diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-02-22 20:04:57 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-02-25 04:34:53 -0500 |
| commit | c598a070bc581aea8a518b460dae8c0cf8e74344 (patch) | |
| tree | a74f0323a7432ff836901ca301ca11870d73f940 | |
| parent | e7b0a61b7929632d36cf052d9e2820ef0a9c1bfe (diff) | |
rcu: Documentation update for CONFIG_PROVE_RCU
Adds a lockdep.txt file and updates checklist.txt and
whatisRCU.txt to reflect the new lockdep-enabled capabilities of
RCU.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <1266887105-1528-13-git-send-email-paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | Documentation/RCU/00-INDEX | 2 | ||||
| -rw-r--r-- | Documentation/RCU/checklist.txt | 34 | ||||
| -rw-r--r-- | Documentation/RCU/lockdep.txt | 67 | ||||
| -rw-r--r-- | Documentation/RCU/whatisRCU.txt | 13 |
4 files changed, 97 insertions, 19 deletions
diff --git a/Documentation/RCU/00-INDEX b/Documentation/RCU/00-INDEX index 0a27ea9621fa..71b6f500ddb9 100644 --- a/Documentation/RCU/00-INDEX +++ b/Documentation/RCU/00-INDEX | |||
| @@ -6,6 +6,8 @@ checklist.txt | |||
| 6 | - Review Checklist for RCU Patches | 6 | - Review Checklist for RCU Patches |
| 7 | listRCU.txt | 7 | listRCU.txt |
| 8 | - Using RCU to Protect Read-Mostly Linked Lists | 8 | - Using RCU to Protect Read-Mostly Linked Lists |
| 9 | lockdep.txt | ||
| 10 | - RCU and lockdep checking | ||
| 9 | NMI-RCU.txt | 11 | NMI-RCU.txt |
| 10 | - Using RCU to Protect Dynamic NMI Handlers | 12 | - Using RCU to Protect Dynamic NMI Handlers |
| 11 | rcubarrier.txt | 13 | rcubarrier.txt |
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index 767cf06a4276..cbc180f90194 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt | |||
| @@ -127,10 +127,14 @@ over a rather long period of time, but improvements are always welcome! | |||
| 127 | perfectly legal (if redundant) for update-side code to | 127 | perfectly legal (if redundant) for update-side code to |
| 128 | use rcu_dereference() and the "_rcu()" list-traversal | 128 | use rcu_dereference() and the "_rcu()" list-traversal |
| 129 | primitives. This is particularly useful in code that | 129 | primitives. This is particularly useful in code that |
| 130 | is common to readers and updaters. However, neither | 130 | is common to readers and updaters. However, lockdep |
| 131 | rcu_dereference() nor the "_rcu()" list-traversal | 131 | will complain if you access rcu_dereference() outside |
| 132 | primitives can substitute for a good concurrency design | 132 | of an RCU read-side critical section. See lockdep.txt |
| 133 | coordinating among multiple updaters. | 133 | to learn what to do about this. |
| 134 | |||
| 135 | Of course, neither rcu_dereference() nor the "_rcu()" | ||
| 136 | list-traversal primitives can substitute for a good | ||
| 137 | concurrency design coordinating among multiple updaters. | ||
| 134 | 138 | ||
| 135 | b. If the list macros are being used, the list_add_tail_rcu() | 139 | b. If the list macros are being used, the list_add_tail_rcu() |
| 136 | and list_add_rcu() primitives must be used in order | 140 | and list_add_rcu() primitives must be used in order |
| @@ -249,7 +253,9 @@ over a rather long period of time, but improvements are always welcome! | |||
| 249 | must be protected by appropriate update-side locks. RCU | 253 | must be protected by appropriate update-side locks. RCU |
| 250 | read-side critical sections are delimited by rcu_read_lock() | 254 | read-side critical sections are delimited by rcu_read_lock() |
| 251 | and rcu_read_unlock(), or by similar primitives such as | 255 | and rcu_read_unlock(), or by similar primitives such as |
| 252 | rcu_read_lock_bh() and rcu_read_unlock_bh(). | 256 | rcu_read_lock_bh() and rcu_read_unlock_bh(), in which case |
| 257 | the matching rcu_dereference() primitive must be used in order | ||
| 258 | to keep lockdep happy, in this case, rcu_dereference_bh(). | ||
| 253 | 259 | ||
| 254 | The reason that it is permissible to use RCU list-traversal | 260 | The reason that it is permissible to use RCU list-traversal |
| 255 | primitives when the update-side lock is held is that doing so | 261 | primitives when the update-side lock is held is that doing so |
| @@ -302,15 +308,15 @@ over a rather long period of time, but improvements are always welcome! | |||
| 302 | not the case, a self-spawning RCU callback would prevent the | 308 | not the case, a self-spawning RCU callback would prevent the |
| 303 | victim CPU from ever going offline.) | 309 | victim CPU from ever going offline.) |
| 304 | 310 | ||
| 305 | 14. SRCU (srcu_read_lock(), srcu_read_unlock(), synchronize_srcu(), | 311 | 14. SRCU (srcu_read_lock(), srcu_read_unlock(), srcu_dereference(), |
| 306 | and synchronize_srcu_expedited()) may only be invoked from | 312 | synchronize_srcu(), and synchronize_srcu_expedited()) may only |
| 307 | process context. Unlike other forms of RCU, it -is- permissible | 313 | be invoked from process context. Unlike other forms of RCU, it |
| 308 | to block in an SRCU read-side critical section (demarked by | 314 | -is- permissible to block in an SRCU read-side critical section |
| 309 | srcu_read_lock() and srcu_read_unlock()), hence the "SRCU": | 315 | (demarked by srcu_read_lock() and srcu_read_unlock()), hence the |
| 310 | "sleepable RCU". Please note that if you don't need to sleep | 316 | "SRCU": "sleepable RCU". Please note that if you don't need |
| 311 | in read-side critical sections, you should be using RCU rather | 317 | to sleep in read-side critical sections, you should be using |
| 312 | than SRCU, because RCU is almost always faster and easier to | 318 | RCU rather than SRCU, because RCU is almost always faster and |
| 313 | use than is SRCU. | 319 | easier to use than is SRCU. |
| 314 | 320 | ||
| 315 | Also unlike other forms of RCU, explicit initialization | 321 | Also unlike other forms of RCU, explicit initialization |
| 316 | and cleanup is required via init_srcu_struct() and | 322 | and cleanup is required via init_srcu_struct() and |
diff --git a/Documentation/RCU/lockdep.txt b/Documentation/RCU/lockdep.txt new file mode 100644 index 000000000000..fe24b58627bd --- /dev/null +++ b/Documentation/RCU/lockdep.txt | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | RCU and lockdep checking | ||
| 2 | |||
| 3 | All flavors of RCU have lockdep checking available, so that lockdep is | ||
| 4 | aware of when each task enters and leaves any flavor of RCU read-side | ||
| 5 | critical section. Each flavor of RCU is tracked separately (but note | ||
| 6 | that this is not the case in 2.6.32 and earlier). This allows lockdep's | ||
| 7 | tracking to include RCU state, which can sometimes help when debugging | ||
| 8 | deadlocks and the like. | ||
| 9 | |||
| 10 | In addition, RCU provides the following primitives that check lockdep's | ||
| 11 | state: | ||
| 12 | |||
| 13 | rcu_read_lock_held() for normal RCU. | ||
| 14 | rcu_read_lock_bh_held() for RCU-bh. | ||
| 15 | rcu_read_lock_sched_held() for RCU-sched. | ||
| 16 | srcu_read_lock_held() for SRCU. | ||
| 17 | |||
| 18 | These functions are conservative, and will therefore return 1 if they | ||
| 19 | aren't certain (for example, if CONFIG_DEBUG_LOCK_ALLOC is not set). | ||
| 20 | This prevents things like WARN_ON(!rcu_read_lock_held()) from giving false | ||
| 21 | positives when lockdep is disabled. | ||
| 22 | |||
| 23 | In addition, a separate kernel config parameter CONFIG_PROVE_RCU enables | ||
| 24 | checking of rcu_dereference() primitives: | ||
| 25 | |||
| 26 | rcu_dereference(p): | ||
| 27 | Check for RCU read-side critical section. | ||
| 28 | rcu_dereference_bh(p): | ||
| 29 | Check for RCU-bh read-side critical section. | ||
| 30 | rcu_dereference_sched(p): | ||
| 31 | Check for RCU-sched read-side critical section. | ||
| 32 | srcu_dereference(p, sp): | ||
| 33 | Check for SRCU read-side critical section. | ||
| 34 | rcu_dereference_check(p, c): | ||
| 35 | Use explicit check expression "c". | ||
| 36 | rcu_dereference_raw(p) | ||
| 37 | Don't check. (Use sparingly, if at all.) | ||
| 38 | |||
| 39 | The rcu_dereference_check() check expression can be any boolean | ||
| 40 | expression, but would normally include one of the rcu_read_lock_held() | ||
| 41 | family of functions and a lockdep expression. However, any boolean | ||
| 42 | expression can be used. For a moderately ornate example, consider | ||
| 43 | the following: | ||
| 44 | |||
| 45 | file = rcu_dereference_check(fdt->fd[fd], | ||
| 46 | rcu_read_lock_held() || | ||
| 47 | lockdep_is_held(&files->file_lock) || | ||
| 48 | atomic_read(&files->count) == 1); | ||
| 49 | |||
| 50 | This expression picks up the pointer "fdt->fd[fd]" in an RCU-safe manner, | ||
| 51 | and, if CONFIG_PROVE_RCU is configured, verifies that this expression | ||
| 52 | is used in: | ||
| 53 | |||
| 54 | 1. An RCU read-side critical section, or | ||
| 55 | 2. with files->file_lock held, or | ||
| 56 | 3. on an unshared files_struct. | ||
| 57 | |||
| 58 | In case (1), the pointer is picked up in an RCU-safe manner for vanilla | ||
| 59 | RCU read-side critical sections, in case (2) the ->file_lock prevents | ||
| 60 | any change from taking place, and finally, in case (3) the current task | ||
| 61 | is the only task accessing the file_struct, again preventing any change | ||
| 62 | from taking place. | ||
| 63 | |||
| 64 | There are currently only "universal" versions of the rcu_assign_pointer() | ||
| 65 | and RCU list-/tree-traversal primitives, which do not (yet) check for | ||
| 66 | being in an RCU read-side critical section. In the future, separate | ||
| 67 | versions of these primitives might be created. | ||
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index 469a58b2e67e..1dc00ee97163 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt | |||
| @@ -323,15 +323,17 @@ used as follows: | |||
| 323 | Defer Protect | 323 | Defer Protect |
| 324 | 324 | ||
| 325 | a. synchronize_rcu() rcu_read_lock() / rcu_read_unlock() | 325 | a. synchronize_rcu() rcu_read_lock() / rcu_read_unlock() |
| 326 | call_rcu() | 326 | call_rcu() rcu_dereference() |
| 327 | 327 | ||
| 328 | b. call_rcu_bh() rcu_read_lock_bh() / rcu_read_unlock_bh() | 328 | b. call_rcu_bh() rcu_read_lock_bh() / rcu_read_unlock_bh() |
| 329 | rcu_dereference_bh() | ||
| 329 | 330 | ||
| 330 | c. synchronize_sched() rcu_read_lock_sched() / rcu_read_unlock_sched() | 331 | c. synchronize_sched() rcu_read_lock_sched() / rcu_read_unlock_sched() |
| 331 | preempt_disable() / preempt_enable() | 332 | preempt_disable() / preempt_enable() |
| 332 | local_irq_save() / local_irq_restore() | 333 | local_irq_save() / local_irq_restore() |
| 333 | hardirq enter / hardirq exit | 334 | hardirq enter / hardirq exit |
| 334 | NMI enter / NMI exit | 335 | NMI enter / NMI exit |
| 336 | rcu_dereference_sched() | ||
| 335 | 337 | ||
| 336 | These three mechanisms are used as follows: | 338 | These three mechanisms are used as follows: |
| 337 | 339 | ||
| @@ -781,9 +783,8 @@ Linux-kernel source code, but it helps to have a full list of the | |||
| 781 | APIs, since there does not appear to be a way to categorize them | 783 | APIs, since there does not appear to be a way to categorize them |
| 782 | in docbook. Here is the list, by category. | 784 | in docbook. Here is the list, by category. |
| 783 | 785 | ||
| 784 | RCU pointer/list traversal: | 786 | RCU list traversal: |
| 785 | 787 | ||
| 786 | rcu_dereference | ||
| 787 | list_for_each_entry_rcu | 788 | list_for_each_entry_rcu |
| 788 | hlist_for_each_entry_rcu | 789 | hlist_for_each_entry_rcu |
| 789 | hlist_nulls_for_each_entry_rcu | 790 | hlist_nulls_for_each_entry_rcu |
| @@ -809,7 +810,7 @@ RCU: Critical sections Grace period Barrier | |||
| 809 | 810 | ||
| 810 | rcu_read_lock synchronize_net rcu_barrier | 811 | rcu_read_lock synchronize_net rcu_barrier |
| 811 | rcu_read_unlock synchronize_rcu | 812 | rcu_read_unlock synchronize_rcu |
| 812 | synchronize_rcu_expedited | 813 | rcu_dereference synchronize_rcu_expedited |
| 813 | call_rcu | 814 | call_rcu |
| 814 | 815 | ||
| 815 | 816 | ||
| @@ -817,7 +818,7 @@ bh: Critical sections Grace period Barrier | |||
| 817 | 818 | ||
| 818 | rcu_read_lock_bh call_rcu_bh rcu_barrier_bh | 819 | rcu_read_lock_bh call_rcu_bh rcu_barrier_bh |
| 819 | rcu_read_unlock_bh synchronize_rcu_bh | 820 | rcu_read_unlock_bh synchronize_rcu_bh |
| 820 | synchronize_rcu_bh_expedited | 821 | rcu_dereference_bh synchronize_rcu_bh_expedited |
| 821 | 822 | ||
| 822 | 823 | ||
| 823 | sched: Critical sections Grace period Barrier | 824 | sched: Critical sections Grace period Barrier |
| @@ -826,12 +827,14 @@ sched: Critical sections Grace period Barrier | |||
| 826 | rcu_read_unlock_sched call_rcu_sched | 827 | rcu_read_unlock_sched call_rcu_sched |
| 827 | [preempt_disable] synchronize_sched_expedited | 828 | [preempt_disable] synchronize_sched_expedited |
| 828 | [and friends] | 829 | [and friends] |
| 830 | rcu_dereference_sched | ||
| 829 | 831 | ||
| 830 | 832 | ||
| 831 | SRCU: Critical sections Grace period Barrier | 833 | SRCU: Critical sections Grace period Barrier |
| 832 | 834 | ||
| 833 | srcu_read_lock synchronize_srcu N/A | 835 | srcu_read_lock synchronize_srcu N/A |
| 834 | srcu_read_unlock synchronize_srcu_expedited | 836 | srcu_read_unlock synchronize_srcu_expedited |
| 837 | srcu_dereference | ||
| 835 | 838 | ||
| 836 | SRCU: Initialization/cleanup | 839 | SRCU: Initialization/cleanup |
| 837 | init_srcu_struct | 840 | init_srcu_struct |
