diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-06-25 12:08:18 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-07-03 04:02:29 -0400 |
| commit | 240ebbf81f149b11a31e060ebe5ee51a3c775360 (patch) | |
| tree | d8aa6601bd789991588e467bf734d40df36e1317 | |
| parent | 0acc512cb1a29636df5e982c7d845edafe77c2d0 (diff) | |
rcu: Add synchronize_sched_expedited() rcutorture doc + updates
This patch updates the rcutorture documentation to include
updated output format. It also brings the RCU documentation up
to date.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: akpm@linux-foundation.org
Cc: torvalds@linux-foundation.org
Cc: davem@davemloft.net
Cc: dada1@cosmosbay.com
Cc: zbr@ioremap.net
Cc: jeff.chua.linux@gmail.com
Cc: paulus@samba.org
Cc: laijs@cn.fujitsu.com
Cc: jengelh@medozas.de
Cc: r000n@r000n.net
Cc: benh@kernel.crashing.org
Cc: mathieu.desnoyers@polymtl.ca
LKML-Reference: <12459460983193-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | Documentation/RCU/RTFP.txt | 77 | ||||
| -rw-r--r-- | Documentation/RCU/UP.txt | 34 | ||||
| -rw-r--r-- | Documentation/RCU/checklist.txt | 20 | ||||
| -rw-r--r-- | Documentation/RCU/rcubarrier.txt | 7 | ||||
| -rw-r--r-- | Documentation/RCU/torture.txt | 23 | ||||
| -rw-r--r-- | Documentation/RCU/whatisRCU.txt | 14 |
6 files changed, 156 insertions, 19 deletions
diff --git a/Documentation/RCU/RTFP.txt b/Documentation/RCU/RTFP.txt index 9f711d2df91b..d2b85237c76e 100644 --- a/Documentation/RCU/RTFP.txt +++ b/Documentation/RCU/RTFP.txt | |||
| @@ -743,3 +743,80 @@ Revised: | |||
| 743 | RCU, realtime RCU, sleepable RCU, performance. | 743 | RCU, realtime RCU, sleepable RCU, performance. |
| 744 | " | 744 | " |
| 745 | } | 745 | } |
| 746 | |||
| 747 | @article{PaulEMcKenney2008RCUOSR | ||
| 748 | ,author="Paul E. McKenney and Jonathan Walpole" | ||
| 749 | ,title="Introducing technology into the {Linux} kernel: a case study" | ||
| 750 | ,Year="2008" | ||
| 751 | ,journal="SIGOPS Oper. Syst. Rev." | ||
| 752 | ,volume="42" | ||
| 753 | ,number="5" | ||
| 754 | ,pages="4--17" | ||
| 755 | ,issn="0163-5980" | ||
| 756 | ,doi={http://doi.acm.org/10.1145/1400097.1400099} | ||
| 757 | ,publisher="ACM" | ||
| 758 | ,address="New York, NY, USA" | ||
| 759 | ,annotation={ | ||
| 760 | Linux changed RCU to a far greater degree than RCU has changed Linux. | ||
| 761 | } | ||
| 762 | } | ||
| 763 | |||
| 764 | @unpublished{PaulEMcKenney2008HierarchicalRCU | ||
| 765 | ,Author="Paul E. McKenney" | ||
| 766 | ,Title="Hierarchical {RCU}" | ||
| 767 | ,month="November" | ||
| 768 | ,day="3" | ||
| 769 | ,year="2008" | ||
| 770 | ,note="Available: | ||
| 771 | \url{http://lwn.net/Articles/305782/} | ||
| 772 | [Viewed November 6, 2008]" | ||
| 773 | ,annotation=" | ||
| 774 | RCU with combining-tree-based grace-period detection, | ||
| 775 | permitting it to handle thousands of CPUs. | ||
| 776 | " | ||
| 777 | } | ||
| 778 | |||
| 779 | @conference{PaulEMcKenney2009MaliciousURCU | ||
| 780 | ,Author="Paul E. McKenney" | ||
| 781 | ,Title="Using a Malicious User-Level {RCU} to Torture {RCU}-Based Algorithms" | ||
| 782 | ,Booktitle="linux.conf.au 2009" | ||
| 783 | ,month="January" | ||
| 784 | ,year="2009" | ||
| 785 | ,address="Hobart, Australia" | ||
| 786 | ,note="Available: | ||
| 787 | \url{http://www.rdrop.com/users/paulmck/RCU/urcutorture.2009.01.22a.pdf} | ||
| 788 | [Viewed February 2, 2009]" | ||
| 789 | ,annotation=" | ||
| 790 | Realtime RCU and torture-testing RCU uses. | ||
| 791 | " | ||
| 792 | } | ||
| 793 | |||
| 794 | @unpublished{MathieuDesnoyers2009URCU | ||
| 795 | ,Author="Mathieu Desnoyers" | ||
| 796 | ,Title="[{RFC} git tree] Userspace {RCU} (urcu) for {Linux}" | ||
| 797 | ,month="February" | ||
| 798 | ,day="5" | ||
| 799 | ,year="2009" | ||
| 800 | ,note="Available: | ||
| 801 | \url{http://lkml.org/lkml/2009/2/5/572} | ||
| 802 | \url{git://lttng.org/userspace-rcu.git} | ||
| 803 | [Viewed February 20, 2009]" | ||
| 804 | ,annotation=" | ||
| 805 | Mathieu Desnoyers's user-space RCU implementation. | ||
| 806 | git://lttng.org/userspace-rcu.git | ||
| 807 | " | ||
| 808 | } | ||
| 809 | |||
| 810 | @unpublished{PaulEMcKenney2009BloatWatchRCU | ||
| 811 | ,Author="Paul E. McKenney" | ||
| 812 | ,Title="{RCU}: The {Bloatwatch} Edition" | ||
| 813 | ,month="March" | ||
| 814 | ,day="17" | ||
| 815 | ,year="2009" | ||
| 816 | ,note="Available: | ||
| 817 | \url{http://lwn.net/Articles/323929/} | ||
| 818 | [Viewed March 20, 2009]" | ||
| 819 | ,annotation=" | ||
| 820 | Uniprocessor assumptions allow simplified RCU implementation. | ||
| 821 | " | ||
| 822 | } | ||
diff --git a/Documentation/RCU/UP.txt b/Documentation/RCU/UP.txt index aab4a9ec3931..90ec5341ee98 100644 --- a/Documentation/RCU/UP.txt +++ b/Documentation/RCU/UP.txt | |||
| @@ -2,14 +2,13 @@ RCU on Uniprocessor Systems | |||
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | A common misconception is that, on UP systems, the call_rcu() primitive | 4 | A common misconception is that, on UP systems, the call_rcu() primitive |
| 5 | may immediately invoke its function, and that the synchronize_rcu() | 5 | may immediately invoke its function. The basis of this misconception |
| 6 | primitive may return immediately. The basis of this misconception | ||
| 7 | is that since there is only one CPU, it should not be necessary to | 6 | is that since there is only one CPU, it should not be necessary to |
| 8 | wait for anything else to get done, since there are no other CPUs for | 7 | wait for anything else to get done, since there are no other CPUs for |
| 9 | anything else to be happening on. Although this approach will -sort- -of- | 8 | anything else to be happening on. Although this approach will -sort- -of- |
| 10 | work a surprising amount of the time, it is a very bad idea in general. | 9 | work a surprising amount of the time, it is a very bad idea in general. |
| 11 | This document presents three examples that demonstrate exactly how bad an | 10 | This document presents three examples that demonstrate exactly how bad |
| 12 | idea this is. | 11 | an idea this is. |
| 13 | 12 | ||
| 14 | 13 | ||
| 15 | Example 1: softirq Suicide | 14 | Example 1: softirq Suicide |
| @@ -82,11 +81,18 @@ Quick Quiz #2: What locking restriction must RCU callbacks respect? | |||
| 82 | 81 | ||
| 83 | Summary | 82 | Summary |
| 84 | 83 | ||
| 85 | Permitting call_rcu() to immediately invoke its arguments or permitting | 84 | Permitting call_rcu() to immediately invoke its arguments breaks RCU, |
| 86 | synchronize_rcu() to immediately return breaks RCU, even on a UP system. | 85 | even on a UP system. So do not do it! Even on a UP system, the RCU |
| 87 | So do not do it! Even on a UP system, the RCU infrastructure -must- | 86 | infrastructure -must- respect grace periods, and -must- invoke callbacks |
| 88 | respect grace periods, and -must- invoke callbacks from a known environment | 87 | from a known environment in which no locks are held. |
| 89 | in which no locks are held. | 88 | |
| 89 | It -is- safe for synchronize_sched() and synchronize_rcu_bh() to return | ||
| 90 | immediately on an UP system. It is also safe for synchronize_rcu() | ||
| 91 | to return immediately on UP systems, except when running preemptable | ||
| 92 | RCU. | ||
| 93 | |||
| 94 | Quick Quiz #3: Why can't synchronize_rcu() return immediately on | ||
| 95 | UP systems running preemptable RCU? | ||
| 90 | 96 | ||
| 91 | 97 | ||
| 92 | Answer to Quick Quiz #1: | 98 | Answer to Quick Quiz #1: |
| @@ -117,3 +123,13 @@ Answer to Quick Quiz #2: | |||
| 117 | callbacks acquire locks directly. However, a great many RCU | 123 | callbacks acquire locks directly. However, a great many RCU |
| 118 | callbacks do acquire locks -indirectly-, for example, via | 124 | callbacks do acquire locks -indirectly-, for example, via |
| 119 | the kfree() primitive. | 125 | the kfree() primitive. |
| 126 | |||
| 127 | Answer to Quick Quiz #3: | ||
| 128 | Why can't synchronize_rcu() return immediately on UP systems | ||
| 129 | running preemptable RCU? | ||
| 130 | |||
| 131 | Because some other task might have been preempted in the middle | ||
| 132 | of an RCU read-side critical section. If synchronize_rcu() | ||
| 133 | simply immediately returned, it would prematurely signal the | ||
| 134 | end of the grace period, which would come as a nasty shock to | ||
| 135 | that other thread when it started running again. | ||
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index accfe2f5247d..51525a30e8b4 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt | |||
| @@ -11,7 +11,10 @@ over a rather long period of time, but improvements are always welcome! | |||
| 11 | structure is updated more than about 10% of the time, then | 11 | structure is updated more than about 10% of the time, then |
| 12 | you should strongly consider some other approach, unless | 12 | you should strongly consider some other approach, unless |
| 13 | detailed performance measurements show that RCU is nonetheless | 13 | detailed performance measurements show that RCU is nonetheless |
| 14 | the right tool for the job. | 14 | the right tool for the job. Yes, you might think of RCU |
| 15 | as simply cutting overhead off of the readers and imposing it | ||
| 16 | on the writers. That is exactly why normal uses of RCU will | ||
| 17 | do much more reading than updating. | ||
| 15 | 18 | ||
| 16 | Another exception is where performance is not an issue, and RCU | 19 | Another exception is where performance is not an issue, and RCU |
| 17 | provides a simpler implementation. An example of this situation | 20 | provides a simpler implementation. An example of this situation |
| @@ -240,10 +243,11 @@ over a rather long period of time, but improvements are always welcome! | |||
| 240 | instead need to use synchronize_irq() or synchronize_sched(). | 243 | instead need to use synchronize_irq() or synchronize_sched(). |
| 241 | 244 | ||
| 242 | 12. Any lock acquired by an RCU callback must be acquired elsewhere | 245 | 12. Any lock acquired by an RCU callback must be acquired elsewhere |
| 243 | with irq disabled, e.g., via spin_lock_irqsave(). Failing to | 246 | with softirq disabled, e.g., via spin_lock_irqsave(), |
| 244 | disable irq on a given acquisition of that lock will result in | 247 | spin_lock_bh(), etc. Failing to disable irq on a given |
| 245 | deadlock as soon as the RCU callback happens to interrupt that | 248 | acquisition of that lock will result in deadlock as soon as the |
| 246 | acquisition's critical section. | 249 | RCU callback happens to interrupt that acquisition's critical |
| 250 | section. | ||
| 247 | 251 | ||
| 248 | 13. RCU callbacks can be and are executed in parallel. In many cases, | 252 | 13. RCU callbacks can be and are executed in parallel. In many cases, |
| 249 | the callback code simply wrappers around kfree(), so that this | 253 | the callback code simply wrappers around kfree(), so that this |
| @@ -310,3 +314,9 @@ over a rather long period of time, but improvements are always welcome! | |||
| 310 | Because these primitives only wait for pre-existing readers, | 314 | Because these primitives only wait for pre-existing readers, |
| 311 | it is the caller's responsibility to guarantee safety to | 315 | it is the caller's responsibility to guarantee safety to |
| 312 | any subsequent readers. | 316 | any subsequent readers. |
| 317 | |||
| 318 | 16. The various RCU read-side primitives do -not- contain memory | ||
| 319 | barriers. The CPU (and in some cases, the compiler) is free | ||
| 320 | to reorder code into and out of RCU read-side critical sections. | ||
| 321 | It is the responsibility of the RCU update-side primitives to | ||
| 322 | deal with this. | ||
diff --git a/Documentation/RCU/rcubarrier.txt b/Documentation/RCU/rcubarrier.txt index 909602d409bb..e439a0edee22 100644 --- a/Documentation/RCU/rcubarrier.txt +++ b/Documentation/RCU/rcubarrier.txt | |||
| @@ -170,6 +170,13 @@ module invokes call_rcu() from timers, you will need to first cancel all | |||
| 170 | the timers, and only then invoke rcu_barrier() to wait for any remaining | 170 | the timers, and only then invoke rcu_barrier() to wait for any remaining |
| 171 | RCU callbacks to complete. | 171 | RCU callbacks to complete. |
| 172 | 172 | ||
| 173 | Of course, if you module uses call_rcu_bh(), you will need to invoke | ||
| 174 | rcu_barrier_bh() before unloading. Similarly, if your module uses | ||
| 175 | call_rcu_sched(), you will need to invoke rcu_barrier_sched() before | ||
| 176 | unloading. If your module uses call_rcu(), call_rcu_bh(), -and- | ||
| 177 | call_rcu_sched(), then you will need to invoke each of rcu_barrier(), | ||
| 178 | rcu_barrier_bh(), and rcu_barrier_sched(). | ||
| 179 | |||
| 173 | 180 | ||
| 174 | Implementing rcu_barrier() | 181 | Implementing rcu_barrier() |
| 175 | 182 | ||
diff --git a/Documentation/RCU/torture.txt b/Documentation/RCU/torture.txt index a342b6e1cc10..9dba3bb90e60 100644 --- a/Documentation/RCU/torture.txt +++ b/Documentation/RCU/torture.txt | |||
| @@ -76,8 +76,10 @@ torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API, | |||
| 76 | "rcu_sync" for rcu_read_lock() with synchronous reclamation, | 76 | "rcu_sync" for rcu_read_lock() with synchronous reclamation, |
| 77 | "rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for | 77 | "rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for |
| 78 | rcu_read_lock_bh() with synchronous reclamation, "srcu" for | 78 | rcu_read_lock_bh() with synchronous reclamation, "srcu" for |
| 79 | the "srcu_read_lock()" API, and "sched" for the use of | 79 | the "srcu_read_lock()" API, "sched" for the use of |
| 80 | preempt_disable() together with synchronize_sched(). | 80 | preempt_disable() together with synchronize_sched(), |
| 81 | and "sched_expedited" for the use of preempt_disable() | ||
| 82 | with synchronize_sched_expedited(). | ||
| 81 | 83 | ||
| 82 | verbose Enable debug printk()s. Default is disabled. | 84 | verbose Enable debug printk()s. Default is disabled. |
| 83 | 85 | ||
| @@ -162,6 +164,23 @@ of the "old" and "current" counters for the corresponding CPU. The | |||
| 162 | "idx" value maps the "old" and "current" values to the underlying array, | 164 | "idx" value maps the "old" and "current" values to the underlying array, |
| 163 | and is useful for debugging. | 165 | and is useful for debugging. |
| 164 | 166 | ||
| 167 | Similarly, sched_expedited RCU provides the following: | ||
| 168 | |||
| 169 | sched_expedited-torture: rtc: d0000000016c1880 ver: 1090796 tfle: 0 rta: 1090796 rtaf: 0 rtf: 1090787 rtmbe: 0 nt: 27713319 | ||
| 170 | sched_expedited-torture: Reader Pipe: 12660320201 95875 0 0 0 0 0 0 0 0 0 | ||
| 171 | sched_expedited-torture: Reader Batch: 12660424885 0 0 0 0 0 0 0 0 0 0 | ||
| 172 | sched_expedited-torture: Free-Block Circulation: 1090795 1090795 1090794 1090793 1090792 1090791 1090790 1090789 1090788 1090787 0 | ||
| 173 | state: -1 / 0:0 3:0 4:0 | ||
| 174 | |||
| 175 | As before, the first four lines are similar to those for RCU. | ||
| 176 | The last line shows the task-migration state. The first number is | ||
| 177 | -1 if synchronize_sched_expedited() is idle, -2 if in the process of | ||
| 178 | posting wakeups to the migration kthreads, and N when waiting on CPU N. | ||
| 179 | Each of the colon-separated fields following the "/" is a CPU:state pair. | ||
| 180 | Valid states are "0" for idle, "1" for waiting for quiescent state, | ||
| 181 | "2" for passed through quiescent state, and "3" when a race with a | ||
| 182 | CPU-hotplug event forces use of the synchronize_sched() primitive. | ||
| 183 | |||
| 165 | 184 | ||
| 166 | USAGE | 185 | USAGE |
| 167 | 186 | ||
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index 96170824a717..97ded2432c59 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt | |||
| @@ -785,6 +785,7 @@ RCU pointer/list traversal: | |||
| 785 | rcu_dereference | 785 | rcu_dereference |
| 786 | list_for_each_entry_rcu | 786 | list_for_each_entry_rcu |
| 787 | hlist_for_each_entry_rcu | 787 | hlist_for_each_entry_rcu |
| 788 | hlist_nulls_for_each_entry_rcu | ||
| 788 | 789 | ||
| 789 | list_for_each_continue_rcu (to be deprecated in favor of new | 790 | list_for_each_continue_rcu (to be deprecated in favor of new |
| 790 | list_for_each_entry_continue_rcu) | 791 | list_for_each_entry_continue_rcu) |
| @@ -807,19 +808,23 @@ RCU: Critical sections Grace period Barrier | |||
| 807 | 808 | ||
| 808 | rcu_read_lock synchronize_net rcu_barrier | 809 | rcu_read_lock synchronize_net rcu_barrier |
| 809 | rcu_read_unlock synchronize_rcu | 810 | rcu_read_unlock synchronize_rcu |
| 811 | synchronize_rcu_expedited | ||
| 810 | call_rcu | 812 | call_rcu |
| 811 | 813 | ||
| 812 | 814 | ||
| 813 | bh: Critical sections Grace period Barrier | 815 | bh: Critical sections Grace period Barrier |
| 814 | 816 | ||
| 815 | rcu_read_lock_bh call_rcu_bh rcu_barrier_bh | 817 | rcu_read_lock_bh call_rcu_bh rcu_barrier_bh |
| 816 | rcu_read_unlock_bh | 818 | rcu_read_unlock_bh synchronize_rcu_bh |
| 819 | synchronize_rcu_bh_expedited | ||
| 817 | 820 | ||
| 818 | 821 | ||
| 819 | sched: Critical sections Grace period Barrier | 822 | sched: Critical sections Grace period Barrier |
| 820 | 823 | ||
| 821 | [preempt_disable] synchronize_sched rcu_barrier_sched | 824 | rcu_read_lock_sched synchronize_sched rcu_barrier_sched |
| 822 | [and friends] call_rcu_sched | 825 | rcu_read_unlock_sched call_rcu_sched |
| 826 | [preempt_disable] synchronize_sched_expedited | ||
| 827 | [and friends] | ||
| 823 | 828 | ||
| 824 | 829 | ||
| 825 | SRCU: Critical sections Grace period Barrier | 830 | SRCU: Critical sections Grace period Barrier |
| @@ -827,6 +832,9 @@ SRCU: Critical sections Grace period Barrier | |||
| 827 | srcu_read_lock synchronize_srcu N/A | 832 | srcu_read_lock synchronize_srcu N/A |
| 828 | srcu_read_unlock | 833 | srcu_read_unlock |
| 829 | 834 | ||
| 835 | SRCU: Initialization/cleanup | ||
| 836 | init_srcu_struct | ||
| 837 | cleanup_srcu_struct | ||
| 830 | 838 | ||
| 831 | See the comment headers in the source code (or the docbook generated | 839 | See the comment headers in the source code (or the docbook generated |
| 832 | from them) for more information. | 840 | from them) for more information. |
