diff options
author | Paul E. McKenney <paul.mckenney@linaro.org> | 2011-06-05 13:07:18 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2011-09-29 00:36:39 -0400 |
commit | 63cd758e07743b71ed76ba7db7f93986a7591a65 (patch) | |
tree | 55ed3c5e698145cdd2349a6b0d4a3e3b811232f2 /Documentation/RCU | |
parent | 990987511c200877bb20201772d5de46644151f2 (diff) |
rcu: Update rcutorture documentation
Update rcutorture documentation to account for boosting, new types of
RCU torture testing that have been added over the past few years, and
the memory-barrier testing that was added an embarrassingly long time
ago.
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'Documentation/RCU')
-rw-r--r-- | Documentation/RCU/torture.txt | 134 |
1 files changed, 99 insertions, 35 deletions
diff --git a/Documentation/RCU/torture.txt b/Documentation/RCU/torture.txt index 5d9016795fd8..4205ed1f8adc 100644 --- a/Documentation/RCU/torture.txt +++ b/Documentation/RCU/torture.txt | |||
@@ -42,7 +42,7 @@ fqs_holdoff Holdoff time (in microseconds) between consecutive calls | |||
42 | fqs_stutter Wait time (in seconds) between consecutive bursts | 42 | fqs_stutter Wait time (in seconds) between consecutive bursts |
43 | of calls to force_quiescent_state(). | 43 | of calls to force_quiescent_state(). |
44 | 44 | ||
45 | irqreaders Says to invoke RCU readers from irq level. This is currently | 45 | irqreader Says to invoke RCU readers from irq level. This is currently |
46 | done via timers. Defaults to "1" for variants of RCU that | 46 | done via timers. Defaults to "1" for variants of RCU that |
47 | permit this. (Or, more accurately, variants of RCU that do | 47 | permit this. (Or, more accurately, variants of RCU that do |
48 | -not- permit this know to ignore this variable.) | 48 | -not- permit this know to ignore this variable.) |
@@ -79,19 +79,65 @@ stutter The length of time to run the test before pausing for this | |||
79 | Specifying "stutter=0" causes the test to run continuously | 79 | Specifying "stutter=0" causes the test to run continuously |
80 | without pausing, which is the old default behavior. | 80 | without pausing, which is the old default behavior. |
81 | 81 | ||
82 | test_boost Whether or not to test the ability of RCU to do priority | ||
83 | boosting. Defaults to "test_boost=1", which performs | ||
84 | RCU priority-inversion testing only if the selected | ||
85 | RCU implementation supports priority boosting. Specifying | ||
86 | "test_boost=0" never performs RCU priority-inversion | ||
87 | testing. Specifying "test_boost=2" performs RCU | ||
88 | priority-inversion testing even if the selected RCU | ||
89 | implementation does not support RCU priority boosting, | ||
90 | which can be used to test rcutorture's ability to | ||
91 | carry out RCU priority-inversion testing. | ||
92 | |||
93 | test_boost_interval | ||
94 | The number of seconds in an RCU priority-inversion test | ||
95 | cycle. Defaults to "test_boost_interval=7". It is | ||
96 | usually wise for this value to be relatively prime to | ||
97 | the value selected for "stutter". | ||
98 | |||
99 | test_boost_duration | ||
100 | The number of seconds to do RCU priority-inversion testing | ||
101 | within any given "test_boost_interval". Defaults to | ||
102 | "test_boost_duration=4". | ||
103 | |||
82 | test_no_idle_hz Whether or not to test the ability of RCU to operate in | 104 | test_no_idle_hz Whether or not to test the ability of RCU to operate in |
83 | a kernel that disables the scheduling-clock interrupt to | 105 | a kernel that disables the scheduling-clock interrupt to |
84 | idle CPUs. Boolean parameter, "1" to test, "0" otherwise. | 106 | idle CPUs. Boolean parameter, "1" to test, "0" otherwise. |
85 | Defaults to omitting this test. | 107 | Defaults to omitting this test. |
86 | 108 | ||
87 | torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API, | 109 | torture_type The type of RCU to test, with string values as follows: |
88 | "rcu_sync" for rcu_read_lock() with synchronous reclamation, | 110 | |
89 | "rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for | 111 | "rcu": rcu_read_lock(), rcu_read_unlock() and call_rcu(). |
90 | rcu_read_lock_bh() with synchronous reclamation, "srcu" for | 112 | |
91 | the "srcu_read_lock()" API, "sched" for the use of | 113 | "rcu_sync": rcu_read_lock(), rcu_read_unlock(), and |
92 | preempt_disable() together with synchronize_sched(), | 114 | synchronize_rcu(). |
93 | and "sched_expedited" for the use of preempt_disable() | 115 | |
94 | with synchronize_sched_expedited(). | 116 | "rcu_expedited": rcu_read_lock(), rcu_read_unlock(), and |
117 | synchronize_rcu_expedited(). | ||
118 | |||
119 | "rcu_bh": rcu_read_lock_bh(), rcu_read_unlock_bh(), and | ||
120 | call_rcu_bh(). | ||
121 | |||
122 | "rcu_bh_sync": rcu_read_lock_bh(), rcu_read_unlock_bh(), | ||
123 | and synchronize_rcu_bh(). | ||
124 | |||
125 | "srcu": srcu_read_lock(), srcu_read_unlock() and | ||
126 | synchronize_srcu(). | ||
127 | |||
128 | "srcu_expedited": srcu_read_lock(), srcu_read_unlock() and | ||
129 | synchronize_srcu_expedited(). | ||
130 | |||
131 | "sched": preempt_disable(), preempt_enable(), and | ||
132 | call_rcu_sched(). | ||
133 | |||
134 | "sched_sync": preempt_disable(), preempt_enable(), and | ||
135 | synchronize_sched(). | ||
136 | |||
137 | "sched_expedited": preempt_disable(), preempt_enable(), and | ||
138 | synchronize_sched_expedited(). | ||
139 | |||
140 | Defaults to "rcu". | ||
95 | 141 | ||
96 | verbose Enable debug printk()s. Default is disabled. | 142 | verbose Enable debug printk()s. Default is disabled. |
97 | 143 | ||
@@ -100,12 +146,12 @@ OUTPUT | |||
100 | 146 | ||
101 | The statistics output is as follows: | 147 | The statistics output is as follows: |
102 | 148 | ||
103 | rcu-torture: --- Start of test: nreaders=16 stat_interval=0 verbose=0 | 149 | rcu-torture:--- Start of test: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 |
104 | rcu-torture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915 | 150 | rcu-torture: rtc: (null) ver: 155441 tfle: 0 rta: 155441 rtaf: 8884 rtf: 155440 rtmbe: 0 rtbke: 0 rtbre: 0 rtbf: 0 rtb: 0 nt: 3055767 |
105 | rcu-torture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0 | 151 | rcu-torture: Reader Pipe: 727860534 34213 0 0 0 0 0 0 0 0 0 |
106 | rcu-torture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0 | 152 | rcu-torture: Reader Batch: 727877838 17003 0 0 0 0 0 0 0 0 0 |
107 | rcu-torture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0 | 153 | rcu-torture: Free-Block Circulation: 155440 155440 155440 155440 155440 155440 155440 155440 155440 155440 0 |
108 | rcu-torture: --- End of test | 154 | rcu-torture:--- End of test: SUCCESS: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 |
109 | 155 | ||
110 | The command "dmesg | grep torture:" will extract this information on | 156 | The command "dmesg | grep torture:" will extract this information on |
111 | most systems. On more esoteric configurations, it may be necessary to | 157 | most systems. On more esoteric configurations, it may be necessary to |
@@ -113,26 +159,55 @@ use other commands to access the output of the printk()s used by | |||
113 | the RCU torture test. The printk()s use KERN_ALERT, so they should | 159 | the RCU torture test. The printk()s use KERN_ALERT, so they should |
114 | be evident. ;-) | 160 | be evident. ;-) |
115 | 161 | ||
162 | The first and last lines show the rcutorture module parameters, and the | ||
163 | last line shows either "SUCCESS" or "FAILURE", based on rcutorture's | ||
164 | automatic determination as to whether RCU operated correctly. | ||
165 | |||
116 | The entries are as follows: | 166 | The entries are as follows: |
117 | 167 | ||
118 | o "rtc": The hexadecimal address of the structure currently visible | 168 | o "rtc": The hexadecimal address of the structure currently visible |
119 | to readers. | 169 | to readers. |
120 | 170 | ||
121 | o "ver": The number of times since boot that the rcutw writer task | 171 | o "ver": The number of times since boot that the RCU writer task |
122 | has changed the structure visible to readers. | 172 | has changed the structure visible to readers. |
123 | 173 | ||
124 | o "tfle": If non-zero, indicates that the "torture freelist" | 174 | o "tfle": If non-zero, indicates that the "torture freelist" |
125 | containing structure to be placed into the "rtc" area is empty. | 175 | containing structures to be placed into the "rtc" area is empty. |
126 | This condition is important, since it can fool you into thinking | 176 | This condition is important, since it can fool you into thinking |
127 | that RCU is working when it is not. :-/ | 177 | that RCU is working when it is not. :-/ |
128 | 178 | ||
129 | o "rta": Number of structures allocated from the torture freelist. | 179 | o "rta": Number of structures allocated from the torture freelist. |
130 | 180 | ||
131 | o "rtaf": Number of allocations from the torture freelist that have | 181 | o "rtaf": Number of allocations from the torture freelist that have |
132 | failed due to the list being empty. | 182 | failed due to the list being empty. It is not unusual for this |
183 | to be non-zero, but it is bad for it to be a large fraction of | ||
184 | the value indicated by "rta". | ||
133 | 185 | ||
134 | o "rtf": Number of frees into the torture freelist. | 186 | o "rtf": Number of frees into the torture freelist. |
135 | 187 | ||
188 | o "rtmbe": A non-zero value indicates that rcutorture believes that | ||
189 | rcu_assign_pointer() and rcu_dereference() are not working | ||
190 | correctly. This value should be zero. | ||
191 | |||
192 | o "rtbke": rcutorture was unable to create the real-time kthreads | ||
193 | used to force RCU priority inversion. This value should be zero. | ||
194 | |||
195 | o "rtbre": Although rcutorture successfully created the kthreads | ||
196 | used to force RCU priority inversion, it was unable to set them | ||
197 | to the real-time priority level of 1. This value should be zero. | ||
198 | |||
199 | o "rtbf": The number of times that RCU priority boosting failed | ||
200 | to resolve RCU priority inversion. | ||
201 | |||
202 | o "rtb": The number of times that rcutorture attempted to force | ||
203 | an RCU priority inversion condition. If you are testing RCU | ||
204 | priority boosting via the "test_boost" module parameter, this | ||
205 | value should be non-zero. | ||
206 | |||
207 | o "nt": The number of times rcutorture ran RCU read-side code from | ||
208 | within a timer handler. This value should be non-zero only | ||
209 | if you specified the "irqreader" module parameter. | ||
210 | |||
136 | o "Reader Pipe": Histogram of "ages" of structures seen by readers. | 211 | o "Reader Pipe": Histogram of "ages" of structures seen by readers. |
137 | If any entries past the first two are non-zero, RCU is broken. | 212 | If any entries past the first two are non-zero, RCU is broken. |
138 | And rcutorture prints the error flag string "!!!" to make sure | 213 | And rcutorture prints the error flag string "!!!" to make sure |
@@ -162,26 +237,15 @@ o "Free-Block Circulation": Shows the number of torture structures | |||
162 | somehow gets incremented farther than it should. | 237 | somehow gets incremented farther than it should. |
163 | 238 | ||
164 | Different implementations of RCU can provide implementation-specific | 239 | Different implementations of RCU can provide implementation-specific |
165 | additional information. For example, SRCU provides the following: | 240 | additional information. For example, SRCU provides the following |
241 | additional line: | ||
166 | 242 | ||
167 | srcu-torture: rtc: f8cf46a8 ver: 355 tfle: 0 rta: 356 rtaf: 0 rtf: 346 rtmbe: 0 | ||
168 | srcu-torture: Reader Pipe: 559738 939 0 0 0 0 0 0 0 0 0 | ||
169 | srcu-torture: Reader Batch: 560434 243 0 0 0 0 0 0 0 0 | ||
170 | srcu-torture: Free-Block Circulation: 355 354 353 352 351 350 349 348 347 346 0 | ||
171 | srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1) | 243 | srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1) |
172 | 244 | ||
173 | The first four lines are similar to those for RCU. The last line shows | 245 | This line shows the per-CPU counter state. The numbers in parentheses are |
174 | the per-CPU counter state. The numbers in parentheses are the values | 246 | the values of the "old" and "current" counters for the corresponding CPU. |
175 | of the "old" and "current" counters for the corresponding CPU. The | 247 | The "idx" value maps the "old" and "current" values to the underlying |
176 | "idx" value maps the "old" and "current" values to the underlying array, | 248 | array, and is useful for debugging. |
177 | and is useful for debugging. | ||
178 | |||
179 | Similarly, sched_expedited RCU provides the following: | ||
180 | |||
181 | sched_expedited-torture: rtc: d0000000016c1880 ver: 1090796 tfle: 0 rta: 1090796 rtaf: 0 rtf: 1090787 rtmbe: 0 nt: 27713319 | ||
182 | sched_expedited-torture: Reader Pipe: 12660320201 95875 0 0 0 0 0 0 0 0 0 | ||
183 | sched_expedited-torture: Reader Batch: 12660424885 0 0 0 0 0 0 0 0 0 0 | ||
184 | sched_expedited-torture: Free-Block Circulation: 1090795 1090795 1090794 1090793 1090792 1090791 1090790 1090789 1090788 1090787 0 | ||
185 | 249 | ||
186 | 250 | ||
187 | USAGE | 251 | USAGE |