diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2018-07-02 11:25:57 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2018-08-30 13:59:48 -0400 |
commit | 77095901b895a64b6d775879b54c73472ba21e68 (patch) | |
tree | f448aee47cd56c244ef32eb2b804959cc7ef1e20 | |
parent | ea24c125fe79fd966a4f59768d3d70142a9eb18d (diff) |
doc: Update removal of RCU-bh/sched update machinery
The RCU-bh update API is now defined in terms of that of RCU-bh and
RCU-sched, so this commit updates the documentation accordingly.
In addition, although RCU-sched persists in !PREEMPT kernels, in
the PREEMPT case its update API is now defined in terms of that of
RCU-preempt, so this commit also updates the documentation accordingly.
While in the area, this commit removes the documentation for the
now-obsolete synchronize_rcu_mult() and clarifies the Tasks RCU
documentation.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
-rw-r--r-- | Documentation/RCU/Design/Data-Structures/Data-Structures.html | 23 | ||||
-rw-r--r-- | Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html | 7 | ||||
-rw-r--r-- | Documentation/RCU/Design/Requirements/Requirements.html | 149 | ||||
-rw-r--r-- | Documentation/RCU/stallwarn.txt | 13 | ||||
-rw-r--r-- | Documentation/RCU/whatisRCU.txt | 3 | ||||
-rw-r--r-- | Documentation/admin-guide/kernel-parameters.txt | 16 | ||||
-rw-r--r-- | Documentation/kernel-per-CPU-kthreads.txt | 2 |
7 files changed, 61 insertions, 152 deletions
diff --git a/Documentation/RCU/Design/Data-Structures/Data-Structures.html b/Documentation/RCU/Design/Data-Structures/Data-Structures.html index 50be87e59937..1d2051c0c3fc 100644 --- a/Documentation/RCU/Design/Data-Structures/Data-Structures.html +++ b/Documentation/RCU/Design/Data-Structures/Data-Structures.html | |||
@@ -1374,8 +1374,7 @@ that is, if the CPU is currently idle. | |||
1374 | Accessor Functions</a></h3> | 1374 | Accessor Functions</a></h3> |
1375 | 1375 | ||
1376 | <p>The following listing shows the | 1376 | <p>The following listing shows the |
1377 | <tt>rcu_get_root()</tt>, <tt>rcu_for_each_node_breadth_first</tt>, | 1377 | <tt>rcu_get_root()</tt>, <tt>rcu_for_each_node_breadth_first</tt> and |
1378 | <tt>rcu_for_each_nonleaf_node_breadth_first()</tt>, and | ||
1379 | <tt>rcu_for_each_leaf_node()</tt> function and macros: | 1378 | <tt>rcu_for_each_leaf_node()</tt> function and macros: |
1380 | 1379 | ||
1381 | <pre> | 1380 | <pre> |
@@ -1388,13 +1387,9 @@ Accessor Functions</a></h3> | |||
1388 | 7 for ((rnp) = &(rsp)->node[0]; \ | 1387 | 7 for ((rnp) = &(rsp)->node[0]; \ |
1389 | 8 (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | 1388 | 8 (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) |
1390 | 9 | 1389 | 9 |
1391 | 10 #define rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) \ | 1390 | 10 #define rcu_for_each_leaf_node(rsp, rnp) \ |
1392 | 11 for ((rnp) = &(rsp)->node[0]; \ | 1391 | 11 for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ |
1393 | 12 (rnp) < (rsp)->level[NUM_RCU_LVLS - 1]; (rnp)++) | 1392 | 12 (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) |
1394 | 13 | ||
1395 | 14 #define rcu_for_each_leaf_node(rsp, rnp) \ | ||
1396 | 15 for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ | ||
1397 | 16 (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | ||
1398 | </pre> | 1393 | </pre> |
1399 | 1394 | ||
1400 | <p>The <tt>rcu_get_root()</tt> simply returns a pointer to the | 1395 | <p>The <tt>rcu_get_root()</tt> simply returns a pointer to the |
@@ -1407,10 +1402,7 @@ macro takes advantage of the layout of the <tt>rcu_node</tt> | |||
1407 | structures in the <tt>rcu_state</tt> structure's | 1402 | structures in the <tt>rcu_state</tt> structure's |
1408 | <tt>->node[]</tt> array, performing a breadth-first traversal by | 1403 | <tt>->node[]</tt> array, performing a breadth-first traversal by |
1409 | simply traversing the array in order. | 1404 | simply traversing the array in order. |
1410 | The <tt>rcu_for_each_nonleaf_node_breadth_first()</tt> macro operates | 1405 | Similarly, the <tt>rcu_for_each_leaf_node()</tt> macro traverses only |
1411 | similarly, but traverses only the first part of the array, thus excluding | ||
1412 | the leaf <tt>rcu_node</tt> structures. | ||
1413 | Finally, the <tt>rcu_for_each_leaf_node()</tt> macro traverses only | ||
1414 | the last part of the array, thus traversing only the leaf | 1406 | the last part of the array, thus traversing only the leaf |
1415 | <tt>rcu_node</tt> structures. | 1407 | <tt>rcu_node</tt> structures. |
1416 | 1408 | ||
@@ -1418,15 +1410,14 @@ the last part of the array, thus traversing only the leaf | |||
1418 | <tr><th> </th></tr> | 1410 | <tr><th> </th></tr> |
1419 | <tr><th align="left">Quick Quiz:</th></tr> | 1411 | <tr><th align="left">Quick Quiz:</th></tr> |
1420 | <tr><td> | 1412 | <tr><td> |
1421 | What do <tt>rcu_for_each_nonleaf_node_breadth_first()</tt> and | 1413 | What does |
1422 | <tt>rcu_for_each_leaf_node()</tt> do if the <tt>rcu_node</tt> tree | 1414 | <tt>rcu_for_each_leaf_node()</tt> do if the <tt>rcu_node</tt> tree |
1423 | contains only a single node? | 1415 | contains only a single node? |
1424 | </td></tr> | 1416 | </td></tr> |
1425 | <tr><th align="left">Answer:</th></tr> | 1417 | <tr><th align="left">Answer:</th></tr> |
1426 | <tr><td bgcolor="#ffffff"><font color="ffffff"> | 1418 | <tr><td bgcolor="#ffffff"><font color="ffffff"> |
1427 | In the single-node case, | 1419 | In the single-node case, |
1428 | <tt>rcu_for_each_nonleaf_node_breadth_first()</tt> is a no-op | 1420 | <tt>rcu_for_each_leaf_node()</tt> traverses the single node. |
1429 | and <tt>rcu_for_each_leaf_node()</tt> traverses the single node. | ||
1430 | </font></td></tr> | 1421 | </font></td></tr> |
1431 | <tr><td> </td></tr> | 1422 | <tr><td> </td></tr> |
1432 | </table> | 1423 | </table> |
diff --git a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html index 7394f034be65..ffd612bfa436 100644 --- a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html +++ b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html | |||
@@ -12,10 +12,9 @@ high efficiency and minimal disturbance, expedited grace periods accept | |||
12 | lower efficiency and significant disturbance to attain shorter latencies. | 12 | lower efficiency and significant disturbance to attain shorter latencies. |
13 | 13 | ||
14 | <p> | 14 | <p> |
15 | There are three flavors of RCU (RCU-bh, RCU-preempt, and RCU-sched), | 15 | There are two flavors of RCU (RCU-preempt and RCU-sched), with an earlier |
16 | but only two flavors of expedited grace periods because the RCU-bh | 16 | third RCU-bh flavor having been implemented in terms of the other two. |
17 | expedited grace period maps onto the RCU-sched expedited grace period. | 17 | Each of the two implementations is covered in its own section. |
18 | Each of the remaining two implementations is covered in its own section. | ||
19 | 18 | ||
20 | <ol> | 19 | <ol> |
21 | <li> <a href="#Expedited Grace Period Design"> | 20 | <li> <a href="#Expedited Grace Period Design"> |
diff --git a/Documentation/RCU/Design/Requirements/Requirements.html b/Documentation/RCU/Design/Requirements/Requirements.html index 51f39f65002d..701b5c53607f 100644 --- a/Documentation/RCU/Design/Requirements/Requirements.html +++ b/Documentation/RCU/Design/Requirements/Requirements.html | |||
@@ -1306,8 +1306,6 @@ doing so would degrade real-time response. | |||
1306 | 1306 | ||
1307 | <p> | 1307 | <p> |
1308 | This non-requirement appeared with preemptible RCU. | 1308 | This non-requirement appeared with preemptible RCU. |
1309 | If you need a grace period that waits on non-preemptible code regions, use | ||
1310 | <a href="#Sched Flavor">RCU-sched</a>. | ||
1311 | 1309 | ||
1312 | <h2><a name="Parallelism Facts of Life">Parallelism Facts of Life</a></h2> | 1310 | <h2><a name="Parallelism Facts of Life">Parallelism Facts of Life</a></h2> |
1313 | 1311 | ||
@@ -2165,14 +2163,9 @@ however, this is not a panacea because there would be severe restrictions | |||
2165 | on what operations those callbacks could invoke. | 2163 | on what operations those callbacks could invoke. |
2166 | 2164 | ||
2167 | <p> | 2165 | <p> |
2168 | Perhaps surprisingly, <tt>synchronize_rcu()</tt>, | 2166 | Perhaps surprisingly, <tt>synchronize_rcu()</tt> and |
2169 | <a href="#Bottom-Half Flavor"><tt>synchronize_rcu_bh()</tt></a> | ||
2170 | (<a href="#Bottom-Half Flavor">discussed below</a>), | ||
2171 | <a href="#Sched Flavor"><tt>synchronize_sched()</tt></a>, | ||
2172 | <tt>synchronize_rcu_expedited()</tt>, | 2167 | <tt>synchronize_rcu_expedited()</tt>, |
2173 | <tt>synchronize_rcu_bh_expedited()</tt>, and | 2168 | will operate normally |
2174 | <tt>synchronize_sched_expedited()</tt> | ||
2175 | will all operate normally | ||
2176 | during very early boot, the reason being that there is only one CPU | 2169 | during very early boot, the reason being that there is only one CPU |
2177 | and preemption is disabled. | 2170 | and preemption is disabled. |
2178 | This means that the call <tt>synchronize_rcu()</tt> (or friends) | 2171 | This means that the call <tt>synchronize_rcu()</tt> (or friends) |
@@ -2861,15 +2854,22 @@ The other four flavors are listed below, with requirements for each | |||
2861 | described in a separate section. | 2854 | described in a separate section. |
2862 | 2855 | ||
2863 | <ol> | 2856 | <ol> |
2864 | <li> <a href="#Bottom-Half Flavor">Bottom-Half Flavor</a> | 2857 | <li> <a href="#Bottom-Half Flavor">Bottom-Half Flavor (Historical)</a> |
2865 | <li> <a href="#Sched Flavor">Sched Flavor</a> | 2858 | <li> <a href="#Sched Flavor">Sched Flavor (Historical)</a> |
2866 | <li> <a href="#Sleepable RCU">Sleepable RCU</a> | 2859 | <li> <a href="#Sleepable RCU">Sleepable RCU</a> |
2867 | <li> <a href="#Tasks RCU">Tasks RCU</a> | 2860 | <li> <a href="#Tasks RCU">Tasks RCU</a> |
2868 | <li> <a href="#Waiting for Multiple Grace Periods"> | ||
2869 | Waiting for Multiple Grace Periods</a> | ||
2870 | </ol> | 2861 | </ol> |
2871 | 2862 | ||
2872 | <h3><a name="Bottom-Half Flavor">Bottom-Half Flavor</a></h3> | 2863 | <h3><a name="Bottom-Half Flavor">Bottom-Half Flavor (Historical)</a></h3> |
2864 | |||
2865 | <p> | ||
2866 | The RCU-bh flavor of RCU has since been expressed in terms of | ||
2867 | the other RCU flavors as part of a consolidation of the three | ||
2868 | flavors into a single flavor. | ||
2869 | The read-side API remains, and continues to disable softirq and to | ||
2870 | be accounted for by lockdep. | ||
2871 | Much of the material in this section is therefore strictly historical | ||
2872 | in nature. | ||
2873 | 2873 | ||
2874 | <p> | 2874 | <p> |
2875 | The softirq-disable (AKA “bottom-half”, | 2875 | The softirq-disable (AKA “bottom-half”, |
@@ -2929,8 +2929,20 @@ includes | |||
2929 | <tt>call_rcu_bh()</tt>, | 2929 | <tt>call_rcu_bh()</tt>, |
2930 | <tt>rcu_barrier_bh()</tt>, and | 2930 | <tt>rcu_barrier_bh()</tt>, and |
2931 | <tt>rcu_read_lock_bh_held()</tt>. | 2931 | <tt>rcu_read_lock_bh_held()</tt>. |
2932 | However, the update-side APIs are now simple wrappers for other RCU | ||
2933 | flavors, namely RCU-sched in CONFIG_PREEMPT=n kernels and RCU-preempt | ||
2934 | otherwise. | ||
2932 | 2935 | ||
2933 | <h3><a name="Sched Flavor">Sched Flavor</a></h3> | 2936 | <h3><a name="Sched Flavor">Sched Flavor (Historical)</a></h3> |
2937 | |||
2938 | <p> | ||
2939 | The RCU-sched flavor of RCU has since been expressed in terms of | ||
2940 | the other RCU flavors as part of a consolidation of the three | ||
2941 | flavors into a single flavor. | ||
2942 | The read-side API remains, and continues to disable preemption and to | ||
2943 | be accounted for by lockdep. | ||
2944 | Much of the material in this section is therefore strictly historical | ||
2945 | in nature. | ||
2934 | 2946 | ||
2935 | <p> | 2947 | <p> |
2936 | Before preemptible RCU, waiting for an RCU grace period had the | 2948 | Before preemptible RCU, waiting for an RCU grace period had the |
@@ -3150,94 +3162,14 @@ The tasks-RCU API is quite compact, consisting only of | |||
3150 | <tt>call_rcu_tasks()</tt>, | 3162 | <tt>call_rcu_tasks()</tt>, |
3151 | <tt>synchronize_rcu_tasks()</tt>, and | 3163 | <tt>synchronize_rcu_tasks()</tt>, and |
3152 | <tt>rcu_barrier_tasks()</tt>. | 3164 | <tt>rcu_barrier_tasks()</tt>. |
3153 | 3165 | In <tt>CONFIG_PREEMPT=n</tt> kernels, trampolines cannot be preempted, | |
3154 | <h3><a name="Waiting for Multiple Grace Periods"> | 3166 | so these APIs map to |
3155 | Waiting for Multiple Grace Periods</a></h3> | 3167 | <tt>call_rcu()</tt>, |
3156 | 3168 | <tt>synchronize_rcu()</tt>, and | |
3157 | <p> | 3169 | <tt>rcu_barrier()</tt>, respectively. |
3158 | Perhaps you have an RCU protected data structure that is accessed from | 3170 | In <tt>CONFIG_PREEMPT=y</tt> kernels, trampolines can be preempted, |
3159 | RCU read-side critical sections, from softirq handlers, and from | 3171 | and these three APIs are therefore implemented by separate functions |
3160 | hardware interrupt handlers. | 3172 | that check for voluntary context switches. |
3161 | That is three flavors of RCU, the normal flavor, the bottom-half flavor, | ||
3162 | and the sched flavor. | ||
3163 | How to wait for a compound grace period? | ||
3164 | |||
3165 | <p> | ||
3166 | The best approach is usually to “just say no!” and | ||
3167 | insert <tt>rcu_read_lock()</tt> and <tt>rcu_read_unlock()</tt> | ||
3168 | around each RCU read-side critical section, regardless of what | ||
3169 | environment it happens to be in. | ||
3170 | But suppose that some of the RCU read-side critical sections are | ||
3171 | on extremely hot code paths, and that use of <tt>CONFIG_PREEMPT=n</tt> | ||
3172 | is not a viable option, so that <tt>rcu_read_lock()</tt> and | ||
3173 | <tt>rcu_read_unlock()</tt> are not free. | ||
3174 | What then? | ||
3175 | |||
3176 | <p> | ||
3177 | You <i>could</i> wait on all three grace periods in succession, as follows: | ||
3178 | |||
3179 | <blockquote> | ||
3180 | <pre> | ||
3181 | 1 synchronize_rcu(); | ||
3182 | 2 synchronize_rcu_bh(); | ||
3183 | 3 synchronize_sched(); | ||
3184 | </pre> | ||
3185 | </blockquote> | ||
3186 | |||
3187 | <p> | ||
3188 | This works, but triples the update-side latency penalty. | ||
3189 | In cases where this is not acceptable, <tt>synchronize_rcu_mult()</tt> | ||
3190 | may be used to wait on all three flavors of grace period concurrently: | ||
3191 | |||
3192 | <blockquote> | ||
3193 | <pre> | ||
3194 | 1 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched); | ||
3195 | </pre> | ||
3196 | </blockquote> | ||
3197 | |||
3198 | <p> | ||
3199 | But what if it is necessary to also wait on SRCU? | ||
3200 | This can be done as follows: | ||
3201 | |||
3202 | <blockquote> | ||
3203 | <pre> | ||
3204 | 1 static void call_my_srcu(struct rcu_head *head, | ||
3205 | 2 void (*func)(struct rcu_head *head)) | ||
3206 | 3 { | ||
3207 | 4 call_srcu(&my_srcu, head, func); | ||
3208 | 5 } | ||
3209 | 6 | ||
3210 | 7 synchronize_rcu_mult(call_rcu, call_rcu_bh, call_rcu_sched, call_my_srcu); | ||
3211 | </pre> | ||
3212 | </blockquote> | ||
3213 | |||
3214 | <p> | ||
3215 | If you needed to wait on multiple different flavors of SRCU | ||
3216 | (but why???), you would need to create a wrapper function resembling | ||
3217 | <tt>call_my_srcu()</tt> for each SRCU flavor. | ||
3218 | |||
3219 | <table> | ||
3220 | <tr><th> </th></tr> | ||
3221 | <tr><th align="left">Quick Quiz:</th></tr> | ||
3222 | <tr><td> | ||
3223 | But what if I need to wait for multiple RCU flavors, but I also need | ||
3224 | the grace periods to be expedited? | ||
3225 | </td></tr> | ||
3226 | <tr><th align="left">Answer:</th></tr> | ||
3227 | <tr><td bgcolor="#ffffff"><font color="ffffff"> | ||
3228 | If you are using expedited grace periods, there should be less penalty | ||
3229 | for waiting on them in succession. | ||
3230 | But if that is nevertheless a problem, you can use workqueues | ||
3231 | or multiple kthreads to wait on the various expedited grace | ||
3232 | periods concurrently. | ||
3233 | </font></td></tr> | ||
3234 | <tr><td> </td></tr> | ||
3235 | </table> | ||
3236 | |||
3237 | <p> | ||
3238 | Again, it is usually better to adjust the RCU read-side critical sections | ||
3239 | to use a single flavor of RCU, but when this is not feasible, you can use | ||
3240 | <tt>synchronize_rcu_mult()</tt>. | ||
3241 | 3173 | ||
3242 | <h2><a name="Possible Future Changes">Possible Future Changes</a></h2> | 3174 | <h2><a name="Possible Future Changes">Possible Future Changes</a></h2> |
3243 | 3175 | ||
@@ -3249,12 +3181,6 @@ grace-period state machine so as to avoid the need for the additional | |||
3249 | latency. | 3181 | latency. |
3250 | 3182 | ||
3251 | <p> | 3183 | <p> |
3252 | Expedited grace periods scan the CPUs, so their latency and overhead | ||
3253 | increases with increasing numbers of CPUs. | ||
3254 | If this becomes a serious problem on large systems, it will be necessary | ||
3255 | to do some redesign to avoid this scalability problem. | ||
3256 | |||
3257 | <p> | ||
3258 | RCU disables CPU hotplug in a few places, perhaps most notably in the | 3184 | RCU disables CPU hotplug in a few places, perhaps most notably in the |
3259 | <tt>rcu_barrier()</tt> operations. | 3185 | <tt>rcu_barrier()</tt> operations. |
3260 | If there is a strong reason to use <tt>rcu_barrier()</tt> in CPU-hotplug | 3186 | If there is a strong reason to use <tt>rcu_barrier()</tt> in CPU-hotplug |
@@ -3299,11 +3225,6 @@ require extremely good demonstration of need and full exploration of | |||
3299 | alternatives. | 3225 | alternatives. |
3300 | 3226 | ||
3301 | <p> | 3227 | <p> |
3302 | There is an embarrassingly large number of flavors of RCU, and this | ||
3303 | number has been increasing over time. | ||
3304 | Perhaps it will be possible to combine some at some future date. | ||
3305 | |||
3306 | <p> | ||
3307 | RCU's various kthreads are reasonably recent additions. | 3228 | RCU's various kthreads are reasonably recent additions. |
3308 | It is quite likely that adjustments will be required to more gracefully | 3229 | It is quite likely that adjustments will be required to more gracefully |
3309 | handle extreme loads. | 3230 | handle extreme loads. |
diff --git a/Documentation/RCU/stallwarn.txt b/Documentation/RCU/stallwarn.txt index f99cf11b314b..491043fd976f 100644 --- a/Documentation/RCU/stallwarn.txt +++ b/Documentation/RCU/stallwarn.txt | |||
@@ -16,12 +16,9 @@ o A CPU looping in an RCU read-side critical section. | |||
16 | 16 | ||
17 | o A CPU looping with interrupts disabled. | 17 | o A CPU looping with interrupts disabled. |
18 | 18 | ||
19 | o A CPU looping with preemption disabled. This condition can | 19 | o A CPU looping with preemption disabled. |
20 | result in RCU-sched stalls and, if ksoftirqd is in use, RCU-bh | ||
21 | stalls. | ||
22 | 20 | ||
23 | o A CPU looping with bottom halves disabled. This condition can | 21 | o A CPU looping with bottom halves disabled. |
24 | result in RCU-sched and RCU-bh stalls. | ||
25 | 22 | ||
26 | o For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel | 23 | o For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel |
27 | without invoking schedule(). If the looping in the kernel is | 24 | without invoking schedule(). If the looping in the kernel is |
@@ -87,9 +84,9 @@ o A hardware failure. This is quite unlikely, but has occurred | |||
87 | This resulted in a series of RCU CPU stall warnings, eventually | 84 | This resulted in a series of RCU CPU stall warnings, eventually |
88 | leading the realization that the CPU had failed. | 85 | leading the realization that the CPU had failed. |
89 | 86 | ||
90 | The RCU, RCU-sched, RCU-bh, and RCU-tasks implementations have CPU stall | 87 | The RCU, RCU-sched, and RCU-tasks implementations have CPU stall warning. |
91 | warning. Note that SRCU does -not- have CPU stall warnings. Please note | 88 | Note that SRCU does -not- have CPU stall warnings. Please note that |
92 | that RCU only detects CPU stalls when there is a grace period in progress. | 89 | RCU only detects CPU stalls when there is a grace period in progress. |
93 | No grace period, no CPU stall warnings. | 90 | No grace period, no CPU stall warnings. |
94 | 91 | ||
95 | To diagnose the cause of the stall, inspect the stack traces. | 92 | To diagnose the cause of the stall, inspect the stack traces. |
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt index c2a7facf7ff9..86d82f7f3500 100644 --- a/Documentation/RCU/whatisRCU.txt +++ b/Documentation/RCU/whatisRCU.txt | |||
@@ -934,7 +934,8 @@ c. Do you need to treat NMI handlers, hardirq handlers, | |||
934 | d. Do you need RCU grace periods to complete even in the face | 934 | d. Do you need RCU grace periods to complete even in the face |
935 | of softirq monopolization of one or more of the CPUs? For | 935 | of softirq monopolization of one or more of the CPUs? For |
936 | example, is your code subject to network-based denial-of-service | 936 | example, is your code subject to network-based denial-of-service |
937 | attacks? If so, you need RCU-bh. | 937 | attacks? If so, you should disable softirq across your readers, |
938 | for example, by using rcu_read_lock_bh(). | ||
938 | 939 | ||
939 | e. Is your workload too update-intensive for normal use of | 940 | e. Is your workload too update-intensive for normal use of |
940 | RCU, but inappropriate for other synchronization mechanisms? | 941 | RCU, but inappropriate for other synchronization mechanisms? |
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 9871e649ffef..9e69ec54b7d3 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt | |||
@@ -3534,14 +3534,14 @@ | |||
3534 | 3534 | ||
3535 | In kernels built with CONFIG_RCU_NOCB_CPU=y, set | 3535 | In kernels built with CONFIG_RCU_NOCB_CPU=y, set |
3536 | the specified list of CPUs to be no-callback CPUs. | 3536 | the specified list of CPUs to be no-callback CPUs. |
3537 | Invocation of these CPUs' RCU callbacks will | 3537 | Invocation of these CPUs' RCU callbacks will be |
3538 | be offloaded to "rcuox/N" kthreads created for | 3538 | offloaded to "rcuox/N" kthreads created for that |
3539 | that purpose, where "x" is "b" for RCU-bh, "p" | 3539 | purpose, where "x" is "p" for RCU-preempt, and |
3540 | for RCU-preempt, and "s" for RCU-sched, and "N" | 3540 | "s" for RCU-sched, and "N" is the CPU number. |
3541 | is the CPU number. This reduces OS jitter on the | 3541 | This reduces OS jitter on the offloaded CPUs, |
3542 | offloaded CPUs, which can be useful for HPC and | 3542 | which can be useful for HPC and real-time |
3543 | real-time workloads. It can also improve energy | 3543 | workloads. It can also improve energy efficiency |
3544 | efficiency for asymmetric multiprocessors. | 3544 | for asymmetric multiprocessors. |
3545 | 3545 | ||
3546 | rcu_nocb_poll [KNL] | 3546 | rcu_nocb_poll [KNL] |
3547 | Rather than requiring that offloaded CPUs | 3547 | Rather than requiring that offloaded CPUs |
diff --git a/Documentation/kernel-per-CPU-kthreads.txt b/Documentation/kernel-per-CPU-kthreads.txt index 0f00f9c164ac..23b0c8b20cd1 100644 --- a/Documentation/kernel-per-CPU-kthreads.txt +++ b/Documentation/kernel-per-CPU-kthreads.txt | |||
@@ -321,7 +321,7 @@ To reduce its OS jitter, do at least one of the following: | |||
321 | to do. | 321 | to do. |
322 | 322 | ||
323 | Name: | 323 | Name: |
324 | rcuob/%d, rcuop/%d, and rcuos/%d | 324 | rcuop/%d and rcuos/%d |
325 | 325 | ||
326 | Purpose: | 326 | Purpose: |
327 | Offload RCU callbacks from the corresponding CPU. | 327 | Offload RCU callbacks from the corresponding CPU. |