• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2        "http://www.w3.org/TR/html4/loose.dtd">
3        <html>
4        <head><title>A Tour Through TREE_RCU's Expedited Grace Periods</title>
5        <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
6
7<h2>Introduction</h2>
8
9This document describes RCU's expedited grace periods.
10Unlike RCU's normal grace periods, which accept long latencies to attain
11high efficiency and minimal disturbance, expedited grace periods accept
12lower efficiency and significant disturbance to attain shorter latencies.
13
14<p>
15There are two flavors of RCU (RCU-preempt and RCU-sched), with an earlier
16third RCU-bh flavor having been implemented in terms of the other two.
17Each of the two implementations is covered in its own section.
18
19<ol>
20<li>	<a href="#Expedited Grace Period Design">
21	Expedited Grace Period Design</a>
22<li>	<a href="#RCU-preempt Expedited Grace Periods">
23	RCU-preempt Expedited Grace Periods</a>
24<li>	<a href="#RCU-sched Expedited Grace Periods">
25	RCU-sched Expedited Grace Periods</a>
26<li>	<a href="#Expedited Grace Period and CPU Hotplug">
27	Expedited Grace Period and CPU Hotplug</a>
28<li>	<a href="#Expedited Grace Period Refinements">
29	Expedited Grace Period Refinements</a>
30</ol>
31
32<h2><a name="Expedited Grace Period Design">
33Expedited Grace Period Design</a></h2>
34
35<p>
36The expedited RCU grace periods cannot be accused of being subtle,
37given that they for all intents and purposes hammer every CPU that
38has not yet provided a quiescent state for the current expedited
39grace period.
40The one saving grace is that the hammer has grown a bit smaller
41over time:  The old call to <tt>try_stop_cpus()</tt> has been
42replaced with a set of calls to <tt>smp_call_function_single()</tt>,
43each of which results in an IPI to the target CPU.
44The corresponding handler function checks the CPU's state, motivating
45a faster quiescent state where possible, and triggering a report
46of that quiescent state.
47As always for RCU, once everything has spent some time in a quiescent
48state, the expedited grace period has completed.
49
50<p>
51The details of the <tt>smp_call_function_single()</tt> handler's
52operation depend on the RCU flavor, as described in the following
53sections.
54
55<h2><a name="RCU-preempt Expedited Grace Periods">
56RCU-preempt Expedited Grace Periods</a></h2>
57
58<p>
59<tt>CONFIG_PREEMPT=y</tt> kernels implement RCU-preempt.
60The overall flow of the handling of a given CPU by an RCU-preempt
61expedited grace period is shown in the following diagram:
62
63<p><img src="ExpRCUFlow.svg" alt="ExpRCUFlow.svg" width="55%">
64
65<p>
66The solid arrows denote direct action, for example, a function call.
67The dotted arrows denote indirect action, for example, an IPI
68or a state that is reached after some time.
69
70<p>
71If a given CPU is offline or idle, <tt>synchronize_rcu_expedited()</tt>
72will ignore it because idle and offline CPUs are already residing
73in quiescent states.
74Otherwise, the expedited grace period will use
75<tt>smp_call_function_single()</tt> to send the CPU an IPI, which
76is handled by <tt>rcu_exp_handler()</tt>.
77
78<p>
79However, because this is preemptible RCU, <tt>rcu_exp_handler()</tt>
80can check to see if the CPU is currently running in an RCU read-side
81critical section.
82If not, the handler can immediately report a quiescent state.
83Otherwise, it sets flags so that the outermost <tt>rcu_read_unlock()</tt>
84invocation will provide the needed quiescent-state report.
85This flag-setting avoids the previous forced preemption of all
86CPUs that might have RCU read-side critical sections.
87In addition, this flag-setting is done so as to avoid increasing
88the overhead of the common-case fastpath through the scheduler.
89
90<p>
91Again because this is preemptible RCU, an RCU read-side critical section
92can be preempted.
93When that happens, RCU will enqueue the task, which will the continue to
94block the current expedited grace period until it resumes and finds its
95outermost <tt>rcu_read_unlock()</tt>.
96The CPU will report a quiescent state just after enqueuing the task because
97the CPU is no longer blocking the grace period.
98It is instead the preempted task doing the blocking.
99The list of blocked tasks is managed by <tt>rcu_preempt_ctxt_queue()</tt>,
100which is called from <tt>rcu_preempt_note_context_switch()</tt>, which
101in turn is called from <tt>rcu_note_context_switch()</tt>, which in
102turn is called from the scheduler.
103
104<table>
105<tr><th>&nbsp;</th></tr>
106<tr><th align="left">Quick Quiz:</th></tr>
107<tr><td>
108	Why not just have the expedited grace period check the
109	state of all the CPUs?
110	After all, that would avoid all those real-time-unfriendly IPIs.
111</td></tr>
112<tr><th align="left">Answer:</th></tr>
113<tr><td bgcolor="#ffffff"><font color="ffffff">
114	Because we want the RCU read-side critical sections to run fast,
115	which means no memory barriers.
116	Therefore, it is not possible to safely check the state from some
117	other CPU.
118	And even if it was possible to safely check the state, it would
119	still be necessary to IPI the CPU to safely interact with the
120	upcoming <tt>rcu_read_unlock()</tt> invocation, which means that
121	the remote state testing would not help the worst-case
122	latency that real-time applications care about.
123
124	<p><font color="ffffff">One way to prevent your real-time
125	application from getting hit with these IPIs is to
126	build your kernel with <tt>CONFIG_NO_HZ_FULL=y</tt>.
127	RCU would then perceive the CPU running your application
128	as being idle, and it would be able to safely detect that
129	state without needing to IPI the CPU.
130</font></td></tr>
131<tr><td>&nbsp;</td></tr>
132</table>
133
134<p>
135Please note that this is just the overall flow:
136Additional complications can arise due to races with CPUs going idle
137or offline, among other things.
138
139<h2><a name="RCU-sched Expedited Grace Periods">
140RCU-sched Expedited Grace Periods</a></h2>
141
142<p>
143<tt>CONFIG_PREEMPT=n</tt> kernels implement RCU-sched.
144The overall flow of the handling of a given CPU by an RCU-sched
145expedited grace period is shown in the following diagram:
146
147<p><img src="ExpSchedFlow.svg" alt="ExpSchedFlow.svg" width="55%">
148
149<p>
150As with RCU-preempt, RCU-sched's
151<tt>synchronize_rcu_expedited()</tt> ignores offline and
152idle CPUs, again because they are in remotely detectable
153quiescent states.
154However, because the
155<tt>rcu_read_lock_sched()</tt> and <tt>rcu_read_unlock_sched()</tt>
156leave no trace of their invocation, in general it is not possible to tell
157whether or not the current CPU is in an RCU read-side critical section.
158The best that RCU-sched's <tt>rcu_exp_handler()</tt> can do is to check
159for idle, on the off-chance that the CPU went idle while the IPI
160was in flight.
161If the CPU is idle, then <tt>rcu_exp_handler()</tt> reports
162the quiescent state.
163
164<p> Otherwise, the handler forces a future context switch by setting the
165NEED_RESCHED flag of the current task's thread flag and the CPU preempt
166counter.
167At the time of the context switch, the CPU reports the quiescent state.
168Should the CPU go offline first, it will report the quiescent state
169at that time.
170
171<h2><a name="Expedited Grace Period and CPU Hotplug">
172Expedited Grace Period and CPU Hotplug</a></h2>
173
174<p>
175The expedited nature of expedited grace periods require a much tighter
176interaction with CPU hotplug operations than is required for normal
177grace periods.
178In addition, attempting to IPI offline CPUs will result in splats, but
179failing to IPI online CPUs can result in too-short grace periods.
180Neither option is acceptable in production kernels.
181
182<p>
183The interaction between expedited grace periods and CPU hotplug operations
184is carried out at several levels:
185
186<ol>
187<li>	The number of CPUs that have ever been online is tracked
188	by the <tt>rcu_state</tt> structure's <tt>-&gt;ncpus</tt>
189	field.
190	The <tt>rcu_state</tt> structure's <tt>-&gt;ncpus_snap</tt>
191	field tracks the number of CPUs that have ever been online
192	at the beginning of an RCU expedited grace period.
193	Note that this number never decreases, at least in the absence
194	of a time machine.
195<li>	The identities of the CPUs that have ever been online is
196	tracked by the <tt>rcu_node</tt> structure's
197	<tt>-&gt;expmaskinitnext</tt> field.
198	The <tt>rcu_node</tt> structure's <tt>-&gt;expmaskinit</tt>
199	field tracks the identities of the CPUs that were online
200	at least once at the beginning of the most recent RCU
201	expedited grace period.
202	The <tt>rcu_state</tt> structure's <tt>-&gt;ncpus</tt> and
203	<tt>-&gt;ncpus_snap</tt> fields are used to detect when
204	new CPUs have come online for the first time, that is,
205	when the <tt>rcu_node</tt> structure's <tt>-&gt;expmaskinitnext</tt>
206	field has changed since the beginning of the last RCU
207	expedited grace period, which triggers an update of each
208	<tt>rcu_node</tt> structure's <tt>-&gt;expmaskinit</tt>
209	field from its <tt>-&gt;expmaskinitnext</tt> field.
210<li>	Each <tt>rcu_node</tt> structure's <tt>-&gt;expmaskinit</tt>
211	field is used to initialize that structure's
212	<tt>-&gt;expmask</tt> at the beginning of each RCU
213	expedited grace period.
214	This means that only those CPUs that have been online at least
215	once will be considered for a given grace period.
216<li>	Any CPU that goes offline will clear its bit in its leaf
217	<tt>rcu_node</tt> structure's <tt>-&gt;qsmaskinitnext</tt>
218	field, so any CPU with that bit clear can safely be ignored.
219	However, it is possible for a CPU coming online or going offline
220	to have this bit set for some time while <tt>cpu_online</tt>
221	returns <tt>false</tt>.
222<li>	For each non-idle CPU that RCU believes is currently online, the grace
223	period invokes <tt>smp_call_function_single()</tt>.
224	If this succeeds, the CPU was fully online.
225	Failure indicates that the CPU is in the process of coming online
226	or going offline, in which case it is necessary to wait for a
227	short time period and try again.
228	The purpose of this wait (or series of waits, as the case may be)
229	is to permit a concurrent CPU-hotplug operation to complete.
230<li>	In the case of RCU-sched, one of the last acts of an outgoing CPU
231	is to invoke <tt>rcu_report_dead()</tt>, which
232	reports a quiescent state for that CPU.
233	However, this is likely paranoia-induced redundancy. <!-- @@@ -->
234</ol>
235
236<table>
237<tr><th>&nbsp;</th></tr>
238<tr><th align="left">Quick Quiz:</th></tr>
239<tr><td>
240	Why all the dancing around with multiple counters and masks
241	tracking CPUs that were once online?
242	Why not just have a single set of masks tracking the currently
243	online CPUs and be done with it?
244</td></tr>
245<tr><th align="left">Answer:</th></tr>
246<tr><td bgcolor="#ffffff"><font color="ffffff">
247	Maintaining single set of masks tracking the online CPUs <i>sounds</i>
248	easier, at least until you try working out all the race conditions
249	between grace-period initialization and CPU-hotplug operations.
250	For example, suppose initialization is progressing down the
251	tree while a CPU-offline operation is progressing up the tree.
252	This situation can result in bits set at the top of the tree
253	that have no counterparts at the bottom of the tree.
254	Those bits will never be cleared, which will result in
255	grace-period hangs.
256	In short, that way lies madness, to say nothing of a great many
257	bugs, hangs, and deadlocks.
258
259	<p><font color="ffffff">
260	In contrast, the current multi-mask multi-counter scheme ensures
261	that grace-period initialization will always see consistent masks
262	up and down the tree, which brings significant simplifications
263	over the single-mask method.
264
265	<p><font color="ffffff">
266	This is an instance of
267	<a href="http://www.cs.columbia.edu/~library/TR-repository/reports/reports-1992/cucs-039-92.ps.gz"><font color="ffffff">
268	deferring work in order to avoid synchronization</a>.
269	Lazily recording CPU-hotplug events at the beginning of the next
270	grace period greatly simplifies maintenance of the CPU-tracking
271	bitmasks in the <tt>rcu_node</tt> tree.
272</font></td></tr>
273<tr><td>&nbsp;</td></tr>
274</table>
275
276<h2><a name="Expedited Grace Period Refinements">
277Expedited Grace Period Refinements</a></h2>
278
279<ol>
280<li>	<a href="#Idle-CPU Checks">Idle-CPU checks</a>.
281<li>	<a href="#Batching via Sequence Counter">
282	Batching via sequence counter</a>.
283<li>	<a href="#Funnel Locking and Wait/Wakeup">
284	Funnel locking and wait/wakeup</a>.
285<li>	<a href="#Use of Workqueues">Use of Workqueues</a>.
286<li>	<a href="#Stall Warnings">Stall warnings</a>.
287<li>	<a href="#Mid-Boot Operation">Mid-boot operation</a>.
288</ol>
289
290<h3><a name="Idle-CPU Checks">Idle-CPU Checks</a></h3>
291
292<p>
293Each expedited grace period checks for idle CPUs when initially forming
294the mask of CPUs to be IPIed and again just before IPIing a CPU
295(both checks are carried out by <tt>sync_rcu_exp_select_cpus()</tt>).
296If the CPU is idle at any time between those two times, the CPU will
297not be IPIed.
298Instead, the task pushing the grace period forward will include the
299idle CPUs in the mask passed to <tt>rcu_report_exp_cpu_mult()</tt>.
300
301<p>
302For RCU-sched, there is an additional check:
303If the IPI has interrupted the idle loop, then
304<tt>rcu_exp_handler()</tt> invokes <tt>rcu_report_exp_rdp()</tt>
305to report the corresponding quiescent state.
306
307<p>
308For RCU-preempt, there is no specific check for idle in the
309IPI handler (<tt>rcu_exp_handler()</tt>), but because
310RCU read-side critical sections are not permitted within the
311idle loop, if <tt>rcu_exp_handler()</tt> sees that the CPU is within
312RCU read-side critical section, the CPU cannot possibly be idle.
313Otherwise, <tt>rcu_exp_handler()</tt> invokes
314<tt>rcu_report_exp_rdp()</tt> to report the corresponding quiescent
315state, regardless of whether or not that quiescent state was due to
316the CPU being idle.
317
318<p>
319In summary, RCU expedited grace periods check for idle when building
320the bitmask of CPUs that must be IPIed, just before sending each IPI,
321and (either explicitly or implicitly) within the IPI handler.
322
323<h3><a name="Batching via Sequence Counter">
324Batching via Sequence Counter</a></h3>
325
326<p>
327If each grace-period request was carried out separately, expedited
328grace periods would have abysmal scalability and
329problematic high-load characteristics.
330Because each grace-period operation can serve an unlimited number of
331updates, it is important to <i>batch</i> requests, so that a single
332expedited grace-period operation will cover all requests in the
333corresponding batch.
334
335<p>
336This batching is controlled by a sequence counter named
337<tt>-&gt;expedited_sequence</tt> in the <tt>rcu_state</tt> structure.
338This counter has an odd value when there is an expedited grace period
339in progress and an even value otherwise, so that dividing the counter
340value by two gives the number of completed grace periods.
341During any given update request, the counter must transition from
342even to odd and then back to even, thus indicating that a grace
343period has elapsed.
344Therefore, if the initial value of the counter is <tt>s</tt>,
345the updater must wait until the counter reaches at least the
346value <tt>(s+3)&amp;~0x1</tt>.
347This counter is managed by the following access functions:
348
349<ol>
350<li>	<tt>rcu_exp_gp_seq_start()</tt>, which marks the start of
351	an expedited grace period.
352<li>	<tt>rcu_exp_gp_seq_end()</tt>, which marks the end of an
353	expedited grace period.
354<li>	<tt>rcu_exp_gp_seq_snap()</tt>, which obtains a snapshot of
355	the counter.
356<li>	<tt>rcu_exp_gp_seq_done()</tt>, which returns <tt>true</tt>
357	if a full expedited grace period has elapsed since the
358	corresponding call to <tt>rcu_exp_gp_seq_snap()</tt>.
359</ol>
360
361<p>
362Again, only one request in a given batch need actually carry out
363a grace-period operation, which means there must be an efficient
364way to identify which of many concurrent reqeusts will initiate
365the grace period, and that there be an efficient way for the
366remaining requests to wait for that grace period to complete.
367However, that is the topic of the next section.
368
369<h3><a name="Funnel Locking and Wait/Wakeup">
370Funnel Locking and Wait/Wakeup</a></h3>
371
372<p>
373The natural way to sort out which of a batch of updaters will initiate
374the expedited grace period is to use the <tt>rcu_node</tt> combining
375tree, as implemented by the <tt>exp_funnel_lock()</tt> function.
376The first updater corresponding to a given grace period arriving
377at a given <tt>rcu_node</tt> structure records its desired grace-period
378sequence number in the <tt>-&gt;exp_seq_rq</tt> field and moves up
379to the next level in the tree.
380Otherwise, if the <tt>-&gt;exp_seq_rq</tt> field already contains
381the sequence number for the desired grace period or some later one,
382the updater blocks on one of four wait queues in the
383<tt>-&gt;exp_wq[]</tt> array, using the second-from-bottom
384and third-from bottom bits as an index.
385An <tt>-&gt;exp_lock</tt> field in the <tt>rcu_node</tt> structure
386synchronizes access to these fields.
387
388<p>
389An empty <tt>rcu_node</tt> tree is shown in the following diagram,
390with the white cells representing the <tt>-&gt;exp_seq_rq</tt> field
391and the red cells representing the elements of the
392<tt>-&gt;exp_wq[]</tt> array.
393
394<p><img src="Funnel0.svg" alt="Funnel0.svg" width="75%">
395
396<p>
397The next diagram shows the situation after the arrival of Task&nbsp;A
398and Task&nbsp;B at the leftmost and rightmost leaf <tt>rcu_node</tt>
399structures, respectively.
400The current value of the <tt>rcu_state</tt> structure's
401<tt>-&gt;expedited_sequence</tt> field is zero, so adding three and
402clearing the bottom bit results in the value two, which both tasks
403record in the <tt>-&gt;exp_seq_rq</tt> field of their respective
404<tt>rcu_node</tt> structures:
405
406<p><img src="Funnel1.svg" alt="Funnel1.svg" width="75%">
407
408<p>
409Each of Tasks&nbsp;A and&nbsp;B will move up to the root
410<tt>rcu_node</tt> structure.
411Suppose that Task&nbsp;A wins, recording its desired grace-period sequence
412number and resulting in the state shown below:
413
414<p><img src="Funnel2.svg" alt="Funnel2.svg" width="75%">
415
416<p>
417Task&nbsp;A now advances to initiate a new grace period, while Task&nbsp;B
418moves up to the root <tt>rcu_node</tt> structure, and, seeing that
419its desired sequence number is already recorded, blocks on
420<tt>-&gt;exp_wq[1]</tt>.
421
422<table>
423<tr><th>&nbsp;</th></tr>
424<tr><th align="left">Quick Quiz:</th></tr>
425<tr><td>
426	Why <tt>-&gt;exp_wq[1]</tt>?
427	Given that the value of these tasks' desired sequence number is
428	two, so shouldn't they instead block on <tt>-&gt;exp_wq[2]</tt>?
429</td></tr>
430<tr><th align="left">Answer:</th></tr>
431<tr><td bgcolor="#ffffff"><font color="ffffff">
432	No.
433
434	<p><font color="ffffff">
435	Recall that the bottom bit of the desired sequence number indicates
436	whether or not a grace period is currently in progress.
437	It is therefore necessary to shift the sequence number right one
438	bit position to obtain the number of the grace period.
439	This results in <tt>-&gt;exp_wq[1]</tt>.
440</font></td></tr>
441<tr><td>&nbsp;</td></tr>
442</table>
443
444<p>
445If Tasks&nbsp;C and&nbsp;D also arrive at this point, they will compute the
446same desired grace-period sequence number, and see that both leaf
447<tt>rcu_node</tt> structures already have that value recorded.
448They will therefore block on their respective <tt>rcu_node</tt>
449structures' <tt>-&gt;exp_wq[1]</tt> fields, as shown below:
450
451<p><img src="Funnel3.svg" alt="Funnel3.svg" width="75%">
452
453<p>
454Task&nbsp;A now acquires the <tt>rcu_state</tt> structure's
455<tt>-&gt;exp_mutex</tt> and initiates the grace period, which
456increments <tt>-&gt;expedited_sequence</tt>.
457Therefore, if Tasks&nbsp;E and&nbsp;F arrive, they will compute
458a desired sequence number of 4 and will record this value as
459shown below:
460
461<p><img src="Funnel4.svg" alt="Funnel4.svg" width="75%">
462
463<p>
464Tasks&nbsp;E and&nbsp;F will propagate up the <tt>rcu_node</tt>
465combining tree, with Task&nbsp;F blocking on the root <tt>rcu_node</tt>
466structure and Task&nbsp;E wait for Task&nbsp;A to finish so that
467it can start the next grace period.
468The resulting state is as shown below:
469
470<p><img src="Funnel5.svg" alt="Funnel5.svg" width="75%">
471
472<p>
473Once the grace period completes, Task&nbsp;A
474starts waking up the tasks waiting for this grace period to complete,
475increments the <tt>-&gt;expedited_sequence</tt>,
476acquires the <tt>-&gt;exp_wake_mutex</tt> and then releases the
477<tt>-&gt;exp_mutex</tt>.
478This results in the following state:
479
480<p><img src="Funnel6.svg" alt="Funnel6.svg" width="75%">
481
482<p>
483Task&nbsp;E can then acquire <tt>-&gt;exp_mutex</tt> and increment
484<tt>-&gt;expedited_sequence</tt> to the value three.
485If new tasks&nbsp;G and&nbsp;H arrive and moves up the combining tree at the
486same time, the state will be as follows:
487
488<p><img src="Funnel7.svg" alt="Funnel7.svg" width="75%">
489
490<p>
491Note that three of the root <tt>rcu_node</tt> structure's
492waitqueues are now occupied.
493However, at some point, Task&nbsp;A will wake up the
494tasks blocked on the <tt>-&gt;exp_wq</tt> waitqueues, resulting
495in the following state:
496
497<p><img src="Funnel8.svg" alt="Funnel8.svg" width="75%">
498
499<p>
500Execution will continue with Tasks&nbsp;E and&nbsp;H completing
501their grace periods and carrying out their wakeups.
502
503<table>
504<tr><th>&nbsp;</th></tr>
505<tr><th align="left">Quick Quiz:</th></tr>
506<tr><td>
507	What happens if Task&nbsp;A takes so long to do its wakeups
508	that Task&nbsp;E's grace period completes?
509</td></tr>
510<tr><th align="left">Answer:</th></tr>
511<tr><td bgcolor="#ffffff"><font color="ffffff">
512	Then Task&nbsp;E will block on the <tt>-&gt;exp_wake_mutex</tt>,
513	which will also prevent it from releasing <tt>-&gt;exp_mutex</tt>,
514	which in turn will prevent the next grace period from starting.
515	This last is important in preventing overflow of the
516	<tt>-&gt;exp_wq[]</tt> array.
517</font></td></tr>
518<tr><td>&nbsp;</td></tr>
519</table>
520
521<h3><a name="Use of Workqueues">Use of Workqueues</a></h3>
522
523<p>
524In earlier implementations, the task requesting the expedited
525grace period also drove it to completion.
526This straightforward approach had the disadvantage of needing to
527account for POSIX signals sent to user tasks,
528so more recent implemementations use the Linux kernel's
529<a href="https://www.kernel.org/doc/Documentation/core-api/workqueue.rst">workqueues</a>.
530
531<p>
532The requesting task still does counter snapshotting and funnel-lock
533processing, but the task reaching the top of the funnel lock
534does a <tt>schedule_work()</tt> (from <tt>_synchronize_rcu_expedited()</tt>
535so that a workqueue kthread does the actual grace-period processing.
536Because workqueue kthreads do not accept POSIX signals, grace-period-wait
537processing need not allow for POSIX signals.
538
539In addition, this approach allows wakeups for the previous expedited
540grace period to be overlapped with processing for the next expedited
541grace period.
542Because there are only four sets of waitqueues, it is necessary to
543ensure that the previous grace period's wakeups complete before the
544next grace period's wakeups start.
545This is handled by having the <tt>-&gt;exp_mutex</tt>
546guard expedited grace-period processing and the
547<tt>-&gt;exp_wake_mutex</tt> guard wakeups.
548The key point is that the <tt>-&gt;exp_mutex</tt> is not released
549until the first wakeup is complete, which means that the
550<tt>-&gt;exp_wake_mutex</tt> has already been acquired at that point.
551This approach ensures that the previous grace period's wakeups can
552be carried out while the current grace period is in process, but
553that these wakeups will complete before the next grace period starts.
554This means that only three waitqueues are required, guaranteeing that
555the four that are provided are sufficient.
556
557<h3><a name="Stall Warnings">Stall Warnings</a></h3>
558
559<p>
560Expediting grace periods does nothing to speed things up when RCU
561readers take too long, and therefore expedited grace periods check
562for stalls just as normal grace periods do.
563
564<table>
565<tr><th>&nbsp;</th></tr>
566<tr><th align="left">Quick Quiz:</th></tr>
567<tr><td>
568	But why not just let the normal grace-period machinery
569	detect the stalls, given that a given reader must block
570	both normal and expedited grace periods?
571</td></tr>
572<tr><th align="left">Answer:</th></tr>
573<tr><td bgcolor="#ffffff"><font color="ffffff">
574	Because it is quite possible that at a given time there
575	is no normal grace period in progress, in which case the
576	normal grace period cannot emit a stall warning.
577</font></td></tr>
578<tr><td>&nbsp;</td></tr>
579</table>
580
581The <tt>synchronize_sched_expedited_wait()</tt> function loops waiting
582for the expedited grace period to end, but with a timeout set to the
583current RCU CPU stall-warning time.
584If this time is exceeded, any CPUs or <tt>rcu_node</tt> structures
585blocking the current grace period are printed.
586Each stall warning results in another pass through the loop, but the
587second and subsequent passes use longer stall times.
588
589<h3><a name="Mid-Boot Operation">Mid-boot operation</a></h3>
590
591<p>
592The use of workqueues has the advantage that the expedited
593grace-period code need not worry about POSIX signals.
594Unfortunately, it has the
595corresponding disadvantage that workqueues cannot be used until
596they are initialized, which does not happen until some time after
597the scheduler spawns the first task.
598Given that there are parts of the kernel that really do want to
599execute grace periods during this mid-boot &ldquo;dead zone&rdquo;,
600expedited grace periods must do something else during thie time.
601
602<p>
603What they do is to fall back to the old practice of requiring that the
604requesting task drive the expedited grace period, as was the case
605before the use of workqueues.
606However, the requesting task is only required to drive the grace period
607during the mid-boot dead zone.
608Before mid-boot, a synchronous grace period is a no-op.
609Some time after mid-boot, workqueues are used.
610
611<p>
612Non-expedited non-SRCU synchronous grace periods must also operate
613normally during mid-boot.
614This is handled by causing non-expedited grace periods to take the
615expedited code path during mid-boot.
616
617<p>
618The current code assumes that there are no POSIX signals during
619the mid-boot dead zone.
620However, if an overwhelming need for POSIX signals somehow arises,
621appropriate adjustments can be made to the expedited stall-warning code.
622One such adjustment would reinstate the pre-workqueue stall-warning
623checks, but only during the mid-boot dead zone.
624
625<p>
626With this refinement, synchronous grace periods can now be used from
627task context pretty much any time during the life of the kernel.
628That is, aside from some points in the suspend, hibernate, or shutdown
629code path.
630
631<h3><a name="Summary">
632Summary</a></h3>
633
634<p>
635Expedited grace periods use a sequence-number approach to promote
636batching, so that a single grace-period operation can serve numerous
637requests.
638A funnel lock is used to efficiently identify the one task out of
639a concurrent group that will request the grace period.
640All members of the group will block on waitqueues provided in
641the <tt>rcu_node</tt> structure.
642The actual grace-period processing is carried out by a workqueue.
643
644<p>
645CPU-hotplug operations are noted lazily in order to prevent the need
646for tight synchronization between expedited grace periods and
647CPU-hotplug operations.
648The dyntick-idle counters are used to avoid sending IPIs to idle CPUs,
649at least in the common case.
650RCU-preempt and RCU-sched use different IPI handlers and different
651code to respond to the state changes carried out by those handlers,
652but otherwise use common code.
653
654<p>
655Quiescent states are tracked using the <tt>rcu_node</tt> tree,
656and once all necessary quiescent states have been reported,
657all tasks waiting on this expedited grace period are awakened.
658A pair of mutexes are used to allow one grace period's wakeups
659to proceed concurrently with the next grace period's processing.
660
661<p>
662This combination of mechanisms allows expedited grace periods to
663run reasonably efficiently.
664However, for non-time-critical tasks, normal grace periods should be
665used instead because their longer duration permits much higher
666degrees of batching, and thus much lower per-request overheads.
667
668</body></html>
669