← Documents Documentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst GitHub 원문 ↗

Linux 6.18.37 · RCU

TREE_RCU grace period의 memory ordering

TREE_RCU가 rcu_node lock chain, dyntick/hotplug snapshot과 callback pipeline을 결합해 grace-period memory ordering을 보장하는 과정을 설명합니다.

Source pathDocumentation/RCU/Design/Memory-Ordering/Tree-RCU-Memory-Ordering.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

Tree-RCU-Memory-Ordering.rst:1-648

TREE_RCU의 분산 자료구조가 lock과 memory barrier를 연결해 GP 앞뒤 access의 강한 ordering을 만드는 증명형 안내서입니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ======================================================
2 A Tour Through TREE_RCU's Grace-Period Memory Ordering
3 ======================================================
4
5 August 8, 2017
6
7 This article was contributed by Paul E. McKenney
8
9 Introduction
10 ============
11
12 This document gives a rough visual overview of how Tree RCU's
13 grace-period memory ordering guarantee is provided.
14
15 What Is Tree RCU's Grace Period Memory Ordering Guarantee?
16 ==========================================================
17
18 RCU grace periods provide extremely strong memory-ordering guarantees
19 for non-idle non-offline code.
20 Any code that happens after the end of a given RCU grace period is guaranteed
21 to see the effects of all accesses prior to the beginning of that grace
22 period that are within RCU read-side critical sections.
23 Similarly, any code that happens before the beginning of a given RCU grace
24 period is guaranteed to not see the effects of all accesses following the end
25 of that grace period that are within RCU read-side critical sections.
26
27 Note well that RCU-sched read-side critical sections include any region
28 of code for which preemption is disabled.
29 Given that each individual machine instruction can be thought of as
30 an extremely small region of preemption-disabled code, one can think of
31 ``synchronize_rcu()`` as ``smp_mb()`` on steroids.
32
33 RCU updaters use this guarantee by splitting their updates into
34 two phases, one of which is executed before the grace period and
35 the other of which is executed after the grace period.
36 In the most common use case, phase one removes an element from
37 a linked RCU-protected data structure, and phase two frees that element.
38 For this to work, any readers that have witnessed state prior to the
39 phase-one update (in the common case, removal) must not witness state
40 following the phase-two update (in the common case, freeing).
41
42 The RCU implementation provides this guarantee using a network
43 of lock-based critical sections, memory barriers, and per-CPU
44 processing, as is described in the following sections.
45
46 Tree RCU Grace Period Memory Ordering Building Blocks
47 =====================================================
48
49 The workhorse for RCU's grace-period memory ordering is the
50 critical section for the ``rcu_node`` structure's
51 ``->lock``. These critical sections use helper functions for lock
52 acquisition, including ``raw_spin_lock_rcu_node()``,
53 ``raw_spin_lock_irq_rcu_node()``, and ``raw_spin_lock_irqsave_rcu_node()``.
54 Their lock-release counterparts are ``raw_spin_unlock_rcu_node()``,
55 ``raw_spin_unlock_irq_rcu_node()``, and
56 ``raw_spin_unlock_irqrestore_rcu_node()``, respectively.
57 For completeness, a ``raw_spin_trylock_rcu_node()`` is also provided.
58 The key point is that the lock-acquisition functions, including
59 ``raw_spin_trylock_rcu_node()``, all invoke ``smp_mb__after_unlock_lock()``
60 immediately after successful acquisition of the lock.
61
62 Therefore, for any given ``rcu_node`` structure, any access
63 happening before one of the above lock-release functions will be seen
64 by all CPUs as happening before any access happening after a later
65 one of the above lock-acquisition functions.
66 Furthermore, any access happening before one of the
67 above lock-release function on any given CPU will be seen by all
68 CPUs as happening before any access happening after a later one
69 of the above lock-acquisition functions executing on that same CPU,
70 even if the lock-release and lock-acquisition functions are operating
71 on different ``rcu_node`` structures.
72 Tree RCU uses these two ordering guarantees to form an ordering
73 network among all CPUs that were in any way involved in the grace
74 period, including any CPUs that came online or went offline during
75 the grace period in question.
76
77 The following litmus test exhibits the ordering effects of these
78 lock-acquisition and lock-release functions::
79
80 1 int x, y, z;
81 2
82 3 void task0(void)
83 4 {
84 5 raw_spin_lock_rcu_node(rnp);
85 6 WRITE_ONCE(x, 1);
86 7 r1 = READ_ONCE(y);
87 8 raw_spin_unlock_rcu_node(rnp);
88 9 }
89 10
90 11 void task1(void)
91 12 {
92 13 raw_spin_lock_rcu_node(rnp);
93 14 WRITE_ONCE(y, 1);
94 15 r2 = READ_ONCE(z);
95 16 raw_spin_unlock_rcu_node(rnp);
96 17 }
97 18
98 19 void task2(void)
99 20 {
100 21 WRITE_ONCE(z, 1);
101 22 smp_mb();
102 23 r3 = READ_ONCE(x);
103 24 }
104 25
105 26 WARN_ON(r1 == 0 && r2 == 0 && r3 == 0);
106
107 The ``WARN_ON()`` is evaluated at "the end of time",
108 after all changes have propagated throughout the system.
109 Without the ``smp_mb__after_unlock_lock()`` provided by the
110 acquisition functions, this ``WARN_ON()`` could trigger, for example
111 on PowerPC.
112 The ``smp_mb__after_unlock_lock()`` invocations prevent this
113 ``WARN_ON()`` from triggering.
114
115 +-----------------------------------------------------------------------+
116 | **Quick Quiz**: |
117 +-----------------------------------------------------------------------+
118 | But the chain of rcu_node-structure lock acquisitions guarantees |
119 | that new readers will see all of the updater's pre-grace-period |
120 | accesses and also guarantees that the updater's post-grace-period |
121 | accesses will see all of the old reader's accesses. So why do we |
122 | need all of those calls to smp_mb__after_unlock_lock()? |
123 +-----------------------------------------------------------------------+
124 | **Answer**: |
125 +-----------------------------------------------------------------------+
126 | Because we must provide ordering for RCU's polling grace-period |
127 | primitives, for example, get_state_synchronize_rcu() and |
128 | poll_state_synchronize_rcu(). Consider this code:: |
129 | |
130 | CPU 0 CPU 1 |
131 | ---- ---- |
132 | WRITE_ONCE(X, 1) WRITE_ONCE(Y, 1) |
133 | g = get_state_synchronize_rcu() smp_mb() |
134 | while (!poll_state_synchronize_rcu(g)) r1 = READ_ONCE(X) |
135 | continue; |
136 | r0 = READ_ONCE(Y) |
137 | |
138 | RCU guarantees that the outcome r0 == 0 && r1 == 0 will not |
139 | happen, even if CPU 1 is in an RCU extended quiescent state |
140 | (idle or offline) and thus won't interact directly with the RCU |
141 | core processing at all. |
142 +-----------------------------------------------------------------------+
143
144 This approach must be extended to include idle CPUs, which need
145 RCU's grace-period memory ordering guarantee to extend to any
146 RCU read-side critical sections preceding and following the current
147 idle sojourn.
148 This case is handled by calls to the strongly ordered
149 ``atomic_add_return()`` read-modify-write atomic operation that
150 is invoked within ``ct_kernel_exit_state()`` at idle-entry
151 time and within ``ct_kernel_enter_state()`` at idle-exit time.
152 The grace-period kthread invokes first ``ct_rcu_watching_cpu_acquire()``
153 (preceded by a full memory barrier) and ``rcu_watching_snap_stopped_since()``
154 (both of which rely on acquire semantics) to detect idle CPUs.
155
156 +-----------------------------------------------------------------------+
157 | **Quick Quiz**: |
158 +-----------------------------------------------------------------------+
159 | But what about CPUs that remain offline for the entire grace period? |
160 +-----------------------------------------------------------------------+
161 | **Answer**: |
162 +-----------------------------------------------------------------------+
163 | Such CPUs will be offline at the beginning of the grace period, so |
164 | the grace period won't expect quiescent states from them. Races |
165 | between grace-period start and CPU-hotplug operations are mediated |
166 | by the CPU's leaf ``rcu_node`` structure's ``->lock`` as described |
167 | above. |
168 +-----------------------------------------------------------------------+
169
170 The approach must be extended to handle one final case, that of waking a
171 task blocked in ``synchronize_rcu()``. This task might be affined to
172 a CPU that is not yet aware that the grace period has ended, and thus
173 might not yet be subject to the grace period's memory ordering.
174 Therefore, there is an ``smp_mb()`` after the return from
175 ``wait_for_completion()`` in the ``synchronize_rcu()`` code path.
176
177 +-----------------------------------------------------------------------+
178 | **Quick Quiz**: |
179 +-----------------------------------------------------------------------+
180 | What? Where??? I don't see any ``smp_mb()`` after the return from |
181 | ``wait_for_completion()``!!! |
182 +-----------------------------------------------------------------------+
183 | **Answer**: |
184 +-----------------------------------------------------------------------+
185 | That would be because I spotted the need for that ``smp_mb()`` during |
186 | the creation of this documentation, and it is therefore unlikely to |
187 | hit mainline before v4.14. Kudos to Lance Roy, Will Deacon, Peter |
188 | Zijlstra, and Jonathan Cameron for asking questions that sensitized |
189 | me to the rather elaborate sequence of events that demonstrate the |
190 | need for this memory barrier. |
191 +-----------------------------------------------------------------------+
192
193 Tree RCU's grace--period memory-ordering guarantees rely most heavily on
194 the ``rcu_node`` structure's ``->lock`` field, so much so that it is
195 necessary to abbreviate this pattern in the diagrams in the next
196 section. For example, consider the ``rcu_prepare_for_idle()`` function
197 shown below, which is one of several functions that enforce ordering of
198 newly arrived RCU callbacks against future grace periods:
199
200 ::
201
202 1 static void rcu_prepare_for_idle(void)
203 2 {
204 3 bool needwake;
205 4 struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
206 5 struct rcu_node *rnp;
207 6 int tne;
208 7
209 8 lockdep_assert_irqs_disabled();
210 9 if (rcu_rdp_is_offloaded(rdp))
211 10 return;
212 11
213 12 /* Handle nohz enablement switches conservatively. */
214 13 tne = READ_ONCE(tick_nohz_active);
215 14 if (tne != rdp->tick_nohz_enabled_snap) {
216 15 if (!rcu_segcblist_empty(&rdp->cblist))
217 16 invoke_rcu_core(); /* force nohz to see update. */
218 17 rdp->tick_nohz_enabled_snap = tne;
219 18 return;
220 19 }
221 20 if (!tne)
222 21 return;
223 22
224 23 /*
225 24 * If we have not yet accelerated this jiffy, accelerate all
226 25 * callbacks on this CPU.
227 26 */
228 27 if (rdp->last_accelerate == jiffies)
229 28 return;
230 29 rdp->last_accelerate = jiffies;
231 30 if (rcu_segcblist_pend_cbs(&rdp->cblist)) {
232 31 rnp = rdp->mynode;
233 32 raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
234 33 needwake = rcu_accelerate_cbs(rnp, rdp);
235 34 raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
236 35 if (needwake)
237 36 rcu_gp_kthread_wake();
238 37 }
239 38 }
240
241 But the only part of ``rcu_prepare_for_idle()`` that really matters for
242 this discussion are lines 32–34. We will therefore abbreviate this
243 function as follows:
244
245 .. kernel-figure:: rcu_node-lock.svg
246
247 The box represents the ``rcu_node`` structure's ``->lock`` critical
248 section, with the double line on top representing the additional
249 ``smp_mb__after_unlock_lock()``.
250
251 Tree RCU Grace Period Memory Ordering Components
252 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
253
254 Tree RCU's grace-period memory-ordering guarantee is provided by a
255 number of RCU components:
256
257 #. `Callback Registry`_
258 #. `Grace-Period Initialization`_
259 #. `Self-Reported Quiescent States`_
260 #. `Dynamic Tick Interface`_
261 #. `CPU-Hotplug Interface`_
262 #. `Forcing Quiescent States`_
263 #. `Grace-Period Cleanup`_
264 #. `Callback Invocation`_
265
266 Each of the following section looks at the corresponding component in
267 detail.
268
269 Callback Registry
270 ^^^^^^^^^^^^^^^^^
271
272 If RCU's grace-period guarantee is to mean anything at all, any access
273 that happens before a given invocation of ``call_rcu()`` must also
274 happen before the corresponding grace period. The implementation of this
275 portion of RCU's grace period guarantee is shown in the following
276 figure:
277
278 .. kernel-figure:: TreeRCU-callback-registry.svg
279
280 Because ``call_rcu()`` normally acts only on CPU-local state, it
281 provides no ordering guarantees, either for itself or for phase one of
282 the update (which again will usually be removal of an element from an
283 RCU-protected data structure). It simply enqueues the ``rcu_head``
284 structure on a per-CPU list, which cannot become associated with a grace
285 period until a later call to ``rcu_accelerate_cbs()``, as shown in the
286 diagram above.
287
288 One set of code paths shown on the left invokes ``rcu_accelerate_cbs()``
289 via ``note_gp_changes()``, either directly from ``call_rcu()`` (if the
290 current CPU is inundated with queued ``rcu_head`` structures) or more
291 likely from an ``RCU_SOFTIRQ`` handler. Another code path in the middle
292 is taken only in kernels built with ``CONFIG_RCU_FAST_NO_HZ=y``, which
293 invokes ``rcu_accelerate_cbs()`` via ``rcu_prepare_for_idle()``. The
294 final code path on the right is taken only in kernels built with
295 ``CONFIG_HOTPLUG_CPU=y``, which invokes ``rcu_accelerate_cbs()`` via
296 ``rcu_advance_cbs()``, ``rcu_migrate_callbacks``,
297 ``rcutree_migrate_callbacks()``, and ``takedown_cpu()``, which in turn
298 is invoked on a surviving CPU after the outgoing CPU has been completely
299 offlined.
300
301 There are a few other code paths within grace-period processing that
302 opportunistically invoke ``rcu_accelerate_cbs()``. However, either way,
303 all of the CPU's recently queued ``rcu_head`` structures are associated
304 with a future grace-period number under the protection of the CPU's lead
305 ``rcu_node`` structure's ``->lock``. In all cases, there is full
306 ordering against any prior critical section for that same ``rcu_node``
307 structure's ``->lock``, and also full ordering against any of the
308 current task's or CPU's prior critical sections for any ``rcu_node``
309 structure's ``->lock``.
310
311 The next section will show how this ordering ensures that any accesses
312 prior to the ``call_rcu()`` (particularly including phase one of the
313 update) happen before the start of the corresponding grace period.
314
315 +-----------------------------------------------------------------------+
316 | **Quick Quiz**: |
317 +-----------------------------------------------------------------------+
318 | But what about ``synchronize_rcu()``? |
319 +-----------------------------------------------------------------------+
320 | **Answer**: |
321 +-----------------------------------------------------------------------+
322 | The ``synchronize_rcu()`` passes ``call_rcu()`` to ``wait_rcu_gp()``, |
323 | which invokes it. So either way, it eventually comes down to |
324 | ``call_rcu()``. |
325 +-----------------------------------------------------------------------+
326
327 Grace-Period Initialization
328 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
329
330 Grace-period initialization is carried out by the grace-period kernel
331 thread, which makes several passes over the ``rcu_node`` tree within the
332 ``rcu_gp_init()`` function. This means that showing the full flow of
333 ordering through the grace-period computation will require duplicating
334 this tree. If you find this confusing, please note that the state of the
335 ``rcu_node`` changes over time, just like Heraclitus's river. However,
336 to keep the ``rcu_node`` river tractable, the grace-period kernel
337 thread's traversals are presented in multiple parts, starting in this
338 section with the various phases of grace-period initialization.
339
340 The first ordering-related grace-period initialization action is to
341 advance the ``rcu_state`` structure's ``->gp_seq`` grace-period-number
342 counter, as shown below:
343
344 .. kernel-figure:: TreeRCU-gp-init-1.svg
345
346 The actual increment is carried out using ``smp_store_release()``, which
347 helps reject false-positive RCU CPU stall detection. Note that only the
348 root ``rcu_node`` structure is touched.
349
350 The first pass through the ``rcu_node`` tree updates bitmasks based on
351 CPUs having come online or gone offline since the start of the previous
352 grace period. In the common case where the number of online CPUs for
353 this ``rcu_node`` structure has not transitioned to or from zero, this
354 pass will scan only the leaf ``rcu_node`` structures. However, if the
355 number of online CPUs for a given leaf ``rcu_node`` structure has
356 transitioned from zero, ``rcu_init_new_rnp()`` will be invoked for the
357 first incoming CPU. Similarly, if the number of online CPUs for a given
358 leaf ``rcu_node`` structure has transitioned to zero,
359 ``rcu_cleanup_dead_rnp()`` will be invoked for the last outgoing CPU.
360 The diagram below shows the path of ordering if the leftmost
361 ``rcu_node`` structure onlines its first CPU and if the next
362 ``rcu_node`` structure has no online CPUs (or, alternatively if the
363 leftmost ``rcu_node`` structure offlines its last CPU and if the next
364 ``rcu_node`` structure has no online CPUs).
365
366 .. kernel-figure:: TreeRCU-gp-init-2.svg
367
368 The final ``rcu_gp_init()`` pass through the ``rcu_node`` tree traverses
369 breadth-first, setting each ``rcu_node`` structure's ``->gp_seq`` field
370 to the newly advanced value from the ``rcu_state`` structure, as shown
371 in the following diagram.
372
373 .. kernel-figure:: TreeRCU-gp-init-3.svg
374
375 This change will also cause each CPU's next call to
376 ``__note_gp_changes()`` to notice that a new grace period has started,
377 as described in the next section. But because the grace-period kthread
378 started the grace period at the root (with the advancing of the
379 ``rcu_state`` structure's ``->gp_seq`` field) before setting each leaf
380 ``rcu_node`` structure's ``->gp_seq`` field, each CPU's observation of
381 the start of the grace period will happen after the actual start of the
382 grace period.
383
384 +-----------------------------------------------------------------------+
385 | **Quick Quiz**: |
386 +-----------------------------------------------------------------------+
387 | But what about the CPU that started the grace period? Why wouldn't it |
388 | see the start of the grace period right when it started that grace |
389 | period? |
390 +-----------------------------------------------------------------------+
391 | **Answer**: |
392 +-----------------------------------------------------------------------+
393 | In some deep philosophical and overly anthromorphized sense, yes, the |
394 | CPU starting the grace period is immediately aware of having done so. |
395 | However, if we instead assume that RCU is not self-aware, then even |
396 | the CPU starting the grace period does not really become aware of the |
397 | start of this grace period until its first call to |
398 | ``__note_gp_changes()``. On the other hand, this CPU potentially gets |
399 | early notification because it invokes ``__note_gp_changes()`` during |
400 | its last ``rcu_gp_init()`` pass through its leaf ``rcu_node`` |
401 | structure. |
402 +-----------------------------------------------------------------------+
403
404 Self-Reported Quiescent States
405 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
406
407 When all entities that might block the grace period have reported
408 quiescent states (or as described in a later section, had quiescent
409 states reported on their behalf), the grace period can end. Online
410 non-idle CPUs report their own quiescent states, as shown in the
411 following diagram:
412
413 .. kernel-figure:: TreeRCU-qs.svg
414
415 This is for the last CPU to report a quiescent state, which signals the
416 end of the grace period. Earlier quiescent states would push up the
417 ``rcu_node`` tree only until they encountered an ``rcu_node`` structure
418 that is waiting for additional quiescent states. However, ordering is
419 nevertheless preserved because some later quiescent state will acquire
420 that ``rcu_node`` structure's ``->lock``.
421
422 Any number of events can lead up to a CPU invoking ``note_gp_changes``
423 (or alternatively, directly invoking ``__note_gp_changes()``), at which
424 point that CPU will notice the start of a new grace period while holding
425 its leaf ``rcu_node`` lock. Therefore, all execution shown in this
426 diagram happens after the start of the grace period. In addition, this
427 CPU will consider any RCU read-side critical section that started before
428 the invocation of ``__note_gp_changes()`` to have started before the
429 grace period, and thus a critical section that the grace period must
430 wait on.
431
432 +-----------------------------------------------------------------------+
433 | **Quick Quiz**: |
434 +-----------------------------------------------------------------------+
435 | But a RCU read-side critical section might have started after the |
436 | beginning of the grace period (the advancing of ``->gp_seq`` from |
437 | earlier), so why should the grace period wait on such a critical |
438 | section? |
439 +-----------------------------------------------------------------------+
440 | **Answer**: |
441 +-----------------------------------------------------------------------+
442 | It is indeed not necessary for the grace period to wait on such a |
443 | critical section. However, it is permissible to wait on it. And it is |
444 | furthermore important to wait on it, as this lazy approach is far |
445 | more scalable than a “big bang” all-at-once grace-period start could |
446 | possibly be. |
447 +-----------------------------------------------------------------------+
448
449 If the CPU does a context switch, a quiescent state will be noted by
450 ``rcu_note_context_switch()`` on the left. On the other hand, if the CPU
451 takes a scheduler-clock interrupt while executing in usermode, a
452 quiescent state will be noted by ``rcu_sched_clock_irq()`` on the right.
453 Either way, the passage through a quiescent state will be noted in a
454 per-CPU variable.
455
456 The next time an ``RCU_SOFTIRQ`` handler executes on this CPU (for
457 example, after the next scheduler-clock interrupt), ``rcu_core()`` will
458 invoke ``rcu_check_quiescent_state()``, which will notice the recorded
459 quiescent state, and invoke ``rcu_report_qs_rdp()``. If
460 ``rcu_report_qs_rdp()`` verifies that the quiescent state really does
461 apply to the current grace period, it invokes ``rcu_report_rnp()`` which
462 traverses up the ``rcu_node`` tree as shown at the bottom of the
463 diagram, clearing bits from each ``rcu_node`` structure's ``->qsmask``
464 field, and propagating up the tree when the result is zero.
465
466 Note that traversal passes upwards out of a given ``rcu_node`` structure
467 only if the current CPU is reporting the last quiescent state for the
468 subtree headed by that ``rcu_node`` structure. A key point is that if a
469 CPU's traversal stops at a given ``rcu_node`` structure, then there will
470 be a later traversal by another CPU (or perhaps the same one) that
471 proceeds upwards from that point, and the ``rcu_node`` ``->lock``
472 guarantees that the first CPU's quiescent state happens before the
473 remainder of the second CPU's traversal. Applying this line of thought
474 repeatedly shows that all CPUs' quiescent states happen before the last
475 CPU traverses through the root ``rcu_node`` structure, the “last CPU”
476 being the one that clears the last bit in the root ``rcu_node``
477 structure's ``->qsmask`` field.
478
479 Dynamic Tick Interface
480 ^^^^^^^^^^^^^^^^^^^^^^
481
482 Due to energy-efficiency considerations, RCU is forbidden from
483 disturbing idle CPUs. CPUs are therefore required to notify RCU when
484 entering or leaving idle state, which they do via fully ordered
485 value-returning atomic operations on a per-CPU variable. The ordering
486 effects are as shown below:
487
488 .. kernel-figure:: TreeRCU-dyntick.svg
489
490 The RCU grace-period kernel thread samples the per-CPU idleness variable
491 while holding the corresponding CPU's leaf ``rcu_node`` structure's
492 ``->lock``. This means that any RCU read-side critical sections that
493 precede the idle period (the oval near the top of the diagram above)
494 will happen before the end of the current grace period. Similarly, the
495 beginning of the current grace period will happen before any RCU
496 read-side critical sections that follow the idle period (the oval near
497 the bottom of the diagram above).
498
499 Plumbing this into the full grace-period execution is described
500 `below <Forcing Quiescent States_>`__.
501
502 CPU-Hotplug Interface
503 ^^^^^^^^^^^^^^^^^^^^^
504
505 RCU is also forbidden from disturbing offline CPUs, which might well be
506 powered off and removed from the system completely. CPUs are therefore
507 required to notify RCU of their comings and goings as part of the
508 corresponding CPU hotplug operations. The ordering effects are shown
509 below:
510
511 .. kernel-figure:: TreeRCU-hotplug.svg
512
513 Because CPU hotplug operations are much less frequent than idle
514 transitions, they are heavier weight, and thus acquire the CPU's leaf
515 ``rcu_node`` structure's ``->lock`` and update this structure's
516 ``->qsmaskinitnext``. The RCU grace-period kernel thread samples this
517 mask to detect CPUs having gone offline since the beginning of this
518 grace period.
519
520 Plumbing this into the full grace-period execution is described
521 `below <Forcing Quiescent States_>`__.
522
523 Forcing Quiescent States
524 ^^^^^^^^^^^^^^^^^^^^^^^^
525
526 As noted above, idle and offline CPUs cannot report their own quiescent
527 states, and therefore the grace-period kernel thread must do the
528 reporting on their behalf. This process is called “forcing quiescent
529 states”, it is repeated every few jiffies, and its ordering effects are
530 shown below:
531
532 .. kernel-figure:: TreeRCU-gp-fqs.svg
533
534 Each pass of quiescent state forcing is guaranteed to traverse the leaf
535 ``rcu_node`` structures, and if there are no new quiescent states due to
536 recently idled and/or offlined CPUs, then only the leaves are traversed.
537 However, if there is a newly offlined CPU as illustrated on the left or
538 a newly idled CPU as illustrated on the right, the corresponding
539 quiescent state will be driven up towards the root. As with
540 self-reported quiescent states, the upwards driving stops once it
541 reaches an ``rcu_node`` structure that has quiescent states outstanding
542 from other CPUs.
543
544 +-----------------------------------------------------------------------+
545 | **Quick Quiz**: |
546 +-----------------------------------------------------------------------+
547 | The leftmost drive to root stopped before it reached the root |
548 | ``rcu_node`` structure, which means that there are still CPUs |
549 | subordinate to that structure on which the current grace period is |
550 | waiting. Given that, how is it possible that the rightmost drive to |
551 | root ended the grace period? |
552 +-----------------------------------------------------------------------+
553 | **Answer**: |
554 +-----------------------------------------------------------------------+
555 | Good analysis! It is in fact impossible in the absence of bugs in |
556 | RCU. But this diagram is complex enough as it is, so simplicity |
557 | overrode accuracy. You can think of it as poetic license, or you can |
558 | think of it as misdirection that is resolved in the |
559 | `stitched-together diagram <Putting It All Together_>`__. |
560 +-----------------------------------------------------------------------+
561
562 Grace-Period Cleanup
563 ^^^^^^^^^^^^^^^^^^^^
564
565 Grace-period cleanup first scans the ``rcu_node`` tree breadth-first
566 advancing all the ``->gp_seq`` fields, then it advances the
567 ``rcu_state`` structure's ``->gp_seq`` field. The ordering effects are
568 shown below:
569
570 .. kernel-figure:: TreeRCU-gp-cleanup.svg
571
572 As indicated by the oval at the bottom of the diagram, once grace-period
573 cleanup is complete, the next grace period can begin.
574
575 +-----------------------------------------------------------------------+
576 | **Quick Quiz**: |
577 +-----------------------------------------------------------------------+
578 | But when precisely does the grace period end? |
579 +-----------------------------------------------------------------------+
580 | **Answer**: |
581 +-----------------------------------------------------------------------+
582 | There is no useful single point at which the grace period can be said |
583 | to end. The earliest reasonable candidate is as soon as the last CPU |
584 | has reported its quiescent state, but it may be some milliseconds |
585 | before RCU becomes aware of this. The latest reasonable candidate is |
586 | once the ``rcu_state`` structure's ``->gp_seq`` field has been |
587 | updated, but it is quite possible that some CPUs have already |
588 | completed phase two of their updates by that time. In short, if you |
589 | are going to work with RCU, you need to learn to embrace uncertainty. |
590 +-----------------------------------------------------------------------+
591
592 Callback Invocation
593 ^^^^^^^^^^^^^^^^^^^
594
595 Once a given CPU's leaf ``rcu_node`` structure's ``->gp_seq`` field has
596 been updated, that CPU can begin invoking its RCU callbacks that were
597 waiting for this grace period to end. These callbacks are identified by
598 ``rcu_advance_cbs()``, which is usually invoked by
599 ``__note_gp_changes()``. As shown in the diagram below, this invocation
600 can be triggered by the scheduling-clock interrupt
601 (``rcu_sched_clock_irq()`` on the left) or by idle entry
602 (``rcu_cleanup_after_idle()`` on the right, but only for kernels build
603 with ``CONFIG_RCU_FAST_NO_HZ=y``). Either way, ``RCU_SOFTIRQ`` is
604 raised, which results in ``rcu_do_batch()`` invoking the callbacks,
605 which in turn allows those callbacks to carry out (either directly or
606 indirectly via wakeup) the needed phase-two processing for each update.
607
608 .. kernel-figure:: TreeRCU-callback-invocation.svg
609
610 Please note that callback invocation can also be prompted by any number
611 of corner-case code paths, for example, when a CPU notes that it has
612 excessive numbers of callbacks queued. In all cases, the CPU acquires
613 its leaf ``rcu_node`` structure's ``->lock`` before invoking callbacks,
614 which preserves the required ordering against the newly completed grace
615 period.
616
617 However, if the callback function communicates to other CPUs, for
618 example, doing a wakeup, then it is that function's responsibility to
619 maintain ordering. For example, if the callback function wakes up a task
620 that runs on some other CPU, proper ordering must in place in both the
621 callback function and the task being awakened. To see why this is
622 important, consider the top half of the `grace-period
623 cleanup`_ diagram. The callback might be
624 running on a CPU corresponding to the leftmost leaf ``rcu_node``
625 structure, and awaken a task that is to run on a CPU corresponding to
626 the rightmost leaf ``rcu_node`` structure, and the grace-period kernel
627 thread might not yet have reached the rightmost leaf. In this case, the
628 grace period's memory ordering might not yet have reached that CPU, so
629 again the callback function and the awakened task must supply proper
630 ordering.
631
632 Putting It All Together
633 ~~~~~~~~~~~~~~~~~~~~~~~
634
635 A stitched-together diagram is here:
636
637 .. kernel-figure:: TreeRCU-gp.svg
638
639 Legal Statement
640 ~~~~~~~~~~~~~~~
641
642 This work represents the view of the author and does not necessarily
643 represent the view of IBM.
644
645 Linux is a registered trademark of Linus Torvalds.
646
647 Other company, product, and service names may be trademarks or service
648 marks of others.
649

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Grace period가 보장하는 양방향 ordering

1-45

이 글은 2017년 8월 8일 Paul E. McKenney가 기고한 TREE_RCU grace-period memory-ordering 보장의 시각적 개요입니다.

Idle이나 offline이 아닌 code에 대해 RCU GP는 매우 강한 ordering을 제공합니다. 어떤 GP가 시작되기 전에 수행된 RCU read-side critical section의 모든 access 효과는 그 GP가 끝난 뒤 실행되는 code에서 보입니다. 반대로 GP 시작 전 code는 GP 종료 뒤의 read-side critical section access 효과를 미리 볼 수 없습니다.

RCU GP의 양방향 경계
old reader accessesgrace period beginsall pre-existing readers pass QSgrace period endsnew reader/post-GP accesses

GP 앞과 뒤의 read-side access가 서로 시간 방향을 거슬러 관찰되지 않게 합니다.

RCU-sched read-side critical section에는 preemption이 disable된 모든 code가 포함됩니다. 기계어 instruction 하나도 아주 짧은 preemption-disabled 영역으로 볼 수 있으므로 `synchronize_rcu()`는 흔히 `smp_mb()`의 매우 강력한 확장처럼 생각할 수 있습니다.

Updater는 update를 GP 전의 phase one과 GP 뒤의 phase two로 나눠 이 보장을 사용합니다. 흔한 경우 phase one에서 RCU-protected linked structure의 원소를 제거하고 phase two에서 free합니다. 제거 전 상태를 본 reader가 free 이후 상태까지 관찰하면 안 됩니다.

Two-phase update
단계일반 동작
Phase 1, before GP원소 unpublish/removal
Grace period기존 reader 종료 대기
Phase 2, after GP원소 free/reclamation

GP가 old reader와 destructive phase를 분리합니다.

RCU 구현은 `rcu_node` lock critical section, memory barrier와 per-CPU 처리를 network로 연결해 이 ordering을 만듭니다.

======================================================
A Tour Through TREE_RCU's Grace-Period Memory Ordering
======================================================

August 8, 2017

This article was contributed by Paul E. McKenney

Introduction
============

This document gives a rough visual overview of how Tree RCU's
grace-period memory ordering guarantee is provided.

What Is Tree RCU's Grace Period Memory Ordering Guarantee?
==========================================================

RCU grace periods provide extremely strong memory-ordering guarantees
for non-idle non-offline code.
Any code that happens after the end of a given RCU grace period is guaranteed
to see the effects of all accesses prior to the beginning of that grace
period that are within RCU read-side critical sections.
Similarly, any code that happens before the beginning of a given RCU grace
period is guaranteed to not see the effects of all accesses following the end
of that grace period that are within RCU read-side critical sections.

Note well that RCU-sched read-side critical sections include any region
of code for which preemption is disabled.
Given that each individual machine instruction can be thought of as
an extremely small region of preemption-disabled code, one can think of
``synchronize_rcu()`` as ``smp_mb()`` on steroids.

RCU updaters use this guarantee by splitting their updates into
two phases, one of which is executed before the grace period and
the other of which is executed after the grace period.
In the most common use case, phase one removes an element from
a linked RCU-protected data structure, and phase two frees that element.
For this to work, any readers that have witnessed state prior to the
phase-one update (in the common case, removal) must not witness state
following the phase-two update (in the common case, freeing).

The RCU implementation provides this guarantee using a network
of lock-based critical sections, memory barriers, and per-CPU
processing, as is described in the following sections.

rcu_node lock과 unlock-lock full ordering

46-143

핵심 일꾼은 `rcu_node->lock` critical section입니다. 획득 helper는 `raw_spin_lock_rcu_node()`, `raw_spin_lock_irq_rcu_node()`, `raw_spin_lock_irqsave_rcu_node()`이며 대응 unlock helper와 `raw_spin_trylock_rcu_node()`도 있습니다. 모든 성공한 획득은 직후 `smp_mb__after_unlock_lock()`을 호출합니다.

같은 `rcu_node`에서 이전 unlock 전 access는 모든 CPU에게 이후 lock 뒤 access보다 먼저 보입니다. 더 나아가 같은 CPU에서 이전 unlock과 이후 lock이 서로 다른 `rcu_node`를 다뤄도 unlock 전 access가 lock 뒤 access보다 먼저 보입니다. TREE_RCU는 이를 이어 GP에 관여한 모든 CPU, GP 중 online/offline된 CPU까지 포함하는 ordering network를 만듭니다.

Lock-chain ordering
accesses before unlockraw_spin_unlock_rcu_nodelater raw_spin_lock_rcu_nodesmp_mb__after_unlock_lockaccesses after lock

Same-node lock handoff와 same-CPU cross-node handoff를 반복해 tree 전체 happens-before를 구성합니다.

Litmus test에서 task0은 lock 아래 `x=1` 뒤 `y`를 읽고, task1은 같은 lock 아래 `y=1` 뒤 `z`를 읽으며, task2는 `z=1`, `smp_mb()`, `x` read를 수행합니다. 모든 변화가 전파된 뒤 `r1==0 && r2==0 && r3==0`은 허용되지 않습니다. 획득 helper의 `smp_mb__after_unlock_lock()`이 없으면 PowerPC 등에서 이 결과가 가능할 수 있습니다.

세 task litmus cycle
Task순서
task0lock; x=1; r1=y; unlock
task1lock; y=1; r2=z; unlock
task2z=1; smp_mb(); r3=x
금지 결과r1=0, r2=0, r3=0

세 관찰이 모두 초기값이면 ordering cycle이 생기므로 금지됩니다.

Lock chain만으로 new reader와 updater phase를 정렬할 수 있어 보여도 polling GP primitive 때문에 explicit barrier가 필요합니다. CPU0이 `X=1`, `get_state_synchronize_rcu()`, `poll_state_synchronize_rcu()` 완료 뒤 Y를 읽고 CPU1이 `Y=1`, `smp_mb()`, X를 읽는 경우 `r0==0 && r1==0`은 금지됩니다. CPU1이 전체 GP 동안 extended quiescent state여서 RCU core와 직접 상호작용하지 않아도 이 보장이 성립해야 합니다.

Polling GP ordering
CPU0: X=1snapshot and poll GPCPU0: read YCPU1: Y=1; smp_mb(); read Xoutcome r0=0 and r1=0 forbidden

직접 RCU lock chain에 참여하지 않는 idle/offline CPU와도 store/read cycle의 둘 다 0인 결과를 막습니다.

Tree RCU Grace Period Memory Ordering Building Blocks
=====================================================

The workhorse for RCU's grace-period memory ordering is the
critical section for the ``rcu_node`` structure's
``->lock``. These critical sections use helper functions for lock
acquisition, including ``raw_spin_lock_rcu_node()``,
``raw_spin_lock_irq_rcu_node()``, and ``raw_spin_lock_irqsave_rcu_node()``.
Their lock-release counterparts are ``raw_spin_unlock_rcu_node()``,
``raw_spin_unlock_irq_rcu_node()``, and
``raw_spin_unlock_irqrestore_rcu_node()``, respectively.
For completeness, a ``raw_spin_trylock_rcu_node()`` is also provided.
The key point is that the lock-acquisition functions, including
``raw_spin_trylock_rcu_node()``, all invoke ``smp_mb__after_unlock_lock()``
immediately after successful acquisition of the lock.

Therefore, for any given ``rcu_node`` structure, any access
happening before one of the above lock-release functions will be seen
by all CPUs as happening before any access happening after a later
one of the above lock-acquisition functions.
Furthermore, any access happening before one of the
above lock-release function on any given CPU will be seen by all
CPUs as happening before any access happening after a later one
of the above lock-acquisition functions executing on that same CPU,
even if the lock-release and lock-acquisition functions are operating
on different ``rcu_node`` structures.
Tree RCU uses these two ordering guarantees to form an ordering
network among all CPUs that were in any way involved in the grace
period, including any CPUs that came online or went offline during
the grace period in question.

The following litmus test exhibits the ordering effects of these
lock-acquisition and lock-release functions::

    1 int x, y, z;
    2
    3 void task0(void)
    4 {
    5   raw_spin_lock_rcu_node(rnp);
    6   WRITE_ONCE(x, 1);
    7   r1 = READ_ONCE(y);
    8   raw_spin_unlock_rcu_node(rnp);
    9 }
   10
   11 void task1(void)
   12 {
   13   raw_spin_lock_rcu_node(rnp);
   14   WRITE_ONCE(y, 1);
   15   r2 = READ_ONCE(z);
   16   raw_spin_unlock_rcu_node(rnp);
   17 }
   18
   19 void task2(void)
   20 {
   21   WRITE_ONCE(z, 1);
   22   smp_mb();
   23   r3 = READ_ONCE(x);
   24 }
   25
   26 WARN_ON(r1 == 0 && r2 == 0 && r3 == 0);

The ``WARN_ON()`` is evaluated at "the end of time",
after all changes have propagated throughout the system.
Without the ``smp_mb__after_unlock_lock()`` provided by the
acquisition functions, this ``WARN_ON()`` could trigger, for example
on PowerPC.
The ``smp_mb__after_unlock_lock()`` invocations prevent this
``WARN_ON()`` from triggering.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But the chain of rcu_node-structure lock acquisitions guarantees      |
| that new readers will see all of the updater's pre-grace-period       |
| accesses and also guarantees that the updater's post-grace-period     |
| accesses will see all of the old reader's accesses.  So why do we     |
| need all of those calls to smp_mb__after_unlock_lock()?               |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| Because we must provide ordering for RCU's polling grace-period       |
| primitives, for example, get_state_synchronize_rcu() and              |
| poll_state_synchronize_rcu().  Consider this code::                   |
|                                                                       |
|  CPU 0                                     CPU 1                      |
|  ----                                      ----                       |
|  WRITE_ONCE(X, 1)                          WRITE_ONCE(Y, 1)           |
|  g = get_state_synchronize_rcu()           smp_mb()                   |
|  while (!poll_state_synchronize_rcu(g))    r1 = READ_ONCE(X)          |
|          continue;                                                    |
|  r0 = READ_ONCE(Y)                                                    |
|                                                                       |
| RCU guarantees that the outcome r0 == 0 && r1 == 0 will not           |
| happen, even if CPU 1 is in an RCU extended quiescent state           |
| (idle or offline) and thus won't interact directly with the RCU       |
| core processing at all.                                               |
+-----------------------------------------------------------------------+

Idle·offline CPU와 synchronize_rcu waiter 연결

144-192

Idle CPU의 현재 idle sojourn 앞뒤에 있는 RCU read section에도 GP ordering이 이어져야 합니다. Idle 진입의 `ct_kernel_exit_state()`와 idle 종료의 `ct_kernel_enter_state()`가 strongly ordered value-returning atomic `atomic_add_return()`을 사용합니다. GP kthread는 full memory barrier 뒤 `ct_rcu_watching_cpu_acquire()`와 acquire semantics의 `rcu_watching_snap_stopped_since()`로 idle CPU를 감지합니다.

Idle 경계 ordering
read section before idleatomic idle-entry transitionGP thread full barrier + acquire sampleGP completesatomic idle-exit transitionread section after idle

Fully ordered dyntick transition과 acquire sample이 GP를 idle 전후 reader 사이에 연결합니다.

GP 전체 동안 offline인 CPU는 시작 때부터 QS 대상이 아닙니다. GP 시작과 CPU hotplug의 race는 해당 CPU leaf `rcu_node->lock`이 중재합니다.

마지막 예외는 `synchronize_rcu()`에서 block된 task를 깨우는 경우입니다. Task affinity CPU가 아직 GP 종료를 인식하지 못했다면 ordering network가 그 CPU까지 도달하지 않았을 수 있습니다. 그래서 `synchronize_rcu()` 경로의 `wait_for_completion()` 반환 뒤에는 `smp_mb()`가 필요합니다. 이 문서를 작성하면서 발견되어 v4.14 무렵 mainline 반영이 예상됐고 Lance Roy, Will Deacon, Peter Zijlstra, Jonathan Cameron의 질문이 발견에 기여했습니다.

Waiter wakeup ordering
GP cleanup completescomplete waiterwait_for_completion returnssmp_mb()post-synchronize_rcu accesses

Completion wakeup만 믿지 않고 반환 뒤 full barrier로 GP ordering을 task의 실행 CPU에 확정합니다.

This approach must be extended to include idle CPUs, which need
RCU's grace-period memory ordering guarantee to extend to any
RCU read-side critical sections preceding and following the current
idle sojourn.
This case is handled by calls to the strongly ordered
``atomic_add_return()`` read-modify-write atomic operation that
is invoked within ``ct_kernel_exit_state()`` at idle-entry
time and within ``ct_kernel_enter_state()`` at idle-exit time.
The grace-period kthread invokes first ``ct_rcu_watching_cpu_acquire()``
(preceded by a full memory barrier) and ``rcu_watching_snap_stopped_since()``
(both of which rely on acquire semantics) to detect idle CPUs.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But what about CPUs that remain offline for the entire grace period?  |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| Such CPUs will be offline at the beginning of the grace period, so    |
| the grace period won't expect quiescent states from them. Races       |
| between grace-period start and CPU-hotplug operations are mediated    |
| by the CPU's leaf ``rcu_node`` structure's ``->lock`` as described    |
| above.                                                                |
+-----------------------------------------------------------------------+

The approach must be extended to handle one final case, that of waking a
task blocked in ``synchronize_rcu()``. This task might be affined to
a CPU that is not yet aware that the grace period has ended, and thus
might not yet be subject to the grace period's memory ordering.
Therefore, there is an ``smp_mb()`` after the return from
``wait_for_completion()`` in the ``synchronize_rcu()`` code path.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| What? Where??? I don't see any ``smp_mb()`` after the return from     |
| ``wait_for_completion()``!!!                                          |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| That would be because I spotted the need for that ``smp_mb()`` during |
| the creation of this documentation, and it is therefore unlikely to   |
| hit mainline before v4.14. Kudos to Lance Roy, Will Deacon, Peter     |
| Zijlstra, and Jonathan Cameron for asking questions that sensitized   |
| me to the rather elaborate sequence of events that demonstrate the    |
| need for this memory barrier.                                         |
+-----------------------------------------------------------------------+

Lock critical-section 도식과 전체 구성 요소

193-268

TREE_RCU ordering은 `rcu_node->lock`에 크게 의존하므로 뒤 그림에서는 이 pattern을 축약합니다. `rcu_prepare_for_idle()`도 새 callback과 미래 GP를 정렬하는 함수 중 하나입니다. 이 설명에서 중요한 부분은 pending callback이 있으면 leaf node lock을 획득하고 `rcu_accelerate_cbs()`를 실행한 뒤 unlock하는 lines 32~34입니다.

도식의 box는 `rcu_node->lock` critical section이고 위쪽 이중선은 추가 `smp_mb__after_unlock_lock()`을 뜻합니다. 원문 code는 nohz 활성화 snapshot, callback 존재 여부, jiffy당 한 번의 acceleration과 필요 시 `rcu_gp_kthread_wake()`까지 그대로 보여 줍니다.

축약된 rcu_node lock 기호
raw_spin_lock_rcu_nodesmp_mb__after_unlock_lockprotected operationraw_spin_unlock_rcu_node

이후 모든 그림에서 같은 box가 lock acquire, post-unlock-lock barrier, protected work와 unlock을 함께 나타냅니다.

GP ordering 구성 요소
순서구성 요소
1Callback Registry
2Grace-Period Initialization
3Self-Reported Quiescent States
4Dynamic Tick Interface
5CPU-Hotplug Interface
6Forcing Quiescent States
7Grace-Period Cleanup
8Callback Invocation

Callback의 GP 연결부터 호출까지 여덟 단계가 lock network로 이어집니다.

Tree RCU's grace--period memory-ordering guarantees rely most heavily on
the ``rcu_node`` structure's ``->lock`` field, so much so that it is
necessary to abbreviate this pattern in the diagrams in the next
section. For example, consider the ``rcu_prepare_for_idle()`` function
shown below, which is one of several functions that enforce ordering of
newly arrived RCU callbacks against future grace periods:

::

    1 static void rcu_prepare_for_idle(void)
    2 {
    3   bool needwake;
    4   struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
    5   struct rcu_node *rnp;
    6   int tne;
    7
    8   lockdep_assert_irqs_disabled();
    9   if (rcu_rdp_is_offloaded(rdp))
   10     return;
   11
   12   /* Handle nohz enablement switches conservatively. */
   13   tne = READ_ONCE(tick_nohz_active);
   14   if (tne != rdp->tick_nohz_enabled_snap) {
   15     if (!rcu_segcblist_empty(&rdp->cblist))
   16       invoke_rcu_core(); /* force nohz to see update. */
   17     rdp->tick_nohz_enabled_snap = tne;
   18     return;
   19        }
   20   if (!tne)
   21     return;
   22
   23   /*
   24    * If we have not yet accelerated this jiffy, accelerate all
   25    * callbacks on this CPU.
   26   */
   27   if (rdp->last_accelerate == jiffies)
   28     return;
   29   rdp->last_accelerate = jiffies;
   30   if (rcu_segcblist_pend_cbs(&rdp->cblist)) {
   31     rnp = rdp->mynode;
   32     raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
   33     needwake = rcu_accelerate_cbs(rnp, rdp);
   34     raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
   35     if (needwake)
   36       rcu_gp_kthread_wake();
   37   }
   38 }

But the only part of ``rcu_prepare_for_idle()`` that really matters for
this discussion are lines 32–34. We will therefore abbreviate this
function as follows:

.. kernel-figure:: rcu_node-lock.svg

The box represents the ``rcu_node`` structure's ``->lock`` critical
section, with the double line on top representing the additional
``smp_mb__after_unlock_lock()``.

Tree RCU Grace Period Memory Ordering Components
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Tree RCU's grace-period memory-ordering guarantee is provided by a
number of RCU components:

#. `Callback Registry`_
#. `Grace-Period Initialization`_
#. `Self-Reported Quiescent States`_
#. `Dynamic Tick Interface`_
#. `CPU-Hotplug Interface`_
#. `Forcing Quiescent States`_
#. `Grace-Period Cleanup`_
#. `Callback Invocation`_

Each of the following section looks at the corresponding component in
detail.

Callback 등록을 미래 GP에 연결

269-326

`call_rcu()` 이전의 모든 access, 특히 update phase one은 callback이 기다릴 GP보다 먼저 일어나야 합니다. 하지만 `call_rcu()` 자체는 보통 CPU-local state만 다뤄 ordering을 제공하지 않고 `rcu_head`를 per-CPU list에 넣을 뿐입니다. 나중의 `rcu_accelerate_cbs()`가 callback을 미래 GP 번호와 연결합니다.

왼쪽 경로는 queued `rcu_head`가 폭증했을 때 `call_rcu()`가 직접 또는 보통 `RCU_SOFTIRQ`의 `note_gp_changes()`를 통해 acceleration을 호출합니다. `CONFIG_RCU_FAST_NO_HZ=y`의 중간 경로는 `rcu_prepare_for_idle()`을 사용합니다. `CONFIG_HOTPLUG_CPU=y`의 오른쪽 경로는 완전히 offline된 CPU의 callback을 surviving CPU에서 `takedown_cpu()`→`rcutree_migrate_callbacks()`→`rcu_migrate_callbacks`→`rcu_advance_cbs()`를 거쳐 처리합니다.

Callback registry ordering
phase-one accessescall_rcu enqueues per-CPU rcu_headone acceleration pathlock leaf rcu_nodercu_accelerate_cbs assigns future GPunlock

CPU-local enqueue 뒤 leaf lock 아래 GP 번호를 배정하는 시점이 phase one을 GP 시작 network에 붙입니다.

GP processing의 다른 경로도 기회가 되면 acceleration을 수행합니다. 어느 경로든 최근 callback을 CPU leaf `rcu_node->lock` 아래 미래 GP 번호와 연결하므로, 같은 node의 이전 critical section 및 현재 task/CPU가 다른 node에서 수행한 이전 critical section과 full ordering됩니다. 다음 GP 초기화 경로가 이 ordering을 GP 실제 시작까지 잇습니다.

`synchronize_rcu()`도 예외가 아닙니다. `call_rcu()`를 `wait_rcu_gp()`에 넘기고 그 함수가 호출하므로 결국 같은 callback registry 경로를 사용합니다.

Callback Registry
^^^^^^^^^^^^^^^^^

If RCU's grace-period guarantee is to mean anything at all, any access
that happens before a given invocation of ``call_rcu()`` must also
happen before the corresponding grace period. The implementation of this
portion of RCU's grace period guarantee is shown in the following
figure:

.. kernel-figure:: TreeRCU-callback-registry.svg

Because ``call_rcu()`` normally acts only on CPU-local state, it
provides no ordering guarantees, either for itself or for phase one of
the update (which again will usually be removal of an element from an
RCU-protected data structure). It simply enqueues the ``rcu_head``
structure on a per-CPU list, which cannot become associated with a grace
period until a later call to ``rcu_accelerate_cbs()``, as shown in the
diagram above.

One set of code paths shown on the left invokes ``rcu_accelerate_cbs()``
via ``note_gp_changes()``, either directly from ``call_rcu()`` (if the
current CPU is inundated with queued ``rcu_head`` structures) or more
likely from an ``RCU_SOFTIRQ`` handler. Another code path in the middle
is taken only in kernels built with ``CONFIG_RCU_FAST_NO_HZ=y``, which
invokes ``rcu_accelerate_cbs()`` via ``rcu_prepare_for_idle()``. The
final code path on the right is taken only in kernels built with
``CONFIG_HOTPLUG_CPU=y``, which invokes ``rcu_accelerate_cbs()`` via
``rcu_advance_cbs()``, ``rcu_migrate_callbacks``,
``rcutree_migrate_callbacks()``, and ``takedown_cpu()``, which in turn
is invoked on a surviving CPU after the outgoing CPU has been completely
offlined.

There are a few other code paths within grace-period processing that
opportunistically invoke ``rcu_accelerate_cbs()``. However, either way,
all of the CPU's recently queued ``rcu_head`` structures are associated
with a future grace-period number under the protection of the CPU's lead
``rcu_node`` structure's ``->lock``. In all cases, there is full
ordering against any prior critical section for that same ``rcu_node``
structure's ``->lock``, and also full ordering against any of the
current task's or CPU's prior critical sections for any ``rcu_node``
structure's ``->lock``.

The next section will show how this ordering ensures that any accesses
prior to the ``call_rcu()`` (particularly including phase one of the
update) happen before the start of the corresponding grace period.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But what about ``synchronize_rcu()``?                                 |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| The ``synchronize_rcu()`` passes ``call_rcu()`` to ``wait_rcu_gp()``, |
| which invokes it. So either way, it eventually comes down to          |
| ``call_rcu()``.                                                       |
+-----------------------------------------------------------------------+

GP 초기화의 세 tree pass

327-403

GP kthread는 `rcu_gp_init()`에서 `rcu_node` tree를 여러 번 순회합니다. 같은 node의 상태가 시간에 따라 변하므로 전체 ordering 흐름은 tree를 여러 그림에 반복해 나타냅니다.

첫 ordering 동작은 `rcu_state.gp_seq`를 advance하는 것입니다. 실제 increment는 `smp_store_release()`로 수행해 false-positive RCU CPU stall 판정을 줄이며, 이 단계에서는 root `rcu_node`만 만집니다.

GP init pass 1
lock root rcu_nodesmp_store_release(rcu_state.gp_seq)unlock root

Global GP 번호를 release store로 먼저 시작합니다.

첫 tree pass는 이전 GP 시작 뒤 online/offline된 CPU에 맞춰 bitmask를 갱신합니다. Node의 online CPU 수가 0과 비0 사이를 오가지 않은 common case에는 leaf만 scan합니다. Leaf가 0에서 비0으로 바뀌면 첫 incoming CPU에 대해 `rcu_init_new_rnp()`, 비0에서 0이 되면 마지막 outgoing CPU에 대해 `rcu_cleanup_dead_rnp()`를 호출해 parent 방향 상태를 조정합니다.

GP init pass 2
scan leaf nodesfirst CPU online: rcu_init_new_rnplast CPU offline: rcu_cleanup_dead_rnplock chain updates ancestors

Hotplug 변화가 있는 leaf만 parent chain으로 ordering과 mask 변화를 전파합니다.

마지막 pass는 breadth-first로 모든 `rcu_node.gp_seq`를 새 `rcu_state` 값으로 설정합니다. 이후 각 CPU의 `__note_gp_changes()`가 새 GP 시작을 발견합니다. Root에서 전역 `gp_seq`를 먼저 advance하고 leaf local copy를 나중에 바꾸므로 CPU의 관찰은 실제 GP 시작 뒤에 일어납니다.

GP init pass 3
root already has new rcu_state.gp_seqvisit rcu_node breadth-firstset each node gp_seqCPU __note_gp_changes observes start

Breadth-first lock chain으로 새 GP 번호를 root에서 모든 leaf에 배포합니다.

GP를 시작한 CPU도 RCU가 자기 인식을 한다고 보지 않는 한 즉시 안다고 할 수 없습니다. 자기 leaf에 대한 마지막 `rcu_gp_init()` pass에서 `__note_gp_changes()`를 호출할 수 있어 다른 CPU보다 빨리 알 가능성은 있지만, local observation은 여전히 그 호출 시점입니다.

Grace-Period Initialization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Grace-period initialization is carried out by the grace-period kernel
thread, which makes several passes over the ``rcu_node`` tree within the
``rcu_gp_init()`` function. This means that showing the full flow of
ordering through the grace-period computation will require duplicating
this tree. If you find this confusing, please note that the state of the
``rcu_node`` changes over time, just like Heraclitus's river. However,
to keep the ``rcu_node`` river tractable, the grace-period kernel
thread's traversals are presented in multiple parts, starting in this
section with the various phases of grace-period initialization.

The first ordering-related grace-period initialization action is to
advance the ``rcu_state`` structure's ``->gp_seq`` grace-period-number
counter, as shown below:

.. kernel-figure:: TreeRCU-gp-init-1.svg

The actual increment is carried out using ``smp_store_release()``, which
helps reject false-positive RCU CPU stall detection. Note that only the
root ``rcu_node`` structure is touched.

The first pass through the ``rcu_node`` tree updates bitmasks based on
CPUs having come online or gone offline since the start of the previous
grace period. In the common case where the number of online CPUs for
this ``rcu_node`` structure has not transitioned to or from zero, this
pass will scan only the leaf ``rcu_node`` structures. However, if the
number of online CPUs for a given leaf ``rcu_node`` structure has
transitioned from zero, ``rcu_init_new_rnp()`` will be invoked for the
first incoming CPU. Similarly, if the number of online CPUs for a given
leaf ``rcu_node`` structure has transitioned to zero,
``rcu_cleanup_dead_rnp()`` will be invoked for the last outgoing CPU.
The diagram below shows the path of ordering if the leftmost
``rcu_node`` structure onlines its first CPU and if the next
``rcu_node`` structure has no online CPUs (or, alternatively if the
leftmost ``rcu_node`` structure offlines its last CPU and if the next
``rcu_node`` structure has no online CPUs).

.. kernel-figure:: TreeRCU-gp-init-2.svg

The final ``rcu_gp_init()`` pass through the ``rcu_node`` tree traverses
breadth-first, setting each ``rcu_node`` structure's ``->gp_seq`` field
to the newly advanced value from the ``rcu_state`` structure, as shown
in the following diagram.

.. kernel-figure:: TreeRCU-gp-init-3.svg

This change will also cause each CPU's next call to
``__note_gp_changes()`` to notice that a new grace period has started,
as described in the next section. But because the grace-period kthread
started the grace period at the root (with the advancing of the
``rcu_state`` structure's ``->gp_seq`` field) before setting each leaf
``rcu_node`` structure's ``->gp_seq`` field, each CPU's observation of
the start of the grace period will happen after the actual start of the
grace period.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But what about the CPU that started the grace period? Why wouldn't it |
| see the start of the grace period right when it started that grace    |
| period?                                                               |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| In some deep philosophical and overly anthromorphized sense, yes, the |
| CPU starting the grace period is immediately aware of having done so. |
| However, if we instead assume that RCU is not self-aware, then even   |
| the CPU starting the grace period does not really become aware of the |
| start of this grace period until its first call to                    |
| ``__note_gp_changes()``. On the other hand, this CPU potentially gets |
| early notification because it invokes ``__note_gp_changes()`` during  |
| its last ``rcu_gp_init()`` pass through its leaf ``rcu_node``         |
| structure.                                                            |
+-----------------------------------------------------------------------+

Online CPU의 self-reported quiescent state

404-478

GP를 막을 수 있는 모든 entity가 직접 QS를 보고하거나 뒤 절처럼 대리 보고되면 GP가 끝납니다. 그림은 마지막 CPU가 QS를 보고해 GP 종료를 신호하는 경로입니다. 앞선 보고는 아직 다른 자식을 기다리는 node에서 멈추지만, 나중 보고가 그 node lock을 다시 획득하므로 ordering은 보존됩니다.

CPU는 `note_gp_changes()` 또는 `__note_gp_changes()`를 leaf lock 아래 호출해 새 GP 시작을 인식합니다. 그 호출 전에 시작된 RCU read section은 GP보다 먼저 시작한 것으로 간주해 기다립니다. 실제 전역 GP 시작 뒤에 시작됐을 수도 있어 논리적으로 기다릴 필요는 없지만, 더 확장성 있는 lazy start를 위해 기다리는 것은 허용되며 중요합니다.

Context switch에서는 `rcu_note_context_switch()`, user mode의 scheduler-clock interrupt에서는 `rcu_sched_clock_irq()`가 QS를 per-CPU 변수에 기록합니다. 다음 `RCU_SOFTIRQ`에서 `rcu_core()`→`rcu_check_quiescent_state()`가 기록을 발견하고 `rcu_report_qs_rdp()`를 호출합니다.

Self-reported QS 경로
CPU observes GP under leaf lockcontext switch or user-mode sched tickrecord per-CPU QSRCU_SOFTIRQ rcu_corercu_report_qs_rdp validates GPrcu_report_rnp clears qsmask up tree

Per-CPU 기록을 현재 GP에 검증한 뒤 마지막 자식인 경우에만 parent로 진행합니다.

`rcu_report_qs_rdp()`가 QS가 현재 GP에 적용됨을 확인하면 `rcu_report_rnp()`가 tree 위로 올라가 각 `qsmask` bit를 지웁니다. 현재 CPU가 해당 subtree의 마지막 reporter일 때만 node를 넘어 parent로 진행합니다. 어떤 보고가 node에서 멈추면 나중의 다른 보고가 그 node에서 위로 진행하고 node lock이 첫 보고를 뒤 traversal보다 먼저 정렬합니다. 이를 반복하면 모든 CPU의 QS가 root의 마지막 bit를 지우는 CPU보다 먼저 일어납니다.

상향 traversal 조건
qsmask 결과동작
nonzero다른 자식 QS 대기, 이 traversal 중단
zerosubtree 완료, parent grpmask clear
root becomes zero모든 필요한 QS가 앞서며 GP 종료 가능

각 node에서 마지막 미보고 bit를 지우는 report만 다음 level로 진행합니다.

Self-Reported Quiescent States
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When all entities that might block the grace period have reported
quiescent states (or as described in a later section, had quiescent
states reported on their behalf), the grace period can end. Online
non-idle CPUs report their own quiescent states, as shown in the
following diagram:

.. kernel-figure:: TreeRCU-qs.svg

This is for the last CPU to report a quiescent state, which signals the
end of the grace period. Earlier quiescent states would push up the
``rcu_node`` tree only until they encountered an ``rcu_node`` structure
that is waiting for additional quiescent states. However, ordering is
nevertheless preserved because some later quiescent state will acquire
that ``rcu_node`` structure's ``->lock``.

Any number of events can lead up to a CPU invoking ``note_gp_changes``
(or alternatively, directly invoking ``__note_gp_changes()``), at which
point that CPU will notice the start of a new grace period while holding
its leaf ``rcu_node`` lock. Therefore, all execution shown in this
diagram happens after the start of the grace period. In addition, this
CPU will consider any RCU read-side critical section that started before
the invocation of ``__note_gp_changes()`` to have started before the
grace period, and thus a critical section that the grace period must
wait on.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But a RCU read-side critical section might have started after the     |
| beginning of the grace period (the advancing of ``->gp_seq`` from     |
| earlier), so why should the grace period wait on such a critical      |
| section?                                                              |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| It is indeed not necessary for the grace period to wait on such a     |
| critical section. However, it is permissible to wait on it. And it is |
| furthermore important to wait on it, as this lazy approach is far     |
| more scalable than a “big bang” all-at-once grace-period start could  |
| possibly be.                                                          |
+-----------------------------------------------------------------------+

If the CPU does a context switch, a quiescent state will be noted by
``rcu_note_context_switch()`` on the left. On the other hand, if the CPU
takes a scheduler-clock interrupt while executing in usermode, a
quiescent state will be noted by ``rcu_sched_clock_irq()`` on the right.
Either way, the passage through a quiescent state will be noted in a
per-CPU variable.

The next time an ``RCU_SOFTIRQ`` handler executes on this CPU (for
example, after the next scheduler-clock interrupt), ``rcu_core()`` will
invoke ``rcu_check_quiescent_state()``, which will notice the recorded
quiescent state, and invoke ``rcu_report_qs_rdp()``. If
``rcu_report_qs_rdp()`` verifies that the quiescent state really does
apply to the current grace period, it invokes ``rcu_report_rnp()`` which
traverses up the ``rcu_node`` tree as shown at the bottom of the
diagram, clearing bits from each ``rcu_node`` structure's ``->qsmask``
field, and propagating up the tree when the result is zero.

Note that traversal passes upwards out of a given ``rcu_node`` structure
only if the current CPU is reporting the last quiescent state for the
subtree headed by that ``rcu_node`` structure. A key point is that if a
CPU's traversal stops at a given ``rcu_node`` structure, then there will
be a later traversal by another CPU (or perhaps the same one) that
proceeds upwards from that point, and the ``rcu_node`` ``->lock``
guarantees that the first CPU's quiescent state happens before the
remainder of the second CPU's traversal. Applying this line of thought
repeatedly shows that all CPUs' quiescent states happen before the last
CPU traverses through the root ``rcu_node`` structure, the “last CPU”
being the one that clears the last bit in the root ``rcu_node``
structure's ``->qsmask`` field.

Dynamic tick idle 경계의 ordering

479-501

에너지 효율 때문에 RCU는 idle CPU를 방해할 수 없습니다. CPU는 per-CPU 변수에 fully ordered value-returning atomic operation을 수행해 idle 진입과 종료를 RCU에 알립니다.

GP kthread는 대상 CPU leaf `rcu_node->lock`을 잡은 채 idleness 변수를 sample합니다. 따라서 idle period보다 앞선 RCU read section은 현재 GP 종료보다 먼저 일어나고, 현재 GP 시작은 idle 뒤의 RCU read section보다 먼저 일어납니다. 이 상태가 full GP에 연결되는 과정은 forced QS 절에서 설명합니다.

Dyntick ordering
read section before idlefully ordered idle entryGP thread samples under leaf lockforced QS if idlefully ordered idle exitread section after idle

Idle transition atomic과 leaf lock sample이 reader를 GP 양쪽에 배치합니다.

Dynamic Tick Interface
^^^^^^^^^^^^^^^^^^^^^^

Due to energy-efficiency considerations, RCU is forbidden from
disturbing idle CPUs. CPUs are therefore required to notify RCU when
entering or leaving idle state, which they do via fully ordered
value-returning atomic operations on a per-CPU variable. The ordering
effects are as shown below:

.. kernel-figure:: TreeRCU-dyntick.svg

The RCU grace-period kernel thread samples the per-CPU idleness variable
while holding the corresponding CPU's leaf ``rcu_node`` structure's
``->lock``. This means that any RCU read-side critical sections that
precede the idle period (the oval near the top of the diagram above)
will happen before the end of the current grace period. Similarly, the
beginning of the current grace period will happen before any RCU
read-side critical sections that follow the idle period (the oval near
the bottom of the diagram above).

Plumbing this into the full grace-period execution is described
`below <Forcing Quiescent States_>`__.

CPU hotplug 경계의 ordering

502-522

Offline CPU는 전원이 꺼지고 제거될 수도 있으므로 RCU가 방해할 수 없습니다. CPU는 hotplug operation의 일부로 online과 offline을 RCU에 알립니다.

Hotplug은 idle 전환보다 훨씬 드물어 더 무거운 경로를 허용합니다. CPU leaf `rcu_node->lock`을 획득해 `qsmaskinitnext`를 갱신하고 GP kthread가 이 mask를 sample해 현재 GP 시작 뒤 offline된 CPU를 찾습니다. Full GP 연결은 forced QS 경로가 담당합니다.

Hotplug ordering
CPU hotplug transitionlock leaf rcu_nodeupdate qsmaskinitnextGP thread samples maskreport QS on offline CPU behalf

Leaf lock 아래 mask update와 GP thread sample이 offline CPU의 마지막 실행을 GP network에 붙입니다.

CPU-Hotplug Interface
^^^^^^^^^^^^^^^^^^^^^

RCU is also forbidden from disturbing offline CPUs, which might well be
powered off and removed from the system completely. CPUs are therefore
required to notify RCU of their comings and goings as part of the
corresponding CPU hotplug operations. The ordering effects are shown
below:

.. kernel-figure:: TreeRCU-hotplug.svg

Because CPU hotplug operations are much less frequent than idle
transitions, they are heavier weight, and thus acquire the CPU's leaf
``rcu_node`` structure's ``->lock`` and update this structure's
``->qsmaskinitnext``. The RCU grace-period kernel thread samples this
mask to detect CPUs having gone offline since the beginning of this
grace period.

Plumbing this into the full grace-period execution is described
`below <Forcing Quiescent States_>`__.

Idle·offline CPU의 forced quiescent state

523-561

Idle과 offline CPU는 스스로 QS를 보고할 수 없어 GP kthread가 대신 보고합니다. 이 forced quiescent state 과정은 몇 jiffy마다 반복됩니다.

각 FQS pass는 반드시 모든 leaf `rcu_node`를 순회합니다. 최근 idle/offline CPU에서 새 QS가 없으면 leaf만 방문합니다. 새 offline CPU 또는 idle CPU가 있으면 그 QS를 root 방향으로 올리며 self-report와 마찬가지로 다른 CPU의 QS가 남은 node에서 멈춥니다.

Forced QS pass
scan every leafsample offline qsmaskinitnextsample idle dyntick stateclear corresponding qsmask bitspropagate only if subtree completeroot zero ends GP

Dyntick와 hotplug snapshot을 leaf lock 아래 확인해 대리 보고를 일반 qsmask 결합 경로로 합칩니다.

원문의 단순화된 그림에서는 왼쪽 root drive가 root 전에 멈췄는데 오른쪽 drive가 GP를 끝내는 모순이 있습니다. 실제 RCU가 정상이라면 불가능하며, 전체를 이어 붙인 마지막 그림에서 정확한 관계가 드러납니다. 원문도 복잡도를 낮추기 위한 시적 허용이라고 명시합니다.

Forcing Quiescent States
^^^^^^^^^^^^^^^^^^^^^^^^

As noted above, idle and offline CPUs cannot report their own quiescent
states, and therefore the grace-period kernel thread must do the
reporting on their behalf. This process is called “forcing quiescent
states”, it is repeated every few jiffies, and its ordering effects are
shown below:

.. kernel-figure:: TreeRCU-gp-fqs.svg

Each pass of quiescent state forcing is guaranteed to traverse the leaf
``rcu_node`` structures, and if there are no new quiescent states due to
recently idled and/or offlined CPUs, then only the leaves are traversed.
However, if there is a newly offlined CPU as illustrated on the left or
a newly idled CPU as illustrated on the right, the corresponding
quiescent state will be driven up towards the root. As with
self-reported quiescent states, the upwards driving stops once it
reaches an ``rcu_node`` structure that has quiescent states outstanding
from other CPUs.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| The leftmost drive to root stopped before it reached the root         |
| ``rcu_node`` structure, which means that there are still CPUs         |
| subordinate to that structure on which the current grace period is    |
| waiting. Given that, how is it possible that the rightmost drive to   |
| root ended the grace period?                                          |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| Good analysis! It is in fact impossible in the absence of bugs in     |
| RCU. But this diagram is complex enough as it is, so simplicity       |
| overrode accuracy. You can think of it as poetic license, or you can  |
| think of it as misdirection that is resolved in the                   |
| `stitched-together diagram <Putting It All Together_>`__.             |
+-----------------------------------------------------------------------+

Grace-period cleanup과 종료 시점의 분산성

562-591

Cleanup은 먼저 `rcu_node` tree를 breadth-first로 scan해 모든 node의 `gp_seq`를 advance하고, 그 다음 `rcu_state.gp_seq`를 advance합니다. Cleanup이 끝나면 다음 GP를 시작할 수 있습니다.

GP cleanup ordering
last root qsmask bit clearedscan rcu_node breadth-firstadvance each node gp_seqadvance rcu_state.gp_seqnext GP may begin

QS 결합의 root 완료를 node local completion과 global sequence 종료로 전파합니다.

GP가 끝나는 유용한 단일 순간은 없습니다. 가장 이른 후보는 마지막 CPU가 QS를 보고한 때지만 RCU가 이를 인식하기까지 millisecond가 걸릴 수 있습니다. 가장 늦은 후보는 `rcu_state.gp_seq` 갱신 때지만 일부 CPU는 이미 update phase two를 끝냈을 수 있습니다. RCU 종료는 분산된 interval로 이해해야 합니다.

GP 종료 후보
후보한계
마지막 실제 QSRCU가 아직 모를 수 있음
Leaf/node gp_seq update일부 CPU는 callback 호출 가능
rcu_state.gp_seq update다른 CPU가 phase two를 이미 완료할 수 있음

관찰 위치에 따라 완료 인식 시점이 다릅니다.

Grace-Period Cleanup
^^^^^^^^^^^^^^^^^^^^

Grace-period cleanup first scans the ``rcu_node`` tree breadth-first
advancing all the ``->gp_seq`` fields, then it advances the
``rcu_state`` structure's ``->gp_seq`` field. The ordering effects are
shown below:

.. kernel-figure:: TreeRCU-gp-cleanup.svg

As indicated by the oval at the bottom of the diagram, once grace-period
cleanup is complete, the next grace period can begin.

+-----------------------------------------------------------------------+
| **Quick Quiz**:                                                       |
+-----------------------------------------------------------------------+
| But when precisely does the grace period end?                         |
+-----------------------------------------------------------------------+
| **Answer**:                                                           |
+-----------------------------------------------------------------------+
| There is no useful single point at which the grace period can be said |
| to end. The earliest reasonable candidate is as soon as the last CPU  |
| has reported its quiescent state, but it may be some milliseconds     |
| before RCU becomes aware of this. The latest reasonable candidate is  |
| once the ``rcu_state`` structure's ``->gp_seq`` field has been        |
| updated, but it is quite possible that some CPUs have already         |
| completed phase two of their updates by that time. In short, if you   |
| are going to work with RCU, you need to learn to embrace uncertainty. |
+-----------------------------------------------------------------------+

Callback 호출과 다른 CPU로의 ordering 전달

592-631

CPU leaf `rcu_node.gp_seq`가 갱신되면 그 CPU는 해당 GP를 기다리던 callback을 호출할 수 있습니다. 보통 `__note_gp_changes()`가 `rcu_advance_cbs()`를 호출해 대상을 찾습니다.

Scheduling-clock interrupt의 `rcu_sched_clock_irq()` 또는 `CONFIG_RCU_FAST_NO_HZ=y`에서 idle 진입의 `rcu_cleanup_after_idle()`이 이 과정을 촉발할 수 있습니다. 둘 다 `RCU_SOFTIRQ`를 올리고 `rcu_do_batch()`가 callback을 호출해 직접 또는 wakeup을 통해 update phase two를 실행합니다. Callback 과다 같은 corner case 경로도 촉발할 수 있습니다.

Callback invocation ordering
leaf rcu_node.gp_seq updated__note_gp_changesrcu_advance_cbs marks readyraise RCU_SOFTIRQrcu_do_batch invokes callbackphase-two processing

Leaf GP 완료를 관찰하는 lock 구간 뒤 softirq가 phase two를 수행합니다.

모든 경로에서 CPU는 callback 호출 가능 상태를 만들기 전에 leaf `rcu_node->lock`을 획득해 새로 완료된 GP와 ordering을 지킵니다. 그러나 callback이 wakeup 등으로 다른 CPU와 통신하면 callback 함수와 깨어난 task가 자체 ordering을 제공해야 합니다.

예를 들어 왼쪽 leaf CPU의 callback이 오른쪽 leaf CPU에서 실행될 task를 깨울 때 GP kthread가 아직 오른쪽 leaf cleanup에 도달하지 않았을 수 있습니다. 그 CPU에는 GP ordering이 아직 전파되지 않았으므로 wakeup 양쪽의 올바른 ordering이 필수입니다.

Ordering 책임 경계
경계책임
GP → local callbackleaf rcu_node lock network
callback 내부 phase twoRCU callback ordering
callback → remote wakeupcallback과 awakened task의 synchronization

RCU는 callback 실행 CPU까지 보장하지만 callback의 외부 통신은 caller protocol이 담당합니다.

Callback Invocation
^^^^^^^^^^^^^^^^^^^

Once a given CPU's leaf ``rcu_node`` structure's ``->gp_seq`` field has
been updated, that CPU can begin invoking its RCU callbacks that were
waiting for this grace period to end. These callbacks are identified by
``rcu_advance_cbs()``, which is usually invoked by
``__note_gp_changes()``. As shown in the diagram below, this invocation
can be triggered by the scheduling-clock interrupt
(``rcu_sched_clock_irq()`` on the left) or by idle entry
(``rcu_cleanup_after_idle()`` on the right, but only for kernels build
with ``CONFIG_RCU_FAST_NO_HZ=y``). Either way, ``RCU_SOFTIRQ`` is
raised, which results in ``rcu_do_batch()`` invoking the callbacks,
which in turn allows those callbacks to carry out (either directly or
indirectly via wakeup) the needed phase-two processing for each update.

.. kernel-figure:: TreeRCU-callback-invocation.svg

Please note that callback invocation can also be prompted by any number
of corner-case code paths, for example, when a CPU notes that it has
excessive numbers of callbacks queued. In all cases, the CPU acquires
its leaf ``rcu_node`` structure's ``->lock`` before invoking callbacks,
which preserves the required ordering against the newly completed grace
period.

However, if the callback function communicates to other CPUs, for
example, doing a wakeup, then it is that function's responsibility to
maintain ordering. For example, if the callback function wakes up a task
that runs on some other CPU, proper ordering must in place in both the
callback function and the task being awakened. To see why this is
important, consider the top half of the `grace-period
cleanup`_ diagram. The callback might be
running on a CPU corresponding to the leftmost leaf ``rcu_node``
structure, and awaken a task that is to run on a CPU corresponding to
the rightmost leaf ``rcu_node`` structure, and the grace-period kernel
thread might not yet have reached the rightmost leaf. In this case, the
grace period's memory ordering might not yet have reached that CPU, so
again the callback function and the awakened task must supply proper
ordering.

전체 ordering network와 법적 고지

632-648

마지막 TreeRCU-gp.svg는 callback registry, 세 단계 GP initialization, self/forced QS, dynamic tick, hotplug, cleanup과 callback invocation 그림을 하나로 이어 전체 happens-before network를 보여 줍니다.

TREE_RCU GP ordering 전체
phase one + callback registryGP sequence initializationCPU observes GPself-reported or forced QSroot combines all QSbreadth-first cleanupcallback invocation + phase two

각 단계의 rcu_node lock handoff가 updater phase one을 모든 기존 reader의 QS와 phase two에 연결합니다.

이 글은 저자의 견해이며 반드시 IBM의 견해를 나타내지는 않습니다. Linux는 Linus Torvalds의 등록 상표이고 다른 회사·제품·서비스 이름은 각 소유자의 상표 또는 서비스표일 수 있습니다.

Putting It All Together
~~~~~~~~~~~~~~~~~~~~~~~

A stitched-together diagram is here:

.. kernel-figure:: TreeRCU-gp.svg

Legal Statement
~~~~~~~~~~~~~~~

This work represents the view of the author and does not necessarily
represent the view of IBM.

Linux is a registered trademark of Linus Torvalds.

Other company, product, and service names may be trademarks or service
marks of others.