summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-07-02 11:25:57 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-08-30 13:59:48 -0400
commit77095901b895a64b6d775879b54c73472ba21e68 (patch)
treef448aee47cd56c244ef32eb2b804959cc7ef1e20
parentea24c125fe79fd966a4f59768d3d70142a9eb18d (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.html23
-rw-r--r--Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html7
-rw-r--r--Documentation/RCU/Design/Requirements/Requirements.html149
-rw-r--r--Documentation/RCU/stallwarn.txt13
-rw-r--r--Documentation/RCU/whatisRCU.txt3
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt16
-rw-r--r--Documentation/kernel-per-CPU-kthreads.txt2
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.
1374Accessor Functions</a></h3> 1374Accessor 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) = &amp;(rsp)-&gt;node[0]; \ 1387 7 for ((rnp) = &amp;(rsp)-&gt;node[0]; \
1389 8 (rnp) &lt; &amp;(rsp)-&gt;node[NUM_RCU_NODES]; (rnp)++) 1388 8 (rnp) &lt; &amp;(rsp)-&gt;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) = &amp;(rsp)-&gt;node[0]; \ 1391 11 for ((rnp) = (rsp)-&gt;level[NUM_RCU_LVLS - 1]; \
1393 12 (rnp) &lt; (rsp)-&gt;level[NUM_RCU_LVLS - 1]; (rnp)++) 1392 12 (rnp) &lt; &amp;(rsp)-&gt;node[NUM_RCU_NODES]; (rnp)++)
1394 13
1395 14 #define rcu_for_each_leaf_node(rsp, rnp) \
1396 15 for ((rnp) = (rsp)-&gt;level[NUM_RCU_LVLS - 1]; \
1397 16 (rnp) &lt; &amp;(rsp)-&gt;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>
1407structures in the <tt>rcu_state</tt> structure's 1402structures in the <tt>rcu_state</tt> structure's
1408<tt>-&gt;node[]</tt> array, performing a breadth-first traversal by 1403<tt>-&gt;node[]</tt> array, performing a breadth-first traversal by
1409simply traversing the array in order. 1404simply traversing the array in order.
1410The <tt>rcu_for_each_nonleaf_node_breadth_first()</tt> macro operates 1405Similarly, the <tt>rcu_for_each_leaf_node()</tt> macro traverses only
1411similarly, but traverses only the first part of the array, thus excluding
1412the leaf <tt>rcu_node</tt> structures.
1413Finally, the <tt>rcu_for_each_leaf_node()</tt> macro traverses only
1414the last part of the array, thus traversing only the leaf 1406the 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>&nbsp;</th></tr> 1410<tr><th>&nbsp;</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>&nbsp;</td></tr> 1422<tr><td>&nbsp;</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
12lower efficiency and significant disturbance to attain shorter latencies. 12lower efficiency and significant disturbance to attain shorter latencies.
13 13
14<p> 14<p>
15There are three flavors of RCU (RCU-bh, RCU-preempt, and RCU-sched), 15There are two flavors of RCU (RCU-preempt and RCU-sched), with an earlier
16but only two flavors of expedited grace periods because the RCU-bh 16third RCU-bh flavor having been implemented in terms of the other two.
17expedited grace period maps onto the RCU-sched expedited grace period. 17Each of the two implementations is covered in its own section.
18Each 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>
1308This non-requirement appeared with preemptible RCU. 1308This non-requirement appeared with preemptible RCU.
1309If 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
2165on what operations those callbacks could invoke. 2163on what operations those callbacks could invoke.
2166 2164
2167<p> 2165<p>
2168Perhaps surprisingly, <tt>synchronize_rcu()</tt>, 2166Perhaps 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 2168will operate normally
2174<tt>synchronize_sched_expedited()</tt>
2175will all operate normally
2176during very early boot, the reason being that there is only one CPU 2169during very early boot, the reason being that there is only one CPU
2177and preemption is disabled. 2170and preemption is disabled.
2178This means that the call <tt>synchronize_rcu()</tt> (or friends) 2171This 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
2861described in a separate section. 2854described 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>
2866The RCU-bh flavor of RCU has since been expressed in terms of
2867the other RCU flavors as part of a consolidation of the three
2868flavors into a single flavor.
2869The read-side API remains, and continues to disable softirq and to
2870be accounted for by lockdep.
2871Much of the material in this section is therefore strictly historical
2872in nature.
2873 2873
2874<p> 2874<p>
2875The softirq-disable (AKA &ldquo;bottom-half&rdquo;, 2875The softirq-disable (AKA &ldquo;bottom-half&rdquo;,
@@ -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>.
2932However, the update-side APIs are now simple wrappers for other RCU
2933flavors, namely RCU-sched in CONFIG_PREEMPT=n kernels and RCU-preempt
2934otherwise.
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>
2939The RCU-sched flavor of RCU has since been expressed in terms of
2940the other RCU flavors as part of a consolidation of the three
2941flavors into a single flavor.
2942The read-side API remains, and continues to disable preemption and to
2943be accounted for by lockdep.
2944Much of the material in this section is therefore strictly historical
2945in nature.
2934 2946
2935<p> 2947<p>
2936Before preemptible RCU, waiting for an RCU grace period had the 2948Before 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 3165In <tt>CONFIG_PREEMPT=n</tt> kernels, trampolines cannot be preempted,
3154<h3><a name="Waiting for Multiple Grace Periods"> 3166so these APIs map to
3155Waiting 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.
3158Perhaps you have an RCU protected data structure that is accessed from 3170In <tt>CONFIG_PREEMPT=y</tt> kernels, trampolines can be preempted,
3159RCU read-side critical sections, from softirq handlers, and from 3171and these three APIs are therefore implemented by separate functions
3160hardware interrupt handlers. 3172that check for voluntary context switches.
3161That is three flavors of RCU, the normal flavor, the bottom-half flavor,
3162and the sched flavor.
3163How to wait for a compound grace period?
3164
3165<p>
3166The best approach is usually to &ldquo;just say no!&rdquo; and
3167insert <tt>rcu_read_lock()</tt> and <tt>rcu_read_unlock()</tt>
3168around each RCU read-side critical section, regardless of what
3169environment it happens to be in.
3170But suppose that some of the RCU read-side critical sections are
3171on extremely hot code paths, and that use of <tt>CONFIG_PREEMPT=n</tt>
3172is not a viable option, so that <tt>rcu_read_lock()</tt> and
3173<tt>rcu_read_unlock()</tt> are not free.
3174What then?
3175
3176<p>
3177You <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>
3188This works, but triples the update-side latency penalty.
3189In cases where this is not acceptable, <tt>synchronize_rcu_mult()</tt>
3190may 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>
3199But what if it is necessary to also wait on SRCU?
3200This 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(&amp;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>
3215If 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>&nbsp;</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>&nbsp;</td></tr>
3235</table>
3236
3237<p>
3238Again, it is usually better to adjust the RCU read-side critical sections
3239to 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
3249latency. 3181latency.
3250 3182
3251<p> 3183<p>
3252Expedited grace periods scan the CPUs, so their latency and overhead
3253increases with increasing numbers of CPUs.
3254If this becomes a serious problem on large systems, it will be necessary
3255to do some redesign to avoid this scalability problem.
3256
3257<p>
3258RCU disables CPU hotplug in a few places, perhaps most notably in the 3184RCU disables CPU hotplug in a few places, perhaps most notably in the
3259<tt>rcu_barrier()</tt> operations. 3185<tt>rcu_barrier()</tt> operations.
3260If there is a strong reason to use <tt>rcu_barrier()</tt> in CPU-hotplug 3186If 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
3299alternatives. 3225alternatives.
3300 3226
3301<p> 3227<p>
3302There is an embarrassingly large number of flavors of RCU, and this
3303number has been increasing over time.
3304Perhaps it will be possible to combine some at some future date.
3305
3306<p>
3307RCU's various kthreads are reasonably recent additions. 3228RCU's various kthreads are reasonably recent additions.
3308It is quite likely that adjustments will be required to more gracefully 3229It is quite likely that adjustments will be required to more gracefully
3309handle extreme loads. 3230handle 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
17o A CPU looping with interrupts disabled. 17o A CPU looping with interrupts disabled.
18 18
19o A CPU looping with preemption disabled. This condition can 19o A CPU looping with preemption disabled.
20 result in RCU-sched stalls and, if ksoftirqd is in use, RCU-bh
21 stalls.
22 20
23o A CPU looping with bottom halves disabled. This condition can 21o A CPU looping with bottom halves disabled.
24 result in RCU-sched and RCU-bh stalls.
25 22
26o For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel 23o 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
90The RCU, RCU-sched, RCU-bh, and RCU-tasks implementations have CPU stall 87The RCU, RCU-sched, and RCU-tasks implementations have CPU stall warning.
91warning. Note that SRCU does -not- have CPU stall warnings. Please note 88Note that SRCU does -not- have CPU stall warnings. Please note that
92that RCU only detects CPU stalls when there is a grace period in progress. 89RCU only detects CPU stalls when there is a grace period in progress.
93No grace period, no CPU stall warnings. 90No grace period, no CPU stall warnings.
94 91
95To diagnose the cause of the stall, inspect the stack traces. 92To 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,
934d. Do you need RCU grace periods to complete even in the face 934d. 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
939e. Is your workload too update-intensive for normal use of 940e. 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
323Name: 323Name:
324 rcuob/%d, rcuop/%d, and rcuos/%d 324 rcuop/%d and rcuos/%d
325 325
326Purpose: 326Purpose:
327 Offload RCU callbacks from the corresponding CPU. 327 Offload RCU callbacks from the corresponding CPU.