diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-11 21:10:49 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-11 21:10:49 -0500 |
| commit | 37ea95a959d4a49846ecbf2dd45326b6b34bf049 (patch) | |
| tree | 43791e1244ce06d8ca18ecbfd0b0f6dcb86ebb8b | |
| parent | de0c276b31538fcd56611132f20b63eae2891876 (diff) | |
| parent | 630e1e0bcddfda9566462d4f9a0d58b31c29d467 (diff) | |
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU update from Ingo Molnar:
"The major features of this tree are:
1. A first version of no-callbacks CPUs. This version prohibits
offlining CPU 0, but only when enabled via CONFIG_RCU_NOCB_CPU=y.
Relaxing this constraint is in progress, but not yet ready
for prime time. These commits were posted to LKML at
https://lkml.org/lkml/2012/10/30/724.
2. Changes to SRCU that allows statically initialized srcu_struct
structures. These commits were posted to LKML at
https://lkml.org/lkml/2012/10/30/296.
3. Restructuring of RCU's debugfs output. These commits were posted
to LKML at https://lkml.org/lkml/2012/10/30/341.
4. Additional CPU-hotplug/RCU improvements, posted to LKML at
https://lkml.org/lkml/2012/10/30/327.
Note that the commit eliminating __stop_machine() was judged to
be too-high of risk, so is deferred to 3.9.
5. Changes to RCU's idle interface, most notably a new module
parameter that redirects normal grace-period operations to
their expedited equivalents. These were posted to LKML at
https://lkml.org/lkml/2012/10/30/739.
6. Additional diagnostics for RCU's CPU stall warning facility,
posted to LKML at https://lkml.org/lkml/2012/10/30/315.
The most notable change reduces the
default RCU CPU stall-warning time from 60 seconds to 21 seconds,
so that it once again happens sooner than the softlockup timeout.
7. Documentation updates, which were posted to LKML at
https://lkml.org/lkml/2012/10/30/280.
A couple of late-breaking changes were posted at
https://lkml.org/lkml/2012/11/16/634 and
https://lkml.org/lkml/2012/11/16/547.
8. Miscellaneous fixes, which were posted to LKML at
https://lkml.org/lkml/2012/10/30/309.
9. Finally, a fix for an lockdep-RCU splat was posted to LKML
at https://lkml.org/lkml/2012/11/7/486."
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (49 commits)
context_tracking: New context tracking susbsystem
sched: Mark RCU reader in sched_show_task()
rcu: Separate accounting of callbacks from callback-free CPUs
rcu: Add callback-free CPUs
rcu: Add documentation for the new rcuexp debugfs trace file
rcu: Update documentation for TREE_RCU debugfs tracing
rcu: Reduce default RCU CPU stall warning timeout
rcu: Fix TINY_RCU rcu_is_cpu_rrupt_from_idle check
rcu: Clarify memory-ordering properties of grace-period primitives
rcu: Add new rcutorture module parameters to start/end test messages
rcu: Remove list_for_each_continue_rcu()
rcu: Fix batch-limit size problem
rcu: Add tracing for synchronize_sched_expedited()
rcu: Remove old debugfs interfaces and also RCU flavor name
rcu: split 'rcuhier' to each flavor
rcu: split 'rcugp' to each flavor
rcu: split 'rcuboost' to each flavor
rcu: split 'rcubarrier' to each flavor
rcu: Fix tracing formatting
rcu: Remove the interface "rcudata.csv"
...
39 files changed, 1493 insertions, 628 deletions
diff --git a/Documentation/RCU/RTFP.txt b/Documentation/RCU/RTFP.txt index 7c1dfb19fc40..7f40c72a9c51 100644 --- a/Documentation/RCU/RTFP.txt +++ b/Documentation/RCU/RTFP.txt | |||
| @@ -186,7 +186,7 @@ Bibtex Entries | |||
| 186 | 186 | ||
| 187 | @article{Kung80 | 187 | @article{Kung80 |
| 188 | ,author="H. T. Kung and Q. Lehman" | 188 | ,author="H. T. Kung and Q. Lehman" |
| 189 | ,title="Concurrent Maintenance of Binary Search Trees" | 189 | ,title="Concurrent Manipulation of Binary Search Trees" |
| 190 | ,Year="1980" | 190 | ,Year="1980" |
| 191 | ,Month="September" | 191 | ,Month="September" |
| 192 | ,journal="ACM Transactions on Database Systems" | 192 | ,journal="ACM Transactions on Database Systems" |
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index cdb20d41a44a..31ef8fe07f82 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt | |||
| @@ -271,15 +271,14 @@ over a rather long period of time, but improvements are always welcome! | |||
| 271 | The same cautions apply to call_rcu_bh() and call_rcu_sched(). | 271 | The same cautions apply to call_rcu_bh() and call_rcu_sched(). |
| 272 | 272 | ||
| 273 | 9. All RCU list-traversal primitives, which include | 273 | 9. All RCU list-traversal primitives, which include |
| 274 | rcu_dereference(), list_for_each_entry_rcu(), | 274 | rcu_dereference(), list_for_each_entry_rcu(), and |
| 275 | list_for_each_continue_rcu(), and list_for_each_safe_rcu(), | 275 | list_for_each_safe_rcu(), must be either within an RCU read-side |
| 276 | must be either within an RCU read-side critical section or | 276 | critical section or must be protected by appropriate update-side |
| 277 | must be protected by appropriate update-side locks. RCU | 277 | locks. RCU read-side critical sections are delimited by |
| 278 | read-side critical sections are delimited by rcu_read_lock() | 278 | rcu_read_lock() and rcu_read_unlock(), or by similar primitives |
| 279 | and rcu_read_unlock(), or by similar primitives such as | 279 | such as rcu_read_lock_bh() and rcu_read_unlock_bh(), in which |
| 280 | rcu_read_lock_bh() and rcu_read_unlock_bh(), in which case | 280 | case the matching rcu_dereference() primitive must be used in |
| 281 | the matching rcu_dereference() primitive must be used in order | 281 | order to keep lockdep happy, in this case, rcu_dereference_bh(). |
| 282 | to keep lockdep happy, in this case, rcu_dereference_bh(). | ||
| 283 | 282 | ||
| 284 | The reason that it is permissible to use RCU list-traversal | 283 | The reason that it is permissible to use RCU list-traversal |
| 285 | primitives when the update-side lock is held is that doing so | 284 | primitives when the update-side lock is held is that doing so |
diff --git a/Documentation/RCU/listRCU.txt b/Documentation/RCU/listRCU.txt index 4349c1487e91..adb5a3782846 100644 --- a/Documentation/RCU/listRCU.txt +++ b/Documentation/RCU/listRCU.txt | |||
| @@ -205,7 +205,7 @@ RCU ("read-copy update") its name. The RCU code is as follows: | |||
| 205 | audit_copy_rule(&ne->rule, &e->rule); | 205 | audit_copy_rule(&ne->rule, &e->rule); |
| 206 | ne->rule.action = newaction; | 206 | ne->rule.action = newaction; |
| 207 | ne->rule.file_count = newfield_count; | 207 | ne->rule.file_count = newfield_count; |
| 208 | list_replace_rcu(e, ne); | 208 | list_replace_rcu(&e->list, &ne->list); |
| 209 | call_rcu(&e->rcu, audit_free_rule); | 209 | call_rcu(&e->rcu, audit_free_rule); |
| 210 | return 0; | 210 | return 0; |
| 211 | } | 211 | } |
diff --git a/Documentation/RCU/rcuref.txt b/Documentation/RCU/rcuref.txt index 4202ad093130..141d531aa14b 100644 --- a/Documentation/RCU/rcuref.txt +++ b/Documentation/RCU/rcuref.txt | |||
| @@ -20,7 +20,7 @@ release_referenced() delete() | |||
| 20 | { { | 20 | { { |
| 21 | ... write_lock(&list_lock); | 21 | ... write_lock(&list_lock); |
| 22 | atomic_dec(&el->rc, relfunc) ... | 22 | atomic_dec(&el->rc, relfunc) ... |
| 23 | ... delete_element | 23 | ... remove_element |
| 24 | } write_unlock(&list_lock); | 24 | } write_unlock(&list_lock); |
| 25 | ... | 25 | ... |
| 26 | if (atomic_dec_and_test(&el->rc)) | 26 | if (atomic_dec_and_test(&el->rc)) |
| @@ -52,7 +52,7 @@ release_referenced() delete() | |||
| 52 | { { | 52 | { { |
| 53 | ... spin_lock(&list_lock); | 53 | ... spin_lock(&list_lock); |
| 54 | if (atomic_dec_and_test(&el->rc)) ... | 54 | if (atomic_dec_and_test(&el->rc)) ... |
| 55 | call_rcu(&el->head, el_free); delete_element | 55 | call_rcu(&el->head, el_free); remove_element |
| 56 | ... spin_unlock(&list_lock); | 56 | ... spin_unlock(&list_lock); |
| 57 | } ... | 57 | } ... |
| 58 | if (atomic_dec_and_test(&el->rc)) | 58 | if (atomic_dec_and_test(&el->rc)) |
| @@ -64,3 +64,60 @@ Sometimes, a reference to the element needs to be obtained in the | |||
| 64 | update (write) stream. In such cases, atomic_inc_not_zero() might be | 64 | update (write) stream. In such cases, atomic_inc_not_zero() might be |
| 65 | overkill, since we hold the update-side spinlock. One might instead | 65 | overkill, since we hold the update-side spinlock. One might instead |
| 66 | use atomic_inc() in such cases. | 66 | use atomic_inc() in such cases. |
| 67 | |||
| 68 | It is not always convenient to deal with "FAIL" in the | ||
| 69 | search_and_reference() code path. In such cases, the | ||
| 70 | atomic_dec_and_test() may be moved from delete() to el_free() | ||
| 71 | as follows: | ||
| 72 | |||
| 73 | 1. 2. | ||
| 74 | add() search_and_reference() | ||
| 75 | { { | ||
| 76 | alloc_object rcu_read_lock(); | ||
| 77 | ... search_for_element | ||
| 78 | atomic_set(&el->rc, 1); atomic_inc(&el->rc); | ||
| 79 | spin_lock(&list_lock); ... | ||
| 80 | |||
| 81 | add_element rcu_read_unlock(); | ||
| 82 | ... } | ||
| 83 | spin_unlock(&list_lock); 4. | ||
| 84 | } delete() | ||
| 85 | 3. { | ||
| 86 | release_referenced() spin_lock(&list_lock); | ||
| 87 | { ... | ||
| 88 | ... remove_element | ||
| 89 | if (atomic_dec_and_test(&el->rc)) spin_unlock(&list_lock); | ||
| 90 | kfree(el); ... | ||
| 91 | ... call_rcu(&el->head, el_free); | ||
| 92 | } ... | ||
| 93 | 5. } | ||
| 94 | void el_free(struct rcu_head *rhp) | ||
| 95 | { | ||
| 96 | release_referenced(); | ||
| 97 | } | ||
