aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/RCU
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /Documentation/RCU
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'Documentation/RCU')
-rw-r--r--Documentation/RCU/NMI-RCU.txt2
-rw-r--r--Documentation/RCU/RTFP.txt1786
-rw-r--r--Documentation/RCU/checklist.txt82
-rw-r--r--Documentation/RCU/listRCU.txt2
-rw-r--r--Documentation/RCU/lockdep-splat.txt110
-rw-r--r--Documentation/RCU/lockdep.txt34
-rw-r--r--Documentation/RCU/rcu.txt10
-rw-r--r--Documentation/RCU/rcubarrier.txt15
-rw-r--r--Documentation/RCU/rcuref.txt61
-rw-r--r--Documentation/RCU/stallwarn.txt103
-rw-r--r--Documentation/RCU/torture.txt205
-rw-r--r--Documentation/RCU/trace.txt419
-rw-r--r--Documentation/RCU/whatisRCU.txt47
13 files changed, 417 insertions, 2459 deletions
diff --git a/Documentation/RCU/NMI-RCU.txt b/Documentation/RCU/NMI-RCU.txt
index 687777f83b2..bf82851a0e5 100644
--- a/Documentation/RCU/NMI-RCU.txt
+++ b/Documentation/RCU/NMI-RCU.txt
@@ -95,7 +95,7 @@ not to return until all ongoing NMI handlers exit. It is therefore safe
95to free up the handler's data as soon as synchronize_sched() returns. 95to free up the handler's data as soon as synchronize_sched() returns.
96 96
97Important note: for this to work, the architecture in question must 97Important note: for this to work, the architecture in question must
98invoke nmi_enter() and nmi_exit() on NMI entry and exit, respectively. 98invoke irq_enter() and irq_exit() on NMI entry and exit, respectively.
99 99
100 100
101Answer to Quick Quiz 101Answer to Quick Quiz
diff --git a/Documentation/RCU/RTFP.txt b/Documentation/RCU/RTFP.txt
index 7f40c72a9c5..c43460dade0 100644
--- a/Documentation/RCU/RTFP.txt
+++ b/Documentation/RCU/RTFP.txt
@@ -1,10 +1,9 @@
1Read the Fscking Papers! 1Read the F-ing Papers!
2 2
3 3
4This document describes RCU-related publications, and is followed by 4This document describes RCU-related publications, and is followed by
5the corresponding bibtex entries. A number of the publications may 5the corresponding bibtex entries. A number of the publications may
6be found at http://www.rdrop.com/users/paulmck/RCU/. For others, browsers 6be found at http://www.rdrop.com/users/paulmck/RCU/.
7and search engines will usually find what you are looking for.
8 7
9The first thing resembling RCU was published in 1980, when Kung and Lehman 8The first thing resembling RCU was published in 1980, when Kung and Lehman
10[Kung80] recommended use of a garbage collector to defer destruction 9[Kung80] recommended use of a garbage collector to defer destruction
@@ -161,46 +160,19 @@ which Mathieu Desnoyers is now maintaining [MathieuDesnoyers2009URCU]
161[MathieuDesnoyersPhD]. TINY_RCU [PaulEMcKenney2009BloatWatchRCU] made 160[MathieuDesnoyersPhD]. TINY_RCU [PaulEMcKenney2009BloatWatchRCU] made
162its appearance, as did expedited RCU [PaulEMcKenney2009expeditedRCU]. 161its appearance, as did expedited RCU [PaulEMcKenney2009expeditedRCU].
163The problem of resizeable RCU-protected hash tables may now be on a path 162The problem of resizeable RCU-protected hash tables may now be on a path
164to a solution [JoshTriplett2009RPHash]. A few academic researchers are now 163to a solution [JoshTriplett2009RPHash].
165using RCU to solve their parallel problems [HariKannan2009DynamicAnalysisRCU].
166
1672010 produced a simpler preemptible-RCU implementation
168based on TREE_RCU [PaulEMcKenney2010SimpleOptRCU], lockdep-RCU
169[PaulEMcKenney2010LockdepRCU], another resizeable RCU-protected hash
170table [HerbertXu2010RCUResizeHash] (this one consuming more memory,
171but allowing arbitrary changes in hash function, as required for DoS
172avoidance in the networking code), realization of the 2009 RCU-protected
173hash table with atomic node move [JoshTriplett2010RPHash], an update on
174the RCU API [PaulEMcKenney2010RCUAPI].
175
1762011 marked the inclusion of Nick Piggin's fully lockless dentry search
177[LinusTorvalds2011Linux2:6:38:rc1:NPigginVFS], an RCU-protected red-black
178tree using software transactional memory to protect concurrent updates
179(strange, but true!) [PhilHoward2011RCUTMRBTree], yet another variant of
180RCU-protected resizeable hash tables [Triplett:2011:RPHash], the 3.0 RCU
181trainwreck [PaulEMcKenney2011RCU3.0trainwreck], and Neil Brown's "Meet the
182Lockers" LWN article [NeilBrown2011MeetTheLockers].
183
184 164
185Bibtex Entries 165Bibtex Entries
186 166
187@article{Kung80 167@article{Kung80
188,author="H. T. Kung and Q. Lehman" 168,author="H. T. Kung and Q. Lehman"
189,title="Concurrent Manipulation of Binary Search Trees" 169,title="Concurrent Maintenance of Binary Search Trees"
190,Year="1980" 170,Year="1980"
191,Month="September" 171,Month="September"
192,journal="ACM Transactions on Database Systems" 172,journal="ACM Transactions on Database Systems"
193,volume="5" 173,volume="5"
194,number="3" 174,number="3"
195,pages="354-382" 175,pages="354-382"
196,note="Available:
197\url{http://portal.acm.org/citation.cfm?id=320619&dl=GUIDE,}
198[Viewed December 3, 2007]"
199,annotation={
200 Use garbage collector to clean up data after everyone is done with it.
201 .
202 Oldest use of something vaguely resembling RCU that I have found.
203}
204} 176}
205 177
206@techreport{Manber82 178@techreport{Manber82
@@ -212,31 +184,6 @@ Bibtex Entries
212,number="82-01-01" 184,number="82-01-01"
213,month="January" 185,month="January"
214,pages="28" 186,pages="28"
215,annotation={
216 .
217 Superseded by Manber84.
218 .
219 Describes concurrent AVL tree implementation. Uses a
220 garbage-collection mechanism to handle concurrent use and deletion
221 of nodes in the tree, but lacks the summary-of-execution-history
222 concept of read-copy locking.
223 .
224 Keeps full list of processes that were active when a given
225 node was to be deleted, and waits until all such processes have
226 -terminated- before allowing this node to be reused. This is
227 not described in great detail -- one could imagine using process
228 IDs for this if the ID space was large enough that overlapping
229 never occurred.
230 .
231 This restriction makes this algorithm unsuitable for use in
232 systems comprised of long-lived processes. It also produces
233 completely unacceptable overhead in systems with large numbers
234 of processes. Finally, it is specific to AVL trees.
235 .
236 Cites Kung80, so not an independent invention, but the first
237 RCU-like usage that does not rely on an automatic garbage
238 collector.
239}
240} 187}
241 188
242@article{Manber84 189@article{Manber84
@@ -248,74 +195,6 @@ Bibtex Entries
248,volume="9" 195,volume="9"
249,number="3" 196,number="3"
250,pages="439-455" 197,pages="439-455"
251,annotation={
252 Describes concurrent AVL tree implementation. Uses a
253 garbage-collection mechanism to handle concurrent use and deletion
254 of nodes in the tree, but lacks the summary-of-execution-history
255 concept of read-copy locking.
256 .
257 Keeps full list of processes that were active when a given
258 node was to be deleted, and waits until all such processes have
259 -terminated- before allowing this node to be reused. This is
260 not described in great detail -- one could imagine using process
261 IDs for this if the ID space was large enough that overlapping
262 never occurred.
263 .
264 This restriction makes this algorithm unsuitable for use in
265 systems comprised of long-lived processes. It also produces
266 completely unacceptable overhead in systems with large numbers
267 of processes. Finally, it is specific to AVL trees.
268}
269}
270
271@Conference{RichardRashid87a
272,Author="Richard Rashid and Avadis Tevanian and Michael Young and
273David Golub and Robert Baron and David Black and William Bolosky and
274Jonathan Chew"
275,Title="Machine-Independent Virtual Memory Management for Paged
276Uniprocessor and Multiprocessor Architectures"
277,Booktitle="{2\textsuperscript{nd} Symposium on Architectural Support
278for Programming Languages and Operating Systems}"
279,Publisher="Association for Computing Machinery"
280,Month="October"
281,Year="1987"
282,pages="31-39"
283,Address="Palo Alto, CA"
284,note="Available:
285\url{http://www.cse.ucsc.edu/~randal/221/rashid-machvm.pdf}
286[Viewed February 17, 2005]"
287,annotation={
288 Describes lazy TLB flush, where one waits for each CPU to pass
289 through a scheduling-clock interrupt before reusing a given range
290 of virtual address. Does not describe how one determines that
291 all CPUs have in fact taken such an interrupt, though there are
292 no shortage of straightforward methods for accomplishing this.
293 .
294 Note that it does not make sense to just wait a fixed amount of
295 time, since a given CPU might have interrupts disabled for an
296 extended amount of time.
297}
298}
299
300@article{BarbaraLiskov1988ArgusCACM
301,author = {Barbara Liskov}
302,title = {Distributed programming in {Argus}}
303,journal = {Commun. ACM}
304,volume = {31}
305,number = {3}
306,year = {1988}
307,issn = {0001-0782}
308,pages = {300--312}
309,doi = {http://doi.acm.org/10.1145/42392.42399}
310,publisher = {ACM}
311,address = {New York, NY, USA}
312,annotation= {
313 At the top of page 307: "Conflicts with deposits and withdrawals
314 are necessary if the reported total is to be up to date. They
315 could be avoided by having total return a sum that is slightly
316 out of date." Relies on semantics -- approximate numerical
317 values sometimes OK.
318}
319} 198}
320 199
321@techreport{Hennessy89 200@techreport{Hennessy89
@@ -337,13 +216,6 @@ for Programming Languages and Operating Systems}"
337,year="1990" 216,year="1990"
338,number="CS-TR-2222.1" 217,number="CS-TR-2222.1"
339,month="June" 218,month="June"
340,annotation={
341 Concurrent access to skip lists. Has both weak and strong search.
342 Uses concept of ``garbage queue'', but has no real way of cleaning
343 the garbage efficiently.
344 .
345 Appears to be an independent invention of an RCU-like mechanism.
346}
347} 219}
348 220
349@Book{Adams91 221@Book{Adams91
@@ -351,15 +223,20 @@ for Programming Languages and Operating Systems}"
351,title="Concurrent Programming, Principles, and Practices" 223,title="Concurrent Programming, Principles, and Practices"
352,Publisher="Benjamin Cummins" 224,Publisher="Benjamin Cummins"
353,Year="1991" 225,Year="1991"
354,annotation={
355 Has a few paragraphs describing ``chaotic relaxation'', a
356 numerical analysis technique that allows multiprocessors to
357 avoid synchronization overhead by using possibly-stale data.
358 .
359 Seems like this is descended from yet another independent
360 invention of RCU-like function -- but this is restricted
361 in that reclamation is not necessary.
362} 226}
227
228@phdthesis{HMassalinPhD
229,author="H. Massalin"
230,title="Synthesis: An Efficient Implementation of Fundamental Operating
231System Services"
232,school="Columbia University"
233,address="New York, NY"
234,year="1992"
235,annotation="
236 Mondo optimizing compiler.
237 Wait-free stuff.
238 Good advice: defer work to avoid synchronization.
239"
363} 240}
364 241
365@unpublished{Jacobson93 242@unpublished{Jacobson93
@@ -367,13 +244,7 @@ for Programming Languages and Operating Systems}"
367,title="Avoid Read-Side Locking Via Delayed Free" 244,title="Avoid Read-Side Locking Via Delayed Free"
368,year="1993" 245,year="1993"
369,month="September" 246,month="September"
370,note="private communication" 247,note="Verbal discussion"
371,annotation={
372 Use fixed time delay to approximate grace period. Very simple,
373 but subject to random memory corruption under heavy load.
374 .
375 Independent invention of RCU-like mechanism.
376}
377} 248}
378 249
379@Conference{AjuJohn95 250@Conference{AjuJohn95
@@ -385,17 +256,6 @@ for Programming Languages and Operating Systems}"
385,Year="1995" 256,Year="1995"
386,pages="11-23" 257,pages="11-23"
387,Address="New Orleans, LA" 258,Address="New Orleans, LA"
388,note="Available:
389\url{https://www.usenix.org/publications/library/proceedings/neworl/full_papers/john.a}
390[Viewed October 1, 2010]"
391,annotation={
392 Age vnodes out of the cache, and have a fixed time set by a kernel
393 parameter. Not clear that all races were in fact correctly handled.
394 Used a 20-minute time by default, which would most definitely not
395 be suitable during DoS attacks or virus scans.
396 .
397 Apparently independent invention of RCU-like mechanism.
398}
399} 259}
400 260
401@conference{Pu95a, 261@conference{Pu95a,
@@ -441,47 +301,31 @@ Utilizing Execution History and Thread Monitoring"
441,institution="US Patent and Trademark Office" 301,institution="US Patent and Trademark Office"
442,address="Washington, DC" 302,address="Washington, DC"
443,year="1995" 303,year="1995"
444,number="US Patent 5,442,758" 304,number="US Patent 5,442,758 (contributed under GPL)"
445,month="August" 305,month="August"
446,annotation={
447 Describes the parallel RCU infrastructure. Includes NUMA aspect
448 (structure of bitmap can reflect bus structure of computer system).
449 .
450 Another independent invention of an RCU-like mechanism, but the
451 "real" RCU this time!
452}
453} 306}
454 307
455@techreport{Slingwine97 308@techreport{Slingwine97
456,author="John D. Slingwine and Paul E. McKenney" 309,author="John D. Slingwine and Paul E. McKenney"
457,title="Method for Maintaining Data Coherency Using Thread Activity 310,title="Method for maintaining data coherency using thread
458Summaries in a Multicomputer System" 311activity summaries in a multicomputer system"
459,institution="US Patent and Trademark Office" 312,institution="US Patent and Trademark Office"
460,address="Washington, DC" 313,address="Washington, DC"
461,year="1997" 314,year="1997"
462,number="US Patent 5,608,893" 315,number="US Patent 5,608,893 (contributed under GPL)"
463,month="March" 316,month="March"
464,pages="19"
465,annotation={
466 Describes use of RCU to synchronize data between a pair of
467 SMP/NUMA computer systems.
468}
469} 317}
470 318
471@techreport{Slingwine98 319@techreport{Slingwine98
472,author="John D. Slingwine and Paul E. McKenney" 320,author="John D. Slingwine and Paul E. McKenney"
473,title="Apparatus and Method for Achieving Reduced Overhead Mutual 321,title="Apparatus and method for achieving reduced overhead
474Exclusion and Maintaining Coherency in a Multiprocessor System 322mutual exclusion and maintaining coherency in a multiprocessor
475Utilizing Execution History and Thread Monitoring" 323system utilizing execution history and thread monitoring"
476,institution="US Patent and Trademark Office" 324,institution="US Patent and Trademark Office"
477,address="Washington, DC" 325,address="Washington, DC"
478,year="1998" 326,year="1998"
479,number="US Patent 5,727,209" 327,number="US Patent 5,727,209 (contributed under GPL)"
480,month="March" 328,month="March"
481,annotation={
482 Describes doing an atomic update by copying the data item and
483 then substituting it into the data structure.
484}
485} 329}
486 330
487@Conference{McKenney98 331@Conference{McKenney98
@@ -493,15 +337,6 @@ Problems"
493,Year="1998" 337,Year="1998"
494,pages="509-518" 338,pages="509-518"
495,Address="Las Vegas, NV" 339,Address="Las Vegas, NV"
496,note="Available:
497\url{http://www.rdrop.com/users/paulmck/RCU/rclockpdcsproof.pdf}
498[Viewed December 3, 2007]"
499,annotation={
500 Describes and analyzes RCU mechanism in DYNIX/ptx. Describes
501 application to linked list update and log-buffer flushing.
502 Defines 'quiescent state'. Includes both measured and analytic
503 evaluation.
504}
505} 340}
506 341
507@Conference{Gamsa99 342@Conference{Gamsa99
@@ -514,76 +349,18 @@ Operating System Design and Implementation}"
514,Year="1999" 349,Year="1999"
515,pages="87-100" 350,pages="87-100"
516,Address="New Orleans, LA" 351,Address="New Orleans, LA"
517,note="Available:
518\url{http://www.usenix.org/events/osdi99/full_papers/gamsa/gamsa.pdf}
519[Viewed August 30, 2006]"
520,annotation={
521 Use of RCU-like facility in K42/Tornado. Another independent
522 invention of RCU.
523 See especially pages 7-9 (Section 5).
524}
525}
526
527@unpublished{RustyRussell2000a
528,Author="Rusty Russell"
529,Title="Re: modular net drivers"
530,month="June"
531,year="2000"
532,day="23"
533,note="Available:
534\url{http://oss.sgi.com/projects/netdev/archive/2000-06/msg00250.html}
535[Viewed April 10, 2006]"
536,annotation={
537 Proto-RCU proposal from Phil Rumpf and Rusty Russell.
538 Yet another independent invention of RCU.
539 Outline of algorithm to unload modules...
540 .
541 Appeared on net-dev mailing list.
542}
543}
544
545@unpublished{RustyRussell2000b
546,Author="Rusty Russell"
547,Title="Re: modular net drivers"
548,month="June"
549,year="2000"
550,day="24"
551,note="Available:
552\url{http://oss.sgi.com/projects/netdev/archive/2000-06/msg00254.html}
553[Viewed April 10, 2006]"
554,annotation={
555 Proto-RCU proposal from Phil Rumpf and Rusty Russell.
556 .
557 Appeared on net-dev mailing list.
558}
559}
560
561@unpublished{McKenney01b
562,Author="Paul E. McKenney and Dipankar Sarma"
563,Title="Read-Copy Update Mutual Exclusion in {Linux}"
564,month="February"
565,year="2001"
566,note="Available:
567\url{http://lse.sourceforge.net/locking/rcu/rcupdate_doc.html}
568[Viewed October 18, 2004]"
569,annotation={
570 Prototypical Linux documentation for RCU.
571}
572} 352}
573 353
574@techreport{Slingwine01 354@techreport{Slingwine01
575,author="John D. Slingwine and Paul E. McKenney" 355,author="John D. Slingwine and Paul E. McKenney"
576,title="Apparatus and Method for Achieving Reduced Overhead Mutual 356,title="Apparatus and method for achieving reduced overhead
577Exclusion and Maintaining Coherency in a Multiprocessor System 357mutual exclusion and maintaining coherency in a multiprocessor
578Utilizing Execution History and Thread Monitoring" 358system utilizing execution history and thread monitoring"
579,institution="US Patent and Trademark Office" 359,institution="US Patent and Trademark Office"
580,address="Washington, DC" 360,address="Washington, DC"
581,year="2001" 361,year="2001"
582,number="US Patent 6,219,690" 362,number="US Patent 5,219,690 (contributed under GPL)"
583,month="April" 363,month="April"
584,annotation={
585 'Change in mode' aspect of RCU. Can be thought of as a lazy barrier.
586}
587} 364}
588 365
589@Conference{McKenney01a 366@Conference{McKenney01a
@@ -595,61 +372,14 @@ Orran Krieger and Rusty Russell and Dipankar Sarma and Maneesh Soni"
595,Year="2001" 372,Year="2001"
596,note="Available: 373,note="Available:
597\url{http://www.linuxsymposium.org/2001/abstracts/readcopy.php} 374\url{http://www.linuxsymposium.org/2001/abstracts/readcopy.php}
598\url{http://www.rdrop.com/users/paulmck/RCU/rclock_OLS.2001.05.01c.pdf} 375\url{http://www.rdrop.com/users/paulmck/rclock/rclock_OLS.2001.05.01c.pdf}
599[Viewed June 23, 2004]" 376[Viewed June 23, 2004]"
600,annotation={ 377annotation="
601 Described RCU, and presented some patches implementing and using 378Described RCU, and presented some patches implementing and using it in
602 it in the Linux kernel. 379the Linux kernel.
603}
604}
605
606@unpublished{McKenney01f
607,Author="Paul E. McKenney"
608,Title="{RFC:} patch to allow lock-free traversal of lists with insertion"
609,month="October"
610,year="2001"
611,note="Available:
612\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=100259266316456&w=2}
613[Viewed June 23, 2004]"
614,annotation="
615 Memory-barrier and Alpha thread. 100 messages, not too bad...
616"
617}
618
619@unpublished{Spraul01
620,Author="Manfred Spraul"
621,Title="Re: {RFC:} patch to allow lock-free traversal of lists with insertion"
622,month="October"
623,year="2001"
624,note="Available:
625\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=100264675012867&w=2}
626[Viewed June 23, 2004]"
627,annotation="
628 Suggested burying memory barriers in Linux's list-manipulation
629 primitives.
630" 380"
631} 381}
632 382
633@unpublished{LinusTorvalds2001a
634,Author="Linus Torvalds"
635,Title="{Re:} {[Lse-tech]} {Re:} {RFC:} patch to allow lock-free traversal of lists with insertion"
636,month="October"
637,year="2001"
638,note="Available:
639\url{http://lkml.org/lkml/2001/10/13/105}
640[Viewed August 21, 2004]"
641}
642
643@unpublished{Blanchard02a
644,Author="Anton Blanchard"
645,Title="some RCU dcache and ratcache results"
646,month="March"
647,year="2002"
648,note="Available:
649\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=101637107412972&w=2}
650[Viewed October 18, 2004]"
651}
652
653@Conference{Linder02a 383@Conference{Linder02a
654,Author="Hanna Linder and Dipankar Sarma and Maneesh Soni" 384,Author="Hanna Linder and Dipankar Sarma and Maneesh Soni"
655,Title="Scalability of the Directory Entry Cache" 385,Title="Scalability of the Directory Entry Cache"
@@ -657,10 +387,6 @@ Orran Krieger and Rusty Russell and Dipankar Sarma and Maneesh Soni"
657,Month="June" 387,Month="June"
658,Year="2002" 388,Year="2002"
659,pages="289-300" 389,pages="289-300"
660,annotation="
661 Measured scalability of Linux 2.4 kernel's directory-entry cache
662 (dcache), and measured some scalability enhancements.
663"
664} 390}
665 391
666@Conference{McKenney02a 392@Conference{McKenney02a
@@ -674,76 +400,49 @@ Andrea Arcangeli and Andi Kleen and Orran Krieger and Rusty Russell"
674,note="Available: 400,note="Available:
675\url{http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz} 401\url{http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}
676[Viewed June 23, 2004]" 402[Viewed June 23, 2004]"
677,annotation="
678 Presented and compared a number of RCU implementations for the
679 Linux kernel.
680"
681} 403}
682 404
683@unpublished{Sarma02a 405@conference{Michael02a
684,Author="Dipankar Sarma" 406,author="Maged M. Michael"
685,Title="specweb99: dcache scalability results" 407,title="Safe Memory Reclamation for Dynamic Lock-Free Objects Using Atomic
686,month="July" 408Reads and Writes"
687,year="2002" 409,Year="2002"
688,note="Available: 410,Month="August"
689\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=102645767914212&w=2} 411,booktitle="{Proceedings of the 21\textsuperscript{st} Annual ACM
690[Viewed June 23, 2004]" 412Symposium on Principles of Distributed Computing}"
413,pages="21-30"
691,annotation=" 414,annotation="
692 Compare fastwalk and RCU for dcache. RCU won. 415 Each thread keeps an array of pointers to items that it is
416 currently referencing. Sort of an inside-out garbage collection
417 mechanism, but one that requires the accessing code to explicitly
418 state its needs. Also requires read-side memory barriers on
419 most architectures.
693" 420"
694} 421}
695 422
696@unpublished{Barbieri02 423@conference{Michael02b
697,Author="Luca Barbieri" 424,author="Maged M. Michael"
698,Title="Re: {[PATCH]} Initial support for struct {vfs\_cred}" 425,title="High Performance Dynamic Lock-Free Hash Tables and List-Based Sets"
699,month="August" 426,Year="2002"
700,year="2002" 427,Month="August"
701,note="Available: 428,booktitle="{Proceedings of the 14\textsuperscript{th} Annual ACM
702\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=103082050621241&w=2} 429Symposium on Parallel
703[Viewed: June 23, 2004]" 430Algorithms and Architecture}"
431,pages="73-82"
704,annotation=" 432,annotation="
705 Suggested RCU for vfs\_shared\_cred. 433 Like the title says...
706" 434"
707} 435}
708 436
709@unpublished{Dickins02a 437@InProceedings{HerlihyLM02
710,author="Hugh Dickins" 438,author={Maurice Herlihy and Victor Luchangco and Mark Moir}
711,title="Use RCU for System-V IPC" 439,title="The Repeat Offender Problem: A Mechanism for Supporting Dynamic-Sized,
712,year="2002" 440Lock-Free Data Structures"
713,month="October" 441,booktitle={Proceedings of 16\textsuperscript{th} International
714,note="private communication" 442Symposium on Distributed Computing}
715} 443,year=2002
716
717@unpublished{Sarma02b
718,Author="Dipankar Sarma"
719,Title="Some dcache\_rcu benchmark numbers"
720,month="October" 444,month="October"
721,year="2002" 445,pages="339-353"
722,note="Available:
723\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=103462075416638&w=2}
724[Viewed June 23, 2004]"
725,annotation="
726 Performance of dcache RCU on kernbench for 16x NUMA-Q and 1x,
727 2x, and 4x systems. RCU does no harm, and helps on 16x.
728"
729}
730
731@unpublished{LinusTorvalds2003a
732,Author="Linus Torvalds"
733,Title="Re: {[PATCH]} small fixes in brlock.h"
734,month="March"
735,year="2003"
736,note="Available:
737\url{http://lkml.org/lkml/2003/3/9/205}
738[Viewed March 13, 2006]"
739,annotation="
740 Linus suggests replacing brlock with RCU and/or seqlocks:
741 .
742 'It's entirely possible that the current user could be replaced
743 by RCU and/or seqlocks, and we could get rid of brlocks entirely.'
744 .
745 Steve Hemminger responds by replacing them with RCU.
746"
747} 446}
748 447
749@article{Appavoo03a 448@article{Appavoo03a
@@ -758,20 +457,6 @@ B. Rosenburg and M. Stumm and J. Xenidis"
758,volume="42" 457,volume="42"
759,number="1" 458,number="1"
760,pages="60-76" 459,pages="60-76"
761,annotation="
762 Use of RCU to enable hot-swapping for autonomic behavior in K42.
763"
764}
765
766@unpublished{Seigh03
767,author="Joseph W. {Seigh II}"
768,title="Read Copy Update"
769,Year="2003"
770,Month="March"
771,note="email correspondence"
772,annotation="
773 Described the relationship of the VM/XA passive serialization to RCU.
774"
775} 460}
776 461
777@Conference{Arcangeli03 462@Conference{Arcangeli03
@@ -785,27 +470,6 @@ Dipankar Sarma"
785,year="2003" 470,year="2003"
786,month="June" 471,month="June"
787,pages="297-310" 472,pages="297-310"
788,note="Available:
789\url{http://www.rdrop.com/users/paulmck/RCU/rcu.FREENIX.2003.06.14.pdf}
790[Viewed November 21, 2007]"
791,annotation="
792 Compared updated RCU implementations for the Linux kernel, and
793 described System V IPC use of RCU, including order-of-magnitude
794 performance improvements.
795"
796}
797
798@Conference{Soules03a
799,Author="Craig A. N. Soules and Jonathan Appavoo and Kevin Hui and
800Dilma {Da Silva} and Gregory R. Ganger and Orran Krieger and
801Michael Stumm and Robert W. Wisniewski and Marc Auslander and
802Michal Ostrowski and Bryan Rosenburg and Jimi Xenidis"
803,Title="System Support for Online Reconfiguration"
804,Booktitle="Proceedings of the 2003 USENIX Annual Technical Conference"
805,Publisher="USENIX Association"
806,year="2003"
807,month="June"
808,pages="141-154"
809} 473}
810 474
811@article{McKenney03a 475@article{McKenney03a
@@ -817,22 +481,6 @@ Michal Ostrowski and Bryan Rosenburg and Jimi Xenidis"
817,volume="1" 481,volume="1"
818,number="114" 482,number="114"
819,pages="18-26" 483,pages="18-26"
820,note="Available:
821\url{http://www.linuxjournal.com/article/6993}
822[Viewed November 14, 2007]"
823,annotation="
824 Reader-friendly intro to RCU, with the infamous old-man-and-brat
825 cartoon.
826"
827}
828
829@unpublished{Sarma03a
830,Author="Dipankar Sarma"
831,Title="RCU low latency patches"
832,month="December"
833,year="2003"
834,note="Message ID: 20031222180114.GA2248@in.ibm.com"
835,annotation="dipankar/ct.2004.03.27/RCUll.2003.12.22.patch"
836} 484}
837 485
838@techreport{Friedberg03a 486@techreport{Friedberg03a
@@ -841,14 +489,9 @@ Michal Ostrowski and Bryan Rosenburg and Jimi Xenidis"
841,institution="US Patent and Trademark Office" 489,institution="US Patent and Trademark Office"
842,address="Washington, DC" 490,address="Washington, DC"
843,year="2003" 491,year="2003"
844,number="US Patent 6,662,184" 492,number="US Patent 6,662,184 (contributed under GPL)"
845,month="December" 493,month="December"
846,pages="112" 494,pages="112"
847,annotation="
848 Applies RCU to a wildcard-search Patricia tree in order to permit
849 synchronization-free lookup. RCU is used to retain removed nodes
850 for a grace period before freeing them.
851"
852} 495}
853 496
854@article{McKenney04a 497@article{McKenney04a
@@ -860,12 +503,6 @@ Michal Ostrowski and Bryan Rosenburg and Jimi Xenidis"
860,volume="1" 503,volume="1"
861,number="118" 504,number="118"
862,pages="38-46" 505,pages="38-46"
863,note="Available:
864\url{http://www.linuxjournal.com/node/7124}
865[Viewed December 26, 2010]"
866,annotation="
867 Reader friendly intro to dcache and RCU.
868"
869} 506}
870 507
871@Conference{McKenney04b 508@Conference{McKenney04b
@@ -877,83 +514,8 @@ Michal Ostrowski and Bryan Rosenburg and Jimi Xenidis"
877,Address="Adelaide, Australia" 514,Address="Adelaide, Australia"
878,note="Available: 515,note="Available:
879\url{http://www.linux.org.au/conf/2004/abstracts.html#90} 516\url{http://www.linux.org.au/conf/2004/abstracts.html#90}
880\url{http://www.rdrop.com/users/paulmck/RCU/lockperf.2004.01.17a.pdf} 517\url{http://www.rdrop.com/users/paulmck/rclock/lockperf.2004.01.17a.pdf}
881[Viewed June 23, 2004]" 518[Viewed June 23, 2004]"
882,annotation="
883 Compares performance of RCU to that of other locking primitives
884 over a number of CPUs (x86, Opteron, Itanium, and PPC).
885"
886}
887
888@unpublished{Sarma04a
889,Author="Dipankar Sarma"
890,Title="{[PATCH]} {RCU} for low latency (experimental)"
891,month="March"
892,year="2004"
893,note="\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=108003746402892&w=2}"
894,annotation="Head of thread: dipankar/2004.03.23/rcu-low-lat.1.patch"
895}
896
897@unpublished{Sarma04b
898,Author="Dipankar Sarma"
899,Title="Re: {[PATCH]} {RCU} for low latency (experimental)"
900,month="March"
901,year="2004"
902,note="\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=108016474829546&w=2}"
903,annotation="dipankar/rcuth.2004.03.24/rcu-throttle.patch"
904}
905
906@unpublished{Spraul04a
907,Author="Manfred Spraul"
908,Title="[RFC] 0/5 rcu lock update"
909,month="May"
910,year="2004"
911,note="Available:
912\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=108546407726602&w=2}
913[Viewed June 23, 2004]"
914,annotation="
915 Hierarchical-bitmap patch for RCU infrastructure.
916"
917}
918
919@unpublished{Steiner04a
920,Author="Jack Steiner"
921,Title="Re: [Lse-tech] [RFC, PATCH] 1/5 rcu lock update:
922Add per-cpu batch counter"
923,month="May"
924,year="2004"
925,note="Available:
926\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=108551764515332&w=2}
927[Viewed June 23, 2004]"
928,annotation={
929 RCU runs reasonably on a 512-CPU SGI using Manfred Spraul's patches,
930 which may be found at:
931 https://lkml.org/lkml/2004/5/20/49 (split vars into cachelines)
932 https://lkml.org/lkml/2004/5/22/114 (cpu_quiet() patch)
933 https://lkml.org/lkml/2004/5/25/24 (0/5)
934 https://lkml.org/lkml/2004/5/25/23 (1/5)
935 https://lkml.org/lkml/2004/5/25/265 (works for Jack)
936 https://lkml.org/lkml/2004/5/25/20 (2/5)
937 https://lkml.org/lkml/2004/5/25/22 (3/5)
938 https://lkml.org/lkml/2004/5/25/19 (4/5)
939 https://lkml.org/lkml/2004/5/25/21 (5/5)
940}
941}
942
943@Conference{Sarma04c
944,Author="Dipankar Sarma and Paul E. McKenney"
945,Title="Making {RCU} Safe for Deep Sub-Millisecond Response
946Realtime Applications"
947,Booktitle="Proceedings of the 2004 USENIX Annual Technical Conference
948(FREENIX Track)"
949,Publisher="USENIX Association"
950,year="2004"
951,month="June"
952,pages="182-191"
953,annotation="
954 Describes and compares a number of modifications to the Linux RCU
955 implementation that make it friendly to realtime applications.
956"
957} 519}
958 520
959@phdthesis{PaulEdwardMcKenneyPhD 521@phdthesis{PaulEdwardMcKenneyPhD
@@ -967,118 +529,17 @@ Oregon Health and Sciences University"
967,note="Available: 529,note="Available:
968\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf} 530\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf}
969[Viewed October 15, 2004]" 531[Viewed October 15, 2004]"
970,annotation="
971 Describes RCU implementations and presents design patterns
972 corresponding to common uses of RCU in several operating-system
973 kernels.
974"
975}
976
977@unpublished{PaulEMcKenney2004rcu:dereference
978,Author="Dipankar Sarma"
979,Title="{Re: RCU : Abstracted RCU dereferencing [5/5]}"
980,month="August"
981,year="2004"
982,note="Available:
983\url{http://lkml.org/lkml/2004/8/6/237}
984[Viewed June 8, 2010]"
985,annotation="
986 Introduce rcu_dereference().
987"
988}
989
990@unpublished{JimHouston04a
991,Author="Jim Houston"
992,Title="{[RFC\&PATCH] Alternative {RCU} implementation}"
993,month="August"
994,year="2004"
995,note="Available:
996\url{http://lkml.org/lkml/2004/8/30/87}
997[Viewed February 17, 2005]"
998,annotation="
999 Uses active code in rcu_read_lock() and rcu_read_unlock() to
1000 make RCU happen, allowing RCU to function on CPUs that do not
1001 receive a scheduling-clock interrupt.
1002"
1003}
1004
1005@unpublished{TomHart04a
1006,Author="Thomas E. Hart"
1007,Title="Master's Thesis: Applying Lock-free Techniques to the {Linux} Kernel"
1008,month="October"
1009,year="2004"
1010,note="Available:
1011\url{http://www.cs.toronto.edu/~tomhart/masters_thesis.html}
1012[Viewed October 15, 2004]"
1013,annotation="
1014 Proposes comparing RCU to lock-free methods for the Linux kernel.
1015"
1016}
1017
1018@unpublished{Vaddagiri04a
1019,Author="Srivatsa Vaddagiri"
1020,Title="Subject: [RFC] Use RCU for tcp\_ehash lookup"
1021,month="October"
1022,year="2004"
1023,note="Available:
1024\url{http://marc.theaimsgroup.com/?t=109395731700004&r=1&w=2}
1025[Viewed October 18, 2004]"
1026,annotation="
1027 Srivatsa's RCU patch for tcp_ehash lookup.
1028"
1029} 532}
1030 533
1031@unpublished{Thirumalai04a 534@Conference{Sarma04c
1032,Author="Ravikiran Thirumalai" 535,Author="Dipankar Sarma and Paul E. McKenney"
1033,Title="Subject: [patchset] Lockfree fd lookup 0 of 5" 536,Title="Making RCU Safe for Deep Sub-Millisecond Response Realtime Applications"
1034,month="October" 537,Booktitle="Proceedings of the 2004 USENIX Annual Technical Conference
1035,year="2004" 538(FREENIX Track)"
1036,note="Available: 539,Publisher="USENIX Association"
1037\url{http://marc.theaimsgroup.com/?t=109144217400003&r=1&w=2}
1038[Viewed October 18, 2004]"
1039,annotation="
1040 Ravikiran's lockfree FD patch.
1041"
1042}
1043
1044@unpublished{Thirumalai04b
1045,Author="Ravikiran Thirumalai"
1046,Title="Subject: Re: [patchset] Lockfree fd lookup 0 of 5"
1047,month="October"
1048,year="2004"
1049,note="Available:
1050\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=109152521410459&w=2}
1051[Viewed October 18, 2004]"
1052,annotation="
1053 Ravikiran's lockfree FD patch.
1054"
1055}
1056
1057@unpublished{PaulEMcKenney2004rcu:assign:pointer
1058,Author="Paul E. McKenney"
1059,Title="{[PATCH 1/3] RCU: \url{rcu_assign_pointer()} removal of memory barriers}"
1060,month="October"
1061,year="2004"
1062,note="Available:
1063\url{http://lkml.org/lkml/2004/10/23/241}
1064[Viewed June 8, 2010]"
1065,annotation="
1066 Introduce rcu_assign_pointer().
1067"
1068}
1069
1070@unpublished{JamesMorris04a
1071,Author="James Morris"
1072,Title="{[PATCH 2/3] SELinux} scalability - convert {AVC} to {RCU}"
1073,day="15"
1074,month="November"
1075,year="2004" 540,year="2004"
1076,note="Available: 541,month="June"
1077\url{http://marc.theaimsgroup.com/?l=linux-kernel&m=110054979416004&w=2} 542,pages="182-191"
1078[Viewed December 10, 2004]"
1079,annotation="
1080 James Morris posts Kaigai Kohei's patch to LKML.
1081"
1082} 543}
1083 544
1084@unpublished{JamesMorris04b 545@unpublished{JamesMorris04b
@@ -1089,85 +550,6 @@ Oregon Health and Sciences University"
1089,note="Available: 550,note="Available:
1090\url{http://www.livejournal.com/users/james_morris/2153.html} 551\url{http://www.livejournal.com/users/james_morris/2153.html}
1091[Viewed December 10, 2004]" 552[Viewed December 10, 2004]"
1092,annotation="
1093 RCU helps SELinux performance. ;-) Made LWN.
1094"
1095}
1096
1097@unpublished{PaulMcKenney2005RCUSemantics
1098,Author="Paul E. McKenney and Jonathan Walpole"
1099,Title="{RCU} Semantics: A First Attempt"
1100,month="January"
1101,year="2005"
1102,day="30"
1103,note="Available:
1104\url{http://www.rdrop.com/users/paulmck/RCU/rcu-semantics.2005.01.30a.pdf}
1105[Viewed December 6, 2009]"
1106,annotation="
1107 Early derivation of RCU semantics.
1108"
1109}
1110
1111@unpublished{PaulMcKenney2005e
1112,Author="Paul E. McKenney"
1113,Title="Real-Time Preemption and {RCU}"
1114,month="March"
1115,year="2005"
1116,day="17"
1117,note="Available:
1118\url{http://lkml.org/lkml/2005/3/17/199}
1119[Viewed September 5, 2005]"
1120,annotation="
1121 First posting showing how RCU can be safely adapted for
1122 preemptable RCU read side critical sections.
1123"
1124}
1125
1126@unpublished{EsbenNeilsen2005a
1127,Author="Esben Neilsen"
1128,Title="Re: Real-Time Preemption and {RCU}"
1129,month="March"
1130,year="2005"
1131,day="18"
1132,note="Available:
1133\url{http://lkml.org/lkml/2005/3/18/122}
1134[Viewed March 30, 2006]"
1135,annotation="
1136 Esben Neilsen suggests read-side suppression of grace-period
1137 processing for crude-but-workable realtime RCU. The downside
1138 is indefinite grace periods...But this is OK for experimentation
1139 and testing.
1140"
1141}
1142
1143@unpublished{TomHart05a
1144,Author="Thomas E. Hart and Paul E. McKenney and Angela Demke Brown"
1145,Title="Efficient Memory Reclamation is Necessary for Fast Lock-Free
1146Data Structures"
1147,month="March"
1148,year="2005"
1149,note="Available:
1150\url{ftp://ftp.cs.toronto.edu/csrg-technical-reports/515/}
1151[Viewed March 4, 2005]"
1152,annotation="
1153 Comparison of RCU, QBSR, and EBSR. RCU wins for read-mostly
1154 workloads. ;-)
1155"
1156}
1157
1158@unpublished{JonCorbet2005DeprecateSyncKernel
1159,Author="Jonathan Corbet"
1160,Title="API change: synchronize_kernel() deprecated"
1161,month="May"
1162,day="3"
1163,year="2005"
1164,note="Available:
1165\url{http://lwn.net/Articles/134484/}
1166[Viewed May 3, 2005]"
1167,annotation="
1168 Jon Corbet describes deprecation of synchronize_kernel()
1169 in favor of synchronize_rcu() and synchronize_sched().
1170"
1171} 553}
1172 554
1173@unpublished{PaulMcKenney05a 555@unpublished{PaulMcKenney05a
@@ -1186,7 +568,7 @@ Data Structures"
1186 568
1187@conference{PaulMcKenney05b 569@conference{PaulMcKenney05b
1188,Author="Paul E. McKenney and Dipankar Sarma" 570,Author="Paul E. McKenney and Dipankar Sarma"
1189,Title="Towards Hard Realtime Response from the {Linux} Kernel on {SMP} Hardware" 571,Title="Towards Hard Realtime Response from the Linux Kernel on SMP Hardware"
1190,Booktitle="linux.conf.au 2005" 572,Booktitle="linux.conf.au 2005"
1191,month="April" 573,month="April"
1192,year="2005" 574,year="2005"
@@ -1196,103 +578,6 @@ Data Structures"
1196[Viewed May 13, 2005]" 578[Viewed May 13, 2005]"
1197,annotation=" 579,annotation="
1198 Realtime turns into making RCU yet more realtime friendly. 580 Realtime turns into making RCU yet more realtime friendly.
1199 http://lca2005.linux.org.au/Papers/Paul%20McKenney/Towards%20Hard%20Realtime%20Response%20from%20the%20Linux%20Kernel/LKS.2005.04.22a.pdf
1200"
1201}
1202
1203@unpublished{PaulEMcKenneyHomePage
1204,Author="Paul E. McKenney"
1205,Title="{Paul} {E.} {McKenney}"
1206,month="May"
1207,year="2005"
1208,note="Available:
1209\url{http://www.rdrop.com/users/paulmck/}
1210[Viewed May 25, 2005]"
1211,annotation="
1212 Paul McKenney's home page.
1213"
1214}
1215
1216@unpublished{PaulEMcKenneyRCUPage
1217,Author="Paul E. McKenney"
1218,Title="Read-Copy Update {(RCU)}"
1219,month="May"
1220,year="2005"
1221,note="Available:
1222\url{http://www.rdrop.com/users/paulmck/RCU}
1223[Viewed May 25, 2005]"
1224,annotation="
1225 Paul McKenney's RCU page.
1226"
1227}
1228
1229@unpublished{JosephSeigh2005a
1230,Author="Joseph Seigh"
1231,Title="{RCU}+{SMR} (hazard pointers)"
1232,month="July"
1233,year="2005"
1234,note="Personal communication"
1235,annotation="
1236 Joe Seigh announcing his atomic-ptr-plus project.
1237 http://sourceforge.net/projects/atomic-ptr-plus/
1238"
1239}
1240
1241@unpublished{JosephSeigh2005b
1242,Author="Joseph Seigh"
1243,Title="Lock-free synchronization primitives"
1244,month="July"
1245,day="6"
1246,year="2005"
1247,note="Available:
1248\url{http://sourceforge.net/projects/atomic-ptr-plus/}
1249[Viewed August 8, 2005]"
1250,annotation="
1251 Joe Seigh's atomic-ptr-plus project.
1252"
1253}
1254
1255@unpublished{PaulMcKenney2005c
1256,Author="Paul E.McKenney"
1257,Title="{[RFC,PATCH] RCU} and {CONFIG\_PREEMPT\_RT} sane patch"
1258,month="August"
1259,day="1"
1260,year="2005"
1261,note="Available:
1262\url{http://lkml.org/lkml/2005/8/1/155}
1263[Viewed March 14, 2006]"
1264,annotation="
1265 First operating counter-based realtime RCU patch posted to LKML.
1266"
1267}
1268
1269@unpublished{PaulMcKenney2005d
1270,Author="Paul E. McKenney"
1271,Title="Re: [Fwd: Re: [patch] Real-Time Preemption, -RT-2.6.13-rc4-V0.7.52-01]"
1272,month="August"
1273,day="8"
1274,year="2005"
1275,note="Available:
1276\url{http://lkml.org/lkml/2005/8/8/108}
1277[Viewed March 14, 2006]"
1278,annotation="
1279 First operating counter-based realtime RCU patch posted to LKML,
1280 but fixed so that various unusual combinations of configuration
1281 parameters all function properly.
1282"
1283}
1284
1285@unpublished{PaulMcKenney2005rcutorture
1286,Author="Paul E. McKenney"
1287,Title="{[PATCH]} {RCU} torture testing"
1288,month="October"
1289,day="1"
1290,year="2005"
1291,note="Available:
1292\url{http://lkml.org/lkml/2005/10/1/70}
1293[Viewed March 14, 2006]"
1294,annotation="
1295 First rcutorture patch.
1296" 581"
1297} 582}
1298 583
@@ -1306,39 +591,22 @@ Distributed Processing Symposium"
1306,year="2006" 591,year="2006"
1307,day="25-29" 592,day="25-29"
1308,address="Rhodes, Greece" 593,address="Rhodes, Greece"
1309,note="Available:
1310\url{http://www.rdrop.com/users/paulmck/RCU/hart_ipdps06.pdf}
1311[Viewed April 28, 2008]"
1312,annotation="
1313 Compares QSBR, HPBR, EBR, and lock-free reference counting.
1314 http://www.cs.toronto.edu/~tomhart/perflab/ipdps06.tgz
1315"
1316}
1317
1318@unpublished{NickPiggin2006radixtree
1319,Author="Nick Piggin"
1320,Title="[patch 3/3] radix-tree: {RCU} lockless readside"
1321,month="June"
1322,day="20"
1323,year="2006"
1324,note="Available:
1325\url{http://lkml.org/lkml/2006/6/20/238}
1326[Viewed March 25, 2008]"
1327,annotation=" 594,annotation="
1328 RCU-protected radix tree. 595 Compares QSBR (AKA "classic RCU"), HPBR, EBR, and lock-free
596 reference counting.
1329" 597"
1330} 598}
1331 599
1332@Conference{PaulEMcKenney2006b 600@Conference{PaulEMcKenney2006b
1333,Author="Paul E. McKenney and Dipankar Sarma and Ingo Molnar and 601,Author="Paul E. McKenney and Dipankar Sarma and Ingo Molnar and
1334Suparna Bhattacharya" 602Suparna Bhattacharya"
1335,Title="Extending {RCU} for Realtime and Embedded Workloads" 603,Title="Extending RCU for Realtime and Embedded Workloads"
1336,Booktitle="{Ottawa Linux Symposium}" 604,Booktitle="{Ottawa Linux Symposium}"
1337,Month="July" 605,Month="July"
1338,Year="2006" 606,Year="2006"
1339,pages="v2 123-138" 607,pages="v2 123-138"
1340,note="Available: 608,note="Available:
1341\url{http://www.linuxsymposium.org/2006/view_abstract.php?content_key=184} 609\url{http://www.linuxsymposium.org/2006/index_2006.php}
1342\url{http://www.rdrop.com/users/paulmck/RCU/OLSrtRCU.2006.08.11a.pdf} 610\url{http://www.rdrop.com/users/paulmck/RCU/OLSrtRCU.2006.08.11a.pdf}
1343[Viewed January 1, 2007]" 611[Viewed January 1, 2007]"
1344,annotation=" 612,annotation="
@@ -1346,37 +614,6 @@ Suparna Bhattacharya"
1346" 614"
1347} 615}
1348 616
1349@unpublished{WikipediaRCU
1350,Author="Paul E. McKenney and Chris Purcell and Algae and Ben Schumin and
1351Gaius Cornelius and Qwertyus and Neil Conway and Sbw and Blainster and
1352Canis Rufus and Zoicon5 and Anome and Hal Eisen"
1353,Title="Read-Copy Update"
1354,month="July"
1355,day="8"
1356,year="2006"
1357,note="Available:
1358\url{http://en.wikipedia.org/wiki/Read-copy-update}
1359[Viewed August 21, 2006]"
1360,annotation="
1361 Wikipedia RCU page as of July 8 2006.
1362"
1363}
1364
1365@Conference{NickPiggin2006LocklessPageCache
1366,Author="Nick Piggin"
1367,Title="A Lockless Pagecache in Linux---Introduction, Progress, Performance"
1368,Booktitle="{Ottawa Linux Symposium}"
1369,Month="July"
1370,Year="2006"
1371,pages="v2 249-254"
1372,note="Available:
1373\url{http://www.linuxsymposium.org/2006/view_abstract.php?content_key=184}
1374[Viewed January 11, 2009]"
1375,annotation="
1376 Uses RCU-protected radix tree for a lockless page cache.
1377"
1378}
1379
1380@unpublished{PaulEMcKenney2006c 617@unpublished{PaulEMcKenney2006c
1381,Author="Paul E. McKenney" 618,Author="Paul E. McKenney"
1382,Title="Sleepable {RCU}" 619,Title="Sleepable {RCU}"
@@ -1400,301 +637,29 @@ Revised:
1400,day="18" 637,day="18"
1401,year="2006" 638,year="2006"
1402,note="Available: 639,note="Available:
1403\url{http://www.nada.kth.se/~snilsson/publications/TRASH/trash.pdf} 640\url{http://www.nada.kth.se/~snilsson/public/papers/trash/trash.pdf}
1404[Viewed March 4, 2011]" 641[Viewed February 24, 2007]"
1405,annotation="
1406 RCU-protected dynamic trie-hash combination.
1407"
1408}
1409
1410@unpublished{ChristophHellwig2006RCU2SRCU
1411,Author="Christoph Hellwig"
1412,Title="Re: {[-mm PATCH 1/4]} {RCU}: split classic rcu"
1413,month="September"
1414,day="28"
1415,year="2006"
1416,note="Available:
1417\url{http://lkml.org/lkml/2006/9/28/160}
1418[Viewed March 27, 2008]"
1419}
1420
1421@unpublished{PaulEMcKenneyRCUusagePage
1422,Author="Paul E. McKenney"
1423,Title="{RCU} {Linux} Usage"
1424,month="October"
1425,year="2006"
1426,note="Available:
1427\url{http://www.rdrop.com/users/paulmck/RCU/linuxusage.html}
1428[Viewed January 14, 2007]"
1429,annotation="
1430 Paul McKenney's RCU page showing graphs plotting Linux-kernel
1431 usage of RCU.
1432"
1433}
1434
1435@unpublished{PaulEMcKenneyRCUusageRawDataPage
1436,Author="Paul E. McKenney"
1437,Title="Read-Copy Update {(RCU)} Usage in {Linux} Kernel"
1438,month="October"
1439,year="2006"
1440,note="Available:
1441\url{http://www.rdrop.com/users/paulmck/RCU/linuxusage/rculocktab.html}
1442[Viewed January 14, 2007]"
1443,annotation="
1444 Paul McKenney's RCU page showing Linux usage of RCU in tabular
1445 form, with links to corresponding cscope databases.
1446"
1447}
1448
1449@unpublished{GauthamShenoy2006RCUrwlock
1450,Author="Gautham R. Shenoy"
1451,Title="[PATCH 4/5] lock\_cpu\_hotplug: Redesign - Lightweight implementation of lock\_cpu\_hotplug"
1452,month="October"
1453,year="2006"
1454,day=26
1455,note="Available:
1456\url{http://lkml.org/lkml/2006/10/26/73}
1457[Viewed January 26, 2009]"
1458,annotation="
1459 RCU-based reader-writer lock that allows readers to proceed with
1460 no memory barriers or atomic instruction in absence of writers.
1461 If writer do show up, readers must of course wait as required by
1462 the semantics of reader-writer locking. This is a recursive
1463 lock.
1464"
1465}
1466
1467@unpublished{JensAxboe2006SlowSRCU
1468,Author="Jens Axboe"
1469,Title="Re: [patch] cpufreq: mark \url{cpufreq_tsc()} as
1470\url{core_initcall_sync}"
1471,month="November"
1472,year="2006"
1473,day=17
1474,note="Available:
1475\url{http://lkml.org/lkml/2006/11/17/56}
1476[Viewed May 28, 2007]"
1477,annotation="
1478 SRCU's grace periods are too slow for Jens, even after a
1479 factor-of-three speedup.
1480 Sped-up version of SRCU at http://lkml.org/lkml/2006/11/17/359.
1481"
1482}
1483
1484@unpublished{OlegNesterov2006QRCU
1485,Author="Oleg Nesterov"
1486,Title="Re: [patch] cpufreq: mark {\tt cpufreq\_tsc()} as
1487{\tt core\_initcall\_sync}"
1488,month="November"
1489,year="2006"
1490,day=19
1491,note="Available:
1492\url{http://lkml.org/lkml/2006/11/19/69}
1493[Viewed May 28, 2007]"
1494,annotation="
1495 First cut of QRCU. Expanded/corrected versions followed.
1496 Used to be OlegNesterov2007QRCU, now time-corrected.
1497"
1498}
1499
1500@unpublished{OlegNesterov2006aQRCU
1501,Author="Oleg Nesterov"
1502,Title="Re: [RFC, PATCH 1/2] qrcu: {"quick"} srcu implementation"
1503,month="November"
1504,year="2006"
1505,day=30
1506,note="Available:
1507\url{http://lkml.org/lkml/2006/11/29/330}
1508[Viewed November 26, 2008]"
1509,annotation="
1510 Expanded/corrected version of QRCU.
1511 Used to be OlegNesterov2007aQRCU, now time-corrected.
1512"
1513}
1514
1515@unpublished{EvgeniyPolyakov2006RCUslowdown
1516,Author="Evgeniy Polyakov"
1517,Title="Badness in postponing work"
1518,month="December"
1519,year="2006"
1520,day=05
1521,note="Available:
1522\url{http://www.ioremap.net/node/41}
1523[Viewed October 28, 2008]"
1524,annotation="
1525 Using RCU as a pure delay leads to a 2.5x slowdown in skbs in
1526 the Linux kernel.
1527"
1528}
1529
1530@inproceedings{ChrisMatthews2006ClusteredObjectsRCU
1531,author = {Matthews, Chris and Coady, Yvonne and Appavoo, Jonathan}
1532,title = {Portability events: a programming model for scalable system infrastructures}
1533,booktitle = {PLOS '06: Proceedings of the 3rd workshop on Programming languages and operating systems}
1534,year = {2006}
1535,isbn = {1-59593-577-0}
1536,pages = {11}
1537,location = {San Jose, California}
1538,doi = {http://doi.acm.org/10.1145/1215995.1216006}
1539,publisher = {ACM}
1540,address = {New York, NY, USA}
1541,annotation={
1542 Uses K42's RCU-like functionality to manage clustered-object
1543 lifetimes.
1544}}
1545
1546@article{DilmaDaSilva2006K42
1547,author = {Silva, Dilma Da and Krieger, Orran and Wisniewski, Robert W. and Waterland, Amos and Tam, David and Baumann, Andrew}
1548,title = {K42: an infrastructure for operating system research}
1549,journal = {SIGOPS Oper. Syst. Rev.}
1550,volume = {40}
1551,number = {2}
1552,year = {2006}
1553,issn = {0163-5980}
1554,pages = {34--42}
1555,doi = {http://doi.acm.org/10.1145/1131322.1131333}
1556,publisher = {ACM}
1557,address = {New York, NY, USA}
1558,annotation={
1559 Describes relationship of K42 generations to RCU.
1560}}
1561
1562# CoreyMinyard2007list_splice_rcu
1563@unpublished{CoreyMinyard2007list:splice:rcu
1564,Author="Corey Minyard and Paul E. McKenney"
1565,Title="{[PATCH]} add an {RCU} version of list splicing"
1566,month="January"
1567,year="2007"
1568,day=3
1569,note="Available:
1570\url{http://lkml.org/lkml/2007/1/3/112}
1571[Viewed May 28, 2007]"
1572,annotation="
1573 Patch for list_splice_rcu().
1574"
1575}
1576
1577@unpublished{PaulEMcKenney2007rcubarrier
1578,Author="Paul E. McKenney"
1579,Title="{RCU} and Unloadable Modules"
1580,month="January"
1581,day="14"
1582,year="2007"
1583,note="Available:
1584\url{http://lwn.net/Articles/217484/}
1585[Viewed November 22, 2007]"
1586,annotation="
1587 LWN article introducing the rcu_barrier() primitive.
1588"
1589}
1590
1591@unpublished{PeterZijlstra2007SyncBarrier
1592,Author="Peter Zijlstra and Ingo Molnar"
1593,Title="{[PATCH 3/7]} barrier: a scalable synchonisation barrier"
1594,month="January"
1595,year="2007"
1596,day=28
1597,note="Available:
1598\url{http://lkml.org/lkml/2007/1/28/34}
1599[Viewed March 27, 2008]"
1600,annotation="
1601 RCU-like implementation for frequent updaters and rare readers(!).
1602 Subsumed into QRCU. Maybe...
1603"
1604}
1605
1606@unpublished{PaulEMcKenney2007BoostRCU
1607,Author="Paul E. McKenney"
1608,Title="Priority-Boosting {RCU} Read-Side Critical Sections"
1609,month="February"
1610,day="5"
1611,year="2007"
1612,note="Available:
1613\url{http://lwn.net/Articles/220677/}
1614Revised:
1615\url{http://www.rdrop.com/users/paulmck/RCU/RCUbooststate.2007.04.16a.pdf}
1616[Viewed September 7, 2007]"
1617,annotation="
1618 LWN article introducing RCU priority boosting.
1619"
1620}
1621
1622@unpublished{PaulMcKenney2007QRCUpatch
1623,Author="Paul E. McKenney"
1624,Title="{[PATCH]} {QRCU} with lockless fastpath"
1625,month="February"
1626,year="2007"
1627,day=24
1628,note="Available:
1629\url{http://lkml.org/lkml/2007/2/25/18}
1630[Viewed March 27, 2008]"
1631,annotation="
1632 Patch for QRCU supplying lock-free fast path.
1633"
1634}
1635
1636@article{JonathanAppavoo2007K42RCU
1637,author = {Appavoo, Jonathan and Silva, Dilma Da and Krieger, Orran and Auslander, Marc and Ostrowski, Michal and Rosenburg, Bryan and Waterland, Amos and Wisniewski, Robert W. and Xenidis, Jimi and Stumm, Michael and Soares, Livio}
1638,title = {Experience distributing objects in an SMMP OS}
1639,journal = {ACM Trans. Comput. Syst.}
1640,volume = {25}
1641,number = {3}
1642,year = {2007}
1643,issn = {0734-2071}
1644,pages = {6/1--6/52}
1645,doi = {http://doi.acm.org/10.1145/1275517.1275518}
1646,publisher = {ACM}
1647,address = {New York, NY, USA}
1648,annotation={
1649 Role of RCU in K42.
1650}}
1651
1652@conference{RobertOlsson2007Trash
1653,Author="Robert Olsson and Stefan Nilsson"
1654,Title="{TRASH}: A dynamic {LC}-trie and hash data structure"
1655,booktitle="Workshop on High Performance Switching and Routing (HPSR'07)"
1656,month="May"
1657,year="2007"
1658,note="Available:
1659\url{http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4281239}
1660[Viewed October 1, 2010]"
1661,annotation=" 642,annotation="
1662 RCU-protected dynamic trie-hash combination. 643 RCU-protected dynamic trie-hash combination.
1663" 644"
1664} 645}
1665 646
1666@conference{PeterZijlstra2007ConcurrentPagecacheRCU 647@unpublished{ThomasEHart2007a
1667,Author="Peter Zijlstra" 648,Author="Thomas E. Hart and Paul E. McKenney and Angela Demke Brown and Jonathan Walpole"
1668,Title="Concurrent Pagecache" 649,Title="Performance of memory reclamation for lockless synchronization"
1669,Booktitle="Linux Symposium" 650,journal="J. Parallel Distrib. Comput."
1670,month="June"
1671,year="2007"
1672,address="Ottawa, Canada"
1673,note="Available:
1674\url{http://ols.108.redhat.com/2007/Reprints/zijlstra-Reprint.pdf}
1675[Viewed April 14, 2008]"
1676,annotation="
1677 Page-cache modifications permitting RCU readers and concurrent
1678 updates.
1679"
1680}
1681
1682@unpublished{PaulEMcKenney2007whatisRCU
1683,Author="Paul E. McKenney"
1684,Title="What is {RCU}?"
1685,year="2007" 651,year="2007"
1686,month="07" 652,note="To appear in J. Parallel Distrib. Comput.
1687,note="Available: 653 \url{doi=10.1016/j.jpdc.2007.04.010}"
1688\url{http://www.rdrop.com/users/paulmck/RCU/whatisRCU.html}
1689[Viewed July 6, 2007]"
1690,annotation={ 654,annotation={
1691 Describes RCU in Linux kernel. 655 Compares QSBR (AKA "classic RCU"), HPBR, EBR, and lock-free
656 reference counting. Journal version of ThomasEHart2006a.
1692} 657}
1693} 658}
1694 659
1695@unpublished{PaulEMcKenney2007QRCUspin 660@unpublished{PaulEMcKenney2007QRCUspin
1696,Author="Paul E. McKenney" 661,Author="Paul E. McKenney"
1697,Title="Using {Promela} and {Spin} to verify parallel algorithms" 662,Title="Using Promela and Spin to verify parallel algorithms"
1698,month="August" 663,month="August"
1699,day="1" 664,day="1"
1700,year="2007" 665,year="2007"
@@ -1704,50 +669,6 @@ Revised:
1704,annotation=" 669,annotation="
1705 LWN article describing Promela and spin, and also using Oleg 670 LWN article describing Promela and spin, and also using Oleg
1706 Nesterov's QRCU as an example (with Paul McKenney's fastpath). 671 Nesterov's QRCU as an example (with Paul McKenney's fastpath).
1707 Merged patch at: http://lkml.org/lkml/2007/2/25/18
1708"
1709}
1710
1711@unpublished{PaulEMcKenney2007WG21DDOatomics
1712,Author="Paul E. McKenney and Hans-J. Boehm and Lawrence Crowl"
1713,Title="C++ Data-Dependency Ordering: Atomics and Memory Model"
1714,month="August"
1715,day="3"
1716,year="2007"
1717,note="Preprint:
1718\url{http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm}
1719[Viewed December 7, 2009]"
1720,annotation="
1721 RCU for C++, parts 1 and 2.
1722"
1723}
1724
1725@unpublished{PaulEMcKenney2007WG21DDOannotation
1726,Author="Paul E. McKenney and Lawrence Crowl"
1727,Title="C++ Data-Dependency Ordering: Function Annotation"
1728,month="September"
1729,day="18"
1730,year="2008"
1731,note="Preprint:
1732\url{http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2782.htm}
1733[Viewed December 7, 2009]"
1734,annotation="
1735 RCU for C++, part 2, updated many times.
1736"
1737}
1738
1739@unpublished{PaulEMcKenney2007PreemptibleRCUPatch
1740,Author="Paul E. McKenney"
1741,Title="[PATCH RFC 0/9] {RCU}: Preemptible {RCU}"
1742,month="September"
1743,day="10"
1744,year="2007"
1745,note="Available:
1746\url{http://lkml.org/lkml/2007/9/10/213}
1747[Viewed October 25, 2007]"
1748,annotation="
1749 Final patch for preemptable RCU to -rt. (Later patches were
1750 to mainline, eventually incorporated.)
1751" 672"
1752} 673}
1753 674
@@ -1765,46 +686,10 @@ Revised:
1765" 686"
1766} 687}
1767 688
1768@article{ThomasEHart2007a
1769,Author="Thomas E. Hart and Paul E. McKenney and Angela Demke Brown and Jonathan Walpole"
1770,Title="Performance of memory reclamation for lockless synchronization"
1771,journal="J. Parallel Distrib. Comput."
1772,volume={67}
1773,number="12"
1774,year="2007"
1775,issn="0743-7315"
1776,pages="1270--1285"
1777,doi="http://dx.doi.org/10.1016/j.jpdc.2007.04.010"
1778,publisher="Academic Press, Inc."
1779,address="Orlando, FL, USA"
1780,annotation={
1781 Compares QSBR, HPBR, EBR, and lock-free reference counting.
1782 Journal version of ThomasEHart2006a.
1783}
1784}
1785
1786@unpublished{MathieuDesnoyers2007call:rcu:schedNeeded
1787,Author="Mathieu Desnoyers"
1788,Title="Re: [patch 1/2] {Linux} Kernel Markers - Support Multiple Probes"
1789,month="December"
1790,day="20"
1791,year="2007"
1792,note="Available:
1793\url{http://lkml.org/lkml/2007/12/20/244}
1794[Viewed March 27, 2008]"
1795,annotation="
1796 Request for call_rcu_sched() and rcu_barrier_sched().
1797"
1798}
1799
1800
1801######################################################################## 689########################################################################
1802# 690#
1803# "What is RCU?" LWN series. 691# "What is RCU?" LWN series.
1804# 692#
1805# http://lwn.net/Articles/262464/ (What is RCU, Fundamentally?)
1806# http://lwn.net/Articles/263130/ (What is RCU's Usage?)
1807# http://lwn.net/Articles/264090/ (What is RCU's API?)
1808 693
1809@unpublished{PaulEMcKenney2007WhatIsRCUFundamentally 694@unpublished{PaulEMcKenney2007WhatIsRCUFundamentally
1810,Author="Paul E. McKenney and Jonathan Walpole" 695,Author="Paul E. McKenney and Jonathan Walpole"
@@ -1838,7 +723,7 @@ Revised:
1838 3. RCU is a Bulk Reference-Counting Mechanism 723 3. RCU is a Bulk Reference-Counting Mechanism
1839 4. RCU is a Poor Man's Garbage Collector 724 4. RCU is a Poor Man's Garbage Collector
1840 5. RCU is a Way of Providing Existence Guarantees 725 5. RCU is a Way of Providing Existence Guarantees
1841 6. RCU is a Way of Waiting for Things to Finish 726 6. RCU is a Way of Waiting for Things to Finish
1842" 727"
1843} 728}
1844 729
@@ -1862,96 +747,20 @@ Revised:
1862# 747#
1863######################################################################## 748########################################################################
1864 749
1865
1866@unpublished{SteveRostedt2008dyntickRCUpatch
1867,Author="Steven Rostedt and Paul E. McKenney"
1868,Title="{[PATCH]} add support for dynamic ticks and preempt rcu"
1869,month="January"
1870,day="29"
1871,year="2008"
1872,note="Available:
1873\url{http://lkml.org/lkml/2008/1/29/208}
1874[Viewed March 27, 2008]"
1875,annotation="
1876 Patch that prevents preemptible RCU from unnecessarily waking
1877 up dynticks-idle CPUs.
1878"
1879}
1880
1881@unpublished{PaulEMcKenney2008LKMLDependencyOrdering
1882,Author="Paul E. McKenney"
1883,Title="Re: [PATCH 02/22 -v7] Add basic support for gcc profiler instrumentation"
1884,month="February"
1885,day="1"
1886,year="2008"
1887,note="Available:
1888\url{http://lkml.org/lkml/2008/2/2/255}
1889[Viewed October 18, 2008]"
1890,annotation="
1891 Explanation of compilers violating dependency ordering.
1892"
1893}
1894
1895@Conference{PaulEMcKenney2008Beijing
1896,Author="Paul E. McKenney"
1897,Title="Introducing Technology Into {Linux} Or:
1898Introducing your technology Into {Linux} will require introducing a
1899lot of {Linux} into your technology!!!"
1900,Booktitle="2008 Linux Developer Symposium - China"
1901,Publisher="OSS China"
1902,Month="February"
1903,Year="2008"
1904,Address="Beijing, China"
1905,note="Available:
1906\url{http://www.rdrop.com/users/paulmck/RCU/TechIntroLinux.2008.02.19a.pdf}
1907[Viewed August 12, 2008]"
1908}
1909
1910@unpublished{PaulEMcKenney2008dynticksRCU
1911,Author="Paul E. McKenney and Steven Rostedt"
1912,Title="Integrating and Validating dynticks and Preemptable RCU"
1913,month="April"
1914,day="24"
1915,year="2008"
1916,note="Available:
1917\url{http://lwn.net/Articles/279077/}
1918[Viewed April 24, 2008]"
1919,annotation="
1920 Describes use of Promela and Spin to validate (and fix!) the
1921 dynticks/RCU interface.
1922"
1923}
1924
1925@article{DinakarGuniguntala2008IBMSysJ 750@article{DinakarGuniguntala2008IBMSysJ
1926,author="D. Guniguntala and P. E. McKenney and J. Triplett and J. Walpole" 751,author="D. Guniguntala and P. E. McKenney and J. Triplett and J. Walpole"
1927,title="The read-copy-update mechanism for supporting real-time applications on shared-memory multiprocessor systems with {Linux}" 752,title="The read-copy-update mechanism for supporting real-time applications on shared-memory multiprocessor systems with {Linux}"
1928,Year="2008" 753,Year="2008"
1929,Month="April-June" 754,Month="April"
1930,journal="IBM Systems Journal" 755,journal="IBM Systems Journal"
1931,volume="47" 756,volume="47"
1932,number="2" 757,number="2"
1933,pages="221-236" 758,pages="@@-@@"
1934,annotation=" 759,annotation="
1935 RCU, realtime RCU, sleepable RCU, performance. 760 RCU, realtime RCU, sleepable RCU, performance.
1936" 761"
1937} 762}
1938 763
1939@unpublished{LaiJiangshan2008NewClassicAlgorithm
1940,Author="Lai Jiangshan"
1941,Title="[{RFC}][{PATCH}] rcu classic: new algorithm for callbacks-processing"
1942,month="June"
1943,day="3"
1944,year="2008"
1945,note="Available:
1946\url{http://lkml.org/lkml/2008/6/2/539}
1947[Viewed December 10, 2008]"
1948,annotation="
1949 Updated RCU classic algorithm. Introduced multi-tailed list
1950 for RCU callbacks and also pulling common code into
1951 __call_rcu().
1952"
1953}
1954
1955@article{PaulEMcKenney2008RCUOSR 764@article{PaulEMcKenney2008RCUOSR
1956,author="Paul E. McKenney and Jonathan Walpole" 765,author="Paul E. McKenney and Jonathan Walpole"
1957,title="Introducing technology into the {Linux} kernel: a case study" 766,title="Introducing technology into the {Linux} kernel: a case study"
@@ -1969,52 +778,6 @@ lot of {Linux} into your technology!!!"
1969} 778}
1970} 779}
1971 780
1972@unpublished{ManfredSpraul2008StateMachineRCU
1973,Author="Manfred Spraul"
1974,Title="[{RFC}, {PATCH}] state machine based rcu"
1975,month="August"
1976,day="21"
1977,year="2008"
1978,note="Available:
1979\url{http://lkml.org/lkml/2008/8/21/336}
1980[Viewed December 8, 2008]"
1981,annotation="
1982 State-based RCU. One key thing that this patch does is to
1983 separate the dynticks handling of NMIs and IRQs.
1984"
1985}
1986
1987@unpublished{ManfredSpraul2008dyntickIRQNMI
1988,Author="Manfred Spraul"
1989,Title="Re: [{RFC}, {PATCH}] v4 scalable classic {RCU} implementation"
1990,month="September"
1991,day="6"
1992,year="2008"
1993,note="Available:
1994\url{http://lkml.org/lkml/2008/9/6/86}
1995[Viewed December 8, 2008]"
1996,annotation="
1997 Manfred notes a fix required to my attempt to separate irq
1998 and NMI processing for hierarchical RCU's dynticks interface.
1999"
2000}
2001
2002@techreport{PaulEMcKenney2008cyclicRCU
2003,author="Paul E. McKenney"
2004,title="Efficient Support of Consistent Cyclic Search With Read-Copy Update"
2005,institution="US Patent and Trademark Office"
2006,address="Washington, DC"
2007,year="2008"
2008,number="US Patent 7,426,511"
2009,month="September"
2010,pages="23"
2011,annotation="
2012 Maintains an additional level of indirection to allow
2013 readers to confine themselves to the desired snapshot of the
2014 data structure. Only permits one update at a time.
2015"
2016}
2017
2018@unpublished{PaulEMcKenney2008HierarchicalRCU 781@unpublished{PaulEMcKenney2008HierarchicalRCU
2019,Author="Paul E. McKenney" 782,Author="Paul E. McKenney"
2020,Title="Hierarchical {RCU}" 783,Title="Hierarchical {RCU}"
@@ -2030,21 +793,6 @@ lot of {Linux} into your technology!!!"
2030" 793"
2031} 794}
2032 795
2033@unpublished{PaulEMcKenney2009BloatwatchRCU
2034,Author="Paul E. McKenney"
2035,Title="Re: [PATCH fyi] RCU: the bloatwatch edition"
2036,month="January"
2037,day="14"
2038,year="2009"
2039,note="Available:
2040\url{http://lkml.org/lkml/2009/1/14/449}
2041[Viewed January 15, 2009]"
2042,annotation="
2043 Small-footprint implementation of RCU for uniprocessor
2044 embedded applications -- and also for exposition purposes.
2045"
2046}
2047
2048@conference{PaulEMcKenney2009MaliciousURCU 796@conference{PaulEMcKenney2009MaliciousURCU
2049,Author="Paul E. McKenney" 797,Author="Paul E. McKenney"
2050,Title="Using a Malicious User-Level {RCU} to Torture {RCU}-Based Algorithms" 798,Title="Using a Malicious User-Level {RCU} to Torture {RCU}-Based Algorithms"
@@ -2068,17 +816,15 @@ lot of {Linux} into your technology!!!"
2068,year="2009" 816,year="2009"
2069,note="Available: 817,note="Available:
2070\url{http://lkml.org/lkml/2009/2/5/572} 818\url{http://lkml.org/lkml/2009/2/5/572}
2071\url{http://lttng.org/urcu} 819\url{git://lttng.org/userspace-rcu.git}
2072[Viewed February 20, 2009]" 820[Viewed February 20, 2009]"
2073,annotation=" 821,annotation="
2074 Mathieu Desnoyers's user-space RCU implementation. 822 Mathieu Desnoyers's user-space RCU implementation.
2075 git://lttng.org/userspace-rcu.git 823 git://lttng.org/userspace-rcu.git
2076 http://lttng.org/cgi-bin/gitweb.cgi?p=userspace-rcu.git
2077 http://lttng.org/urcu
2078" 824"
2079} 825}
2080 826
2081@unpublished{PaulEMcKenney2009LWNBloatWatchRCU 827@unpublished{PaulEMcKenney2009BloatWatchRCU
2082,Author="Paul E. McKenney" 828,Author="Paul E. McKenney"
2083,Title="{RCU}: The {Bloatwatch} Edition" 829,Title="{RCU}: The {Bloatwatch} Edition"
2084,month="March" 830,month="March"
@@ -2106,29 +852,14 @@ lot of {Linux} into your technology!!!"
2106" 852"
2107} 853}
2108 854
2109@unpublished{PaulEMcKenney2009fastRTRCU 855@unpublished{JoshTriplett2009RPHash
2110,Author="Paul E. McKenney"
2111,Title="[{PATCH} {RFC} -tip 0/4] {RCU} cleanups and simplified preemptable {RCU}"
2112,month="July"
2113,day="23"
2114,year="2009"
2115,note="Available:
2116\url{http://lkml.org/lkml/2009/7/23/294}
2117[Viewed August 15, 2009]"
2118,annotation="
2119 First posting of simple and fast preemptable RCU.
2120"
2121}
2122
2123@InProceedings{JoshTriplett2009RPHash
2124,Author="Josh Triplett" 856,Author="Josh Triplett"
2125,Title="Scalable concurrent hash tables via relativistic programming" 857,Title="Scalable concurrent hash tables via relativistic programming"
2126,month="September" 858,month="September"
2127,year="2009" 859,year="2009"
2128,booktitle="Linux Plumbers Conference 2009" 860,note="Linux Plumbers Conference presentation"
2129,annotation=" 861,annotation="
2130 RP fun with hash tables. 862 RP fun with hash tables.
2131 See also JoshTriplett2010RPHash
2132" 863"
2133} 864}
2134 865
@@ -2141,323 +872,4 @@ lot of {Linux} into your technology!!!"
2141,note="Available: 872,note="Available:
2142\url{http://www.lttng.org/pub/thesis/desnoyers-dissertation-2009-12.pdf} 873\url{http://www.lttng.org/pub/thesis/desnoyers-dissertation-2009-12.pdf}
2143[Viewed December 9, 2009]" 874[Viewed December 9, 2009]"
2144,annotation={
2145 Chapter 6 (page 97) covers user-level RCU.
2146}
2147}
2148
2149@unpublished{RelativisticProgrammingWiki
2150,Author="Josh Triplett and Paul E. McKenney and Jonathan Walpole"
2151,Title="Relativistic Programming"
2152,month="September"
2153,year="2009"
2154,note="Available:
2155\url{http://wiki.cs.pdx.edu/rp/}
2156[Viewed December 9, 2009]"
2157,annotation="
2158 Main Relativistic Programming Wiki.
2159"
2160}
2161
2162@conference{PaulEMcKenney2009DeterministicRCU
2163,Author="Paul E. McKenney"
2164,Title="Deterministic Synchronization in Multicore Systems: the Role of {RCU}"
2165,Booktitle="Eleventh Real Time Linux Workshop"
2166,month="September"
2167,year="2009"
2168,address="Dresden, Germany"
2169,note="Available:
2170\url{http://www.rdrop.com/users/paulmck/realtime/paper/DetSyncRCU.2009.08.18a.pdf}
2171[Viewed January 14, 2009]"
2172}
2173
2174@unpublished{PaulEMcKenney2009HuntingHeisenbugs
2175,Author="Paul E. McKenney"
2176,Title="Hunting Heisenbugs"
2177,month="November"
2178,year="2009"
2179,day="1"
2180,note="Available:
2181\url{http://paulmck.livejournal.com/14639.html}
2182[Viewed June 4, 2010]"
2183,annotation="
2184 Day-one bug in Tree RCU that took forever to track down.
2185"
2186}
2187
2188@unpublished{MathieuDesnoyers2009defer:rcu
2189,Author="Mathieu Desnoyers"
2190,Title="Kernel RCU: shrink the size of the struct rcu\_head"
2191,month="December"
2192,year="2009"
2193,note="Available:
2194\url{http://lkml.org/lkml/2009/10/18/129}
2195[Viewed December 29, 2009]"
2196,annotation="
2197 Mathieu proposed defer_rcu() with fixed-size per-thread pool
2198 of RCU callbacks.
2199"
2200}
2201
2202@unpublished{MathieuDesnoyers2009VerifPrePub
2203,Author="Mathieu Desnoyers and Paul E. McKenney and Michel R. Dagenais"
2204,Title="Multi-Core Systems Modeling for Formal Verification of Parallel Algorithms"
2205,month="December"
2206,year="2009"
2207,note="Submitted to IEEE TPDS"
2208,annotation="
2209 OOMem model for Mathieu's user-level RCU mechanical proof of
2210 correctness.
2211"
2212}
2213
2214@unpublished{MathieuDesnoyers2009URCUPrePub
2215,Author="Mathieu Desnoyers and Paul E. McKenney and Alan Stern and Michel R. Dagenais and Jonathan Walpole"
2216,Title="User-Level Implementations of Read-Copy Update"
2217,month="December"
2218,year="2010"
2219,url=\url{http://www.computer.org/csdl/trans/td/2012/02/ttd2012020375-abs.html}
2220,annotation="
2221 RCU overview, desiderata, semi-formal semantics, user-level RCU
2222 usage scenarios, three classes of RCU implementation, wait-free
2223 RCU updates, RCU grace-period batching, update overhead,
2224 http://www.rdrop.com/users/paulmck/RCU/urcu-main-accepted.2011.08.30a.pdf
2225 http://www.rdrop.com/users/paulmck/RCU/urcu-supp-accepted.2011.08.30a.pdf
2226 Superseded by MathieuDesnoyers2012URCU.
2227"
2228}
2229
2230@inproceedings{HariKannan2009DynamicAnalysisRCU
2231,author = {Kannan, Hari}
2232,title = {Ordering decoupled metadata accesses in multiprocessors}
2233,booktitle = {MICRO 42: Proceedings of the 42nd Annual IEEE/ACM International Symposium on Microarchitecture}
2234,year = {2009}
2235,isbn = {978-1-60558-798-1}
2236,pages = {381--390}
2237,location = {New York, New York}
2238,doi = {http://doi.acm.org/10.1145/1669112.1669161}
2239,publisher = {ACM}
2240,address = {New York, NY, USA}
2241,annotation={
2242 Uses RCU to protect metadata used in dynamic analysis.
2243}}
2244
2245@conference{PaulEMcKenney2010SimpleOptRCU
2246,Author="Paul E. McKenney"
2247,Title="Simplicity Through Optimization"
2248,Booktitle="linux.conf.au 2010"
2249,month="January"
2250,year="2010"
2251,address="Wellington, New Zealand"
2252,note="Available:
2253\url{http://www.rdrop.com/users/paulmck/RCU/SimplicityThruOptimization.2010.01.21f.pdf}
2254[Viewed October 10, 2010]"
2255,annotation="
2256 TREE_PREEMPT_RCU optimizations greatly simplified the old
2257 PREEMPT_RCU implementation.
2258"
2259}
2260
2261@unpublished{PaulEMcKenney2010LockdepRCU
2262,Author="Paul E. McKenney"
2263,Title="Lockdep-{RCU}"
2264,month="February"
2265,year="2010"
2266,day="1"
2267,note="Available:
2268\url{https://lwn.net/Articles/371986/}
2269[Viewed June 4, 2010]"
2270,annotation="
2271 CONFIG_PROVE_RCU, or at least an early version.
2272"
2273}
2274
2275@unpublished{AviKivity2010KVM2RCU
2276,Author="Avi Kivity"
2277,Title="[{PATCH} 37/40] {KVM}: Bump maximum vcpu count to 64"
2278,month="February"
2279,year="2010"
2280,note="Available:
2281\url{http://www.mail-archive.com/kvm@vger.kernel.org/msg28640.html}
2282[Viewed March 20, 2010]"
2283,annotation="
2284 Use of RCU permits KVM to increase the size of guest OSes from
2285 16 CPUs to 64 CPUs.
2286"
2287}
2288
2289@unpublished{HerbertXu2010RCUResizeHash
2290,Author="Herbert Xu"
2291,Title="bridge: Add core IGMP snooping support"
2292,month="February"
2293,year="2010"
2294,note="Available:
2295\url{http://kerneltrap.com/mailarchive/linux-netdev/2010/2/26/6270589}
2296[Viewed March 20, 2011]"
2297,annotation={
2298 Use a pair of list_head structures to support RCU-protected
2299 resizable hash tables.
2300}}
2301
2302@article{JoshTriplett2010RPHash
2303,author="Josh Triplett and Paul E. McKenney and Jonathan Walpole"
2304,title="Scalable Concurrent Hash Tables via Relativistic Programming"
2305,journal="ACM Operating Systems Review"
2306,year=2010
2307,volume=44
2308,number=3
2309,month="July"
2310,annotation={
2311 RP fun with hash tables.
2312 http://portal.acm.org/citation.cfm?id=1842733.1842750
2313}}
2314
2315@unpublished{PaulEMcKenney2010RCUAPI
2316,Author="Paul E. McKenney"
2317,Title="The {RCU} {API}, 2010 Edition"
2318,month="December"
2319,day="8"
2320,year="2010"
2321,note="Available:
2322\url{http://lwn.net/Articles/418853/}
2323[Viewed December 8, 2010]"
2324,annotation="
2325 Includes updated software-engineering features.
2326"
2327}
2328
2329@mastersthesis{AndrejPodzimek2010masters
2330,author="Andrej Podzimek"
2331,title="Read-Copy-Update for OpenSolaris"
2332,school="Charles University in Prague"
2333,year="2010"
2334,note="Available:
2335\url{https://andrej.podzimek.org/thesis.pdf}
2336[Viewed January 31, 2011]"
2337,annotation={
2338 Reviews RCU implementations and creates a few for OpenSolaris.
2339 Drives quiescent-state detection from RCU read-side primitives,
2340 in a manner roughly similar to that of Jim Houston.
2341}}
2342
2343@unpublished{LinusTorvalds2011Linux2:6:38:rc1:NPigginVFS
2344,Author="Linus Torvalds"
2345,Title="Linux 2.6.38-rc1"
2346,month="January"
2347,year="2011"
2348,note="Available:
2349\url{https://lkml.org/lkml/2011/1/18/322}
2350[Viewed March 4, 2011]"
2351,annotation={
2352 "The RCU-based name lookup is at the other end of the spectrum - the
2353 absolute anti-gimmick. It's some seriously good stuff, and gets rid of
2354 the last main global lock that really tends to hurt some kernel loads.
2355 The dentry lock is no longer a big serializing issue. What's really
2356 nice about it is that it actually improves performance a lot even for
2357 single-threaded loads (on an SMP kernel), because it gets rid of some
2358 of the most expensive parts of path component lookup, which was the
2359 d_lock on every component lookup. So I'm seeing improvements of 30-50%
2360 on some seriously pathname-lookup intensive loads."
2361}}
2362
2363@techreport{JoshTriplett2011RPScalableCorrectOrdering
2364,author = {Josh Triplett and Philip W. Howard and Paul E. McKenney and Jonathan Walpole}
2365,title = {Scalable Correct Memory Ordering via Relativistic Programming}
2366,year = {2011}
2367,number = {11-03}
2368,institution = {Portland State University}
2369,note = {\url{http://www.cs.pdx.edu/pdfs/tr1103.pdf}}
2370}
2371
2372@inproceedings{PhilHoward2011RCUTMRBTree
2373,author = {Philip W. Howard and Jonathan Walpole}
2374,title = {A Relativistic Enhancement to Software Transactional Memory}
2375,booktitle = {Proceedings of the 3rd USENIX conference on Hot topics in parallelism}
2376,series = {HotPar'11}
2377,year = {2011}
2378,location = {Berkeley, CA}
2379,pages = {1--6}
2380,numpages = {6}
2381,url = {http://www.usenix.org/event/hotpar11/tech/final_files/Howard.pdf}
2382,publisher = {USENIX Association}
2383,address = {Berkeley, CA, USA}
2384}
2385
2386@techreport{PaulEMcKenney2011cyclicparallelRCU
2387,author="Paul E. McKenney and Jonathan Walpole"
2388,title="Efficient Support of Consistent Cyclic Search With Read-Copy Update and Parallel Updates"
2389,institution="US Patent and Trademark Office"
2390,address="Washington, DC"
2391,year="2011"
2392,number="US Patent 7,953,778"
2393,month="May"
2394,pages="34"
2395,annotation="
2396 Maintains an array of generation numbers to track in-flight
2397 updates and keeps an additional level of indirection to allow
2398 readers to confine themselves to the desired snapshot of the
2399 data structure.
2400"
2401}
2402
2403@inproceedings{Triplett:2011:RPHash
2404,author = {Triplett, Josh and McKenney, Paul E. and Walpole, Jonathan}
2405,title = {Resizable, Scalable, Concurrent Hash Tables via Relativistic Programming}
2406,booktitle = {Proceedings of the 2011 USENIX Annual Technical Conference}
2407,month = {June}
2408,year = {2011}
2409,pages = {145--158}
2410,numpages = {14}
2411,url={http://www.usenix.org/event/atc11/tech/final_files/atc11_proceedings.pdf}
2412,publisher = {The USENIX Association}
2413,address = {Portland, OR USA}
2414}
2415
2416@unpublished{PaulEMcKenney2011RCU3.0trainwreck
2417,Author="Paul E. McKenney"
2418,Title="3.0 and {RCU:} what went wrong"
2419,month="July"
2420,day="27"
2421,year="2011"
2422,note="Available:
2423\url{http://lwn.net/Articles/453002/}
2424[Viewed July 27, 2011]"
2425,annotation="
2426 Analysis of the RCU trainwreck in Linux kernel 3.0.
2427"
2428}
2429
2430@unpublished{NeilBrown2011MeetTheLockers
2431,Author="Neil Brown"
2432,Title="Meet the Lockers"
2433,month="August"
2434,day="3"
2435,year="2011"
2436,note="Available:
2437\url{http://lwn.net/Articles/453685/}
2438[Viewed September 2, 2011]"
2439,annotation="
2440 The Locker family as an analogy for locking, reference counting,
2441 RCU, and seqlock.
2442"
2443}
2444
2445@article{MathieuDesnoyers2012URCU
2446,Author="Mathieu Desnoyers and Paul E. McKenney and Alan Stern and Michel R. Dagenais and Jonathan Walpole"
2447,Title="User-Level Implementations of Read-Copy Update"
2448,journal="IEEE Transactions on Parallel and Distributed Systems"
2449,volume={23}
2450,year="2012"
2451,issn="1045-9219"
2452,pages="375-382"
2453,doi="http://doi.ieeecomputersociety.org/10.1109/TPDS.2011.159"
2454,publisher="IEEE Computer Society"
2455,address="Los Alamitos, CA, USA"
2456,annotation={
2457 RCU overview, desiderata, semi-formal semantics, user-level RCU
2458 usage scenarios, three classes of RCU implementation, wait-free
2459 RCU updates, RCU grace-period batching, update overhead,
2460 http://www.rdrop.com/users/paulmck/RCU/urcu-main-accepted.2011.08.30a.pdf
2461 http://www.rdrop.com/users/paulmck/RCU/urcu-supp-accepted.2011.08.30a.pdf
2462}
2463} 875}
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt
index 31ef8fe07f8..0c134f8afc6 100644
--- a/Documentation/RCU/checklist.txt
+++ b/Documentation/RCU/checklist.txt
@@ -162,9 +162,9 @@ over a rather long period of time, but improvements are always welcome!
162 when publicizing a pointer to a structure that can 162 when publicizing a pointer to a structure that can
163 be traversed by an RCU read-side critical section. 163 be traversed by an RCU read-side critical section.
164 164
1655. If call_rcu(), or a related primitive such as call_rcu_bh(), 1655. If call_rcu(), or a related primitive such as call_rcu_bh() or
166 call_rcu_sched(), or call_srcu() is used, the callback function 166 call_rcu_sched(), is used, the callback function must be
167 must be written to be called from softirq context. In particular, 167 written to be called from softirq context. In particular,
168 it cannot block. 168 it cannot block.
169 169
1706. Since synchronize_rcu() can block, it cannot be called from 1706. Since synchronize_rcu() can block, it cannot be called from
@@ -180,20 +180,6 @@ over a rather long period of time, but improvements are always welcome!
180 operations that would not normally be undertaken while a real-time 180 operations that would not normally be undertaken while a real-time
181 workload is running. 181 workload is running.
182 182
183 In particular, if you find yourself invoking one of the expedited
184 primitives repeatedly in a loop, please do everyone a favor:
185 Restructure your code so that it batches the updates, allowing
186 a single non-expedited primitive to cover the entire batch.
187 This will very likely be faster than the loop containing the
188 expedited primitive, and will be much much easier on the rest
189 of the system, especially to real-time workloads running on
190 the rest of the system.
191
192 In addition, it is illegal to call the expedited forms from
193 a CPU-hotplug notifier, or while holding a lock that is acquired
194 by a CPU-hotplug notifier. Failing to observe this restriction
195 will result in deadlock.
196
1977. If the updater uses call_rcu() or synchronize_rcu(), then the 1837. If the updater uses call_rcu() or synchronize_rcu(), then the
198 corresponding readers must use rcu_read_lock() and 184 corresponding readers must use rcu_read_lock() and
199 rcu_read_unlock(). If the updater uses call_rcu_bh() or 185 rcu_read_unlock(). If the updater uses call_rcu_bh() or
@@ -202,12 +188,11 @@ over a rather long period of time, but improvements are always welcome!
202 updater uses call_rcu_sched() or synchronize_sched(), then 188 updater uses call_rcu_sched() or synchronize_sched(), then
203 the corresponding readers must disable preemption, possibly 189 the corresponding readers must disable preemption, possibly
204 by calling rcu_read_lock_sched() and rcu_read_unlock_sched(). 190 by calling rcu_read_lock_sched() and rcu_read_unlock_sched().
205 If the updater uses synchronize_srcu() or call_srcu(), 191 If the updater uses synchronize_srcu(), the the corresponding
206 the the corresponding readers must use srcu_read_lock() and 192 readers must use srcu_read_lock() and srcu_read_unlock(),
207 srcu_read_unlock(), and with the same srcu_struct. The rules for 193 and with the same srcu_struct. The rules for the expedited
208 the expedited primitives are the same as for their non-expedited 194 primitives are the same as for their non-expedited counterparts.
209 counterparts. Mixing things up will result in confusion and 195 Mixing things up will result in confusion and broken kernels.
210 broken kernels.
211 196
212 One exception to this rule: rcu_read_lock() and rcu_read_unlock() 197 One exception to this rule: rcu_read_lock() and rcu_read_unlock()
213 may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh() 198 may be substituted for rcu_read_lock_bh() and rcu_read_unlock_bh()
@@ -271,14 +256,15 @@ over a rather long period of time, but improvements are always welcome!
271 The same cautions apply to call_rcu_bh() and call_rcu_sched(). 256 The same cautions apply to call_rcu_bh() and call_rcu_sched().
272 257
2739. All RCU list-traversal primitives, which include 2589. All RCU list-traversal primitives, which include
274 rcu_dereference(), list_for_each_entry_rcu(), and 259 rcu_dereference(), list_for_each_entry_rcu(),
275 list_for_each_safe_rcu(), must be either within an RCU read-side 260 list_for_each_continue_rcu(), and list_for_each_safe_rcu(),
276 critical section or must be protected by appropriate update-side 261 must be either within an RCU read-side critical section or
277 locks. RCU read-side critical sections are delimited by 262 must be protected by appropriate update-side locks. RCU
278 rcu_read_lock() and rcu_read_unlock(), or by similar primitives 263 read-side critical sections are delimited by rcu_read_lock()
279 such as rcu_read_lock_bh() and rcu_read_unlock_bh(), in which 264 and rcu_read_unlock(), or by similar primitives such as
280 case the matching rcu_dereference() primitive must be used in 265 rcu_read_lock_bh() and rcu_read_unlock_bh(), in which case
281 order to keep lockdep happy, in this case, rcu_dereference_bh(). 266 the matching rcu_dereference() primitive must be used in order
267 to keep lockdep happy, in this case, rcu_dereference_bh().
282 268
283 The reason that it is permissible to use RCU list-traversal 269 The reason that it is permissible to use RCU list-traversal
284 primitives when the update-side lock is held is that doing so 270 primitives when the update-side lock is held is that doing so
@@ -309,12 +295,6 @@ over a rather long period of time, but improvements are always welcome!
309 code under the influence of preempt_disable(), you instead 295 code under the influence of preempt_disable(), you instead
310 need to use synchronize_irq() or synchronize_sched(). 296 need to use synchronize_irq() or synchronize_sched().
311 297
312 This same limitation also applies to synchronize_rcu_bh()
313 and synchronize_srcu(), as well as to the asynchronous and
314 expedited forms of the three primitives, namely call_rcu(),
315 call_rcu_bh(), call_srcu(), synchronize_rcu_expedited(),
316 synchronize_rcu_bh_expedited(), and synchronize_srcu_expedited().
317
31812. Any lock acquired by an RCU callback must be acquired elsewhere 29812. Any lock acquired by an RCU callback must be acquired elsewhere
319 with softirq disabled, e.g., via spin_lock_irqsave(), 299 with softirq disabled, e.g., via spin_lock_irqsave(),
320 spin_lock_bh(), etc. Failing to disable irq on a given 300 spin_lock_bh(), etc. Failing to disable irq on a given
@@ -339,28 +319,22 @@ over a rather long period of time, but improvements are always welcome!
339 victim CPU from ever going offline.) 319 victim CPU from ever going offline.)
340 320
34114. SRCU (srcu_read_lock(), srcu_read_unlock(), srcu_dereference(), 32114. SRCU (srcu_read_lock(), srcu_read_unlock(), srcu_dereference(),
342 synchronize_srcu(), synchronize_srcu_expedited(), and call_srcu()) 322 synchronize_srcu(), and synchronize_srcu_expedited()) may only
343 may only be invoked from process context. Unlike other forms of 323 be invoked from process context. Unlike other forms of RCU, it
344 RCU, it -is- permissible to block in an SRCU read-side critical 324 -is- permissible to block in an SRCU read-side critical section
345 section (demarked by srcu_read_lock() and srcu_read_unlock()), 325 (demarked by srcu_read_lock() and srcu_read_unlock()), hence the
346 hence the "SRCU": "sleepable RCU". Please note that if you 326 "SRCU": "sleepable RCU". Please note that if you don't need
347 don't need to sleep in read-side critical sections, you should be 327 to sleep in read-side critical sections, you should be using
348 using RCU rather than SRCU, because RCU is almost always faster 328 RCU rather than SRCU, because RCU is almost always faster and
349 and easier to use than is SRCU. 329 easier to use than is SRCU.
350
351 If you need to enter your read-side critical section in a
352 hardirq or exception handler, and then exit that same read-side
353 critical section in the task that was interrupted, then you need
354 to srcu_read_lock_raw() and srcu_read_unlock_raw(), which avoid
355 the lockdep checking that would otherwise this practice illegal.
356 330
357 Also unlike other forms of RCU, explicit initialization 331 Also unlike other forms of RCU, explicit initialization
358 and cleanup is required via init_srcu_struct() and 332 and cleanup is required via init_srcu_struct() and
359 cleanup_srcu_struct(). These are passed a "struct srcu_struct" 333 cleanup_srcu_struct(). These are passed a "struct srcu_struct"
360 that defines the scope of a given SRCU domain. Once initialized, 334 that defines the scope of a given SRCU domain. Once initialized,
361 the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock() 335 the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock()
362 synchronize_srcu(), synchronize_srcu_expedited(), and call_srcu(). 336 synchronize_srcu(), and synchronize_srcu_expedited(). A given
363 A given synchronize_srcu() waits only for SRCU read-side critical 337 synchronize_srcu() waits only for SRCU read-side critical
364 sections governed by srcu_read_lock() and srcu_read_unlock() 338 sections governed by srcu_read_lock() and srcu_read_unlock()
365 calls that have been passed the same srcu_struct. This property 339 calls that have been passed the same srcu_struct. This property
366 is what makes sleeping read-side critical sections tolerable -- 340 is what makes sleeping read-side critical sections tolerable --
@@ -380,7 +354,7 @@ over a rather long period of time, but improvements are always welcome!
380 requiring SRCU's read-side deadlock immunity or low read-side 354 requiring SRCU's read-side deadlock immunity or low read-side
381 realtime latency. 355 realtime latency.
382 356
383 Note that, rcu_assign_pointer() relates to SRCU just as it does 357 Note that, rcu_assign_pointer() relates to SRCU just as they do
384 to other forms of RCU. 358 to other forms of RCU.
385 359
38615. The whole point of call_rcu(), synchronize_rcu(), and friends 36015. The whole point of call_rcu(), synchronize_rcu(), and friends
diff --git a/Documentation/RCU/listRCU.txt b/Documentation/RCU/listRCU.txt
index adb5a378284..4349c1487e9 100644
--- a/Documentation/RCU/listRCU.txt
+++ b/Documentation/RCU/listRCU.txt
@@ -205,7 +205,7 @@ RCU ("read-copy update") its name. The RCU code is as follows:
205 audit_copy_rule(&ne->rule, &e->rule); 205 audit_copy_rule(&ne->rule, &e->rule);
206 ne->rule.action = newaction; 206 ne->rule.action = newaction;
207 ne->rule.file_count = newfield_count; 207 ne->rule.file_count = newfield_count;
208 list_replace_rcu(&e->list, &ne->list); 208 list_replace_rcu(e, ne);
209 call_rcu(&e->rcu, audit_free_rule); 209 call_rcu(&e->rcu, audit_free_rule);
210 return 0; 210 return 0;
211 } 211 }
diff --git a/Documentation/RCU/lockdep-splat.txt b/Documentation/RCU/lockdep-splat.txt
deleted file mode 100644
index bf906114282..00000000000
--- a/Documentation/RCU/lockdep-splat.txt
+++ /dev/null
@@ -1,110 +0,0 @@
1Lockdep-RCU was added to the Linux kernel in early 2010
2(http://lwn.net/Articles/371986/). This facility checks for some common
3misuses of the RCU API, most notably using one of the rcu_dereference()
4family to access an RCU-protected pointer without the proper protection.
5When such misuse is detected, an lockdep-RCU splat is emitted.
6
7The usual cause of a lockdep-RCU slat is someone accessing an
8RCU-protected data structure without either (1) being in the right kind of
9RCU read-side critical section or (2) holding the right update-side lock.
10This problem can therefore be serious: it might result in random memory
11overwriting or worse. There can of course be false positives, this
12being the real world and all that.
13
14So let's look at an example RCU lockdep splat from 3.0-rc5, one that
15has long since been fixed:
16
17===============================
18[ INFO: suspicious RCU usage. ]
19-------------------------------
20block/cfq-iosched.c:2776 suspicious rcu_dereference_protected() usage!
21
22other info that might help us debug this:
23
24
25rcu_scheduler_active = 1, debug_locks = 0
263 locks held by scsi_scan_6/1552:
27 #0: (&shost->scan_mutex){+.+.+.}, at: [<ffffffff8145efca>]
28scsi_scan_host_selected+0x5a/0x150
29 #1: (&eq->sysfs_lock){+.+...}, at: [<ffffffff812a5032>]
30elevator_exit+0x22/0x60
31 #2: (&(&q->__queue_lock)->rlock){-.-...}, at: [<ffffffff812b6233>]
32cfq_exit_queue+0x43/0x190
33
34stack backtrace:
35Pid: 1552, comm: scsi_scan_6 Not tainted 3.0.0-rc5 #17
36Call Trace:
37 [<ffffffff810abb9b>] lockdep_rcu_dereference+0xbb/0xc0
38 [<ffffffff812b6139>] __cfq_exit_single_io_context+0xe9/0x120
39 [<ffffffff812b626c>] cfq_exit_queue+0x7c/0x190
40 [<ffffffff812a5046>] elevator_exit+0x36/0x60
41 [<ffffffff812a802a>] blk_cleanup_queue+0x4a/0x60
42 [<ffffffff8145cc09>] scsi_free_queue+0x9/0x10
43 [<ffffffff81460944>] __scsi_remove_device+0x84/0xd0
44 [<ffffffff8145dca3>] scsi_probe_and_add_lun+0x353/0xb10
45 [<ffffffff817da069>] ? error_exit+0x29/0xb0
46 [<ffffffff817d98ed>] ? _raw_spin_unlock_irqrestore+0x3d/0x80
47 [<ffffffff8145e722>] __scsi_scan_target+0x112/0x680
48 [<ffffffff812c690d>] ? trace_hardirqs_off_thunk+0x3a/0x3c
49 [<ffffffff817da069>] ? error_exit+0x29/0xb0
50 [<ffffffff812bcc60>] ? kobject_del+0x40/0x40
51 [<ffffffff8145ed16>] scsi_scan_channel+0x86/0xb0
52 [<ffffffff8145f0b0>] scsi_scan_host_selected+0x140/0x150
53 [<ffffffff8145f149>] do_scsi_scan_host+0x89/0x90
54 [<ffffffff8145f170>] do_scan_async+0x20/0x160
55 [<ffffffff8145f150>] ? do_scsi_scan_host+0x90/0x90
56 [<ffffffff810975b6>] kthread+0xa6/0xb0
57 [<ffffffff817db154>] kernel_thread_helper+0x4/0x10
58 [<ffffffff81066430>] ? finish_task_switch+0x80/0x110
59 [<ffffffff817d9c04>] ? retint_restore_args+0xe/0xe
60 [<ffffffff81097510>] ? __init_kthread_worker+0x70/0x70
61 [<ffffffff817db150>] ? gs_change+0xb/0xb
62
63Line 2776 of block/cfq-iosched.c in v3.0-rc5 is as follows:
64
65 if (rcu_dereference(ioc->ioc_data) == cic) {
66
67This form says that it must be in a plain vanilla RCU read-side critical
68section, but the "other info" list above shows that this is not the
69case. Instead, we hold three locks, one of which might be RCU related.
70And maybe that lock really does protect this reference. If so, the fix
71is to inform RCU, perhaps by changing __cfq_exit_single_io_context() to
72take the struct request_queue "q" from cfq_exit_queue() as an argument,
73which would permit us to invoke rcu_dereference_protected as follows:
74
75 if (rcu_dereference_protected(ioc->ioc_data,
76 lockdep_is_held(&q->queue_lock)) == cic) {
77
78With this change, there would be no lockdep-RCU splat emitted if this
79code was invoked either from within an RCU read-side critical section
80or with the ->queue_lock held. In particular, this would have suppressed
81the above lockdep-RCU splat because ->queue_lock is held (see #2 in the
82list above).
83
84On the other hand, perhaps we really do need an RCU read-side critical
85section. In this case, the critical section must span the use of the
86return value from rcu_dereference(), or at least until there is some
87reference count incremented or some such. One way to handle this is to
88add rcu_read_lock() and rcu_read_unlock() as follows:
89
90 rcu_read_lock();
91 if (rcu_dereference(ioc->ioc_data) == cic) {
92 spin_lock(&ioc->lock);
93 rcu_assign_pointer(ioc->ioc_data, NULL);
94 spin_unlock(&ioc->lock);
95 }
96 rcu_read_unlock();
97
98With this change, the rcu_dereference() is always within an RCU
99read-side critical section, which again would have suppressed the
100above lockdep-RCU splat.
101
102But in this particular case, we don't actually deference the pointer
103returned from rcu_dereference(). Instead, that pointer is just compared
104to the cic pointer, which means that the rcu_dereference() can be replaced
105by rcu_access_pointer() as follows:
106
107 if (rcu_access_pointer(ioc->ioc_data) == cic) {
108
109Because it is legal to invoke rcu_access_pointer() without protection,
110this change would also suppress the above lockdep-RCU splat.
diff --git a/Documentation/RCU/lockdep.txt b/Documentation/RCU/lockdep.txt
index a102d4b3724..d7a49b2f699 100644
--- a/Documentation/RCU/lockdep.txt
+++ b/Documentation/RCU/lockdep.txt
@@ -32,27 +32,9 @@ checking of rcu_dereference() primitives:
32 srcu_dereference(p, sp): 32 srcu_dereference(p, sp):
33 Check for SRCU read-side critical section. 33 Check for SRCU read-side critical section.
34 rcu_dereference_check(p, c): 34 rcu_dereference_check(p, c):
35 Use explicit check expression "c" along with 35 Use explicit check expression "c". This is useful in
36 rcu_read_lock_held(). This is useful in code that is 36 code that is invoked by both readers and updaters.
37 invoked by both RCU readers and updaters. 37 rcu_dereference_raw(p)
38 rcu_dereference_bh_check(p, c):
39 Use explicit check expression "c" along with
40 rcu_read_lock_bh_held(). This is useful in code that
41 is invoked by both RCU-bh readers and updaters.
42 rcu_dereference_sched_check(p, c):
43 Use explicit check expression "c" along with
44 rcu_read_lock_sched_held(). This is useful in code that
45 is invoked by both RCU-sched readers and updaters.
46 srcu_dereference_check(p, c):
47 Use explicit check expression "c" along with
48 srcu_read_lock_held()(). This is useful in code that
49 is invoked by both SRCU readers and updaters.
50 rcu_dereference_index_check(p, c):
51 Use explicit check expression "c", but the caller
52 must supply one of the rcu_read_lock_held() functions.
53 This is useful in code that uses RCU-protected arrays
54 that is invoked by both RCU readers and updaters.
55 rcu_dereference_raw(p):
56 Don't check. (Use sparingly, if at all.) 38 Don't check. (Use sparingly, if at all.)
57 rcu_dereference_protected(p, c): 39 rcu_dereference_protected(p, c):
58 Use explicit check expression "c", and omit all barriers 40 Use explicit check expression "c", and omit all barriers
@@ -66,11 +48,13 @@ checking of rcu_dereference() primitives:
66 value of the pointer itself, for example, against NULL. 48 value of the pointer itself, for example, against NULL.
67 49
68The rcu_dereference_check() check expression can be any boolean 50The rcu_dereference_check() check expression can be any boolean
69expression, but would normally include a lockdep expression. However, 51expression, but would normally include one of the rcu_read_lock_held()
70any boolean expression can be used. For a moderately ornate example, 52family of functions and a lockdep expression. However, any boolean
71consider the following: 53expression can be used. For a moderately ornate example, consider
54the following:
72 55
73 file = rcu_dereference_check(fdt->fd[fd], 56 file = rcu_dereference_check(fdt->fd[fd],
57 rcu_read_lock_held() ||
74 lockdep_is_held(&files->file_lock) || 58 lockdep_is_held(&files->file_lock) ||
75 atomic_read(&files->count) == 1); 59 atomic_read(&files->count) == 1);
76 60
@@ -78,7 +62,7 @@ This expression picks up the pointer "fdt->fd[fd]" in an RCU-safe manner,
78and, if CONFIG_PROVE_RCU is configured, verifies that this expression 62and, if CONFIG_PROVE_RCU is configured, verifies that this expression
79is used in: 63is used in:
80 64
811. An RCU read-side critical section (implicit), or 651. An RCU read-side critical section, or
822. with files->file_lock held, or 662. with files->file_lock held, or
833. on an unshared files_struct. 673. on an unshared files_struct.
84 68
diff --git a/Documentation/RCU/rcu.txt b/Documentation/RCU/rcu.txt
index bf778332a28..31852705b58 100644
--- a/Documentation/RCU/rcu.txt
+++ b/Documentation/RCU/rcu.txt
@@ -38,11 +38,11 @@ o How can the updater tell when a grace period has completed
38 38
39 Preemptible variants of RCU (CONFIG_TREE_PREEMPT_RCU) get the 39 Preemptible variants of RCU (CONFIG_TREE_PREEMPT_RCU) get the
40 same effect, but require that the readers manipulate CPU-local 40 same effect, but require that the readers manipulate CPU-local
41 counters. These counters allow limited types of blocking within 41 counters. These counters allow limited types of blocking
42 RCU read-side critical sections. SRCU also uses CPU-local 42 within RCU read-side critical sections. SRCU also uses
43 counters, and permits general blocking within RCU read-side 43 CPU-local counters, and permits general blocking within
44 critical sections. These variants of RCU detect grace periods 44 RCU read-side critical sections. These two variants of
45 by sampling these counters. 45 RCU detect grace periods by sampling these counters.
46 46
47o If I am running on a uniprocessor kernel, which can only do one 47o If I am running on a uniprocessor kernel, which can only do one
48 thing at a time, why should I wait for a grace period? 48 thing at a time, why should I wait for a grace period?
diff --git a/Documentation/RCU/rcubarrier.txt b/Documentation/RCU/rcubarrier.txt
index 38428c12513..e439a0edee2 100644
--- a/Documentation/RCU/rcubarrier.txt
+++ b/Documentation/RCU/rcubarrier.txt
@@ -79,6 +79,8 @@ complete. Pseudo-code using rcu_barrier() is as follows:
79 2. Execute rcu_barrier(). 79 2. Execute rcu_barrier().
80 3. Allow the module to be unloaded. 80 3. Allow the module to be unloaded.
81 81
82Quick Quiz #1: Why is there no srcu_barrier()?
83
82The rcutorture module makes use of rcu_barrier in its exit function 84The rcutorture module makes use of rcu_barrier in its exit function
83as follows: 85as follows:
84 86
@@ -160,7 +162,7 @@ for any pre-existing callbacks to complete.
160Then lines 55-62 print status and do operation-specific cleanup, and 162Then lines 55-62 print status and do operation-specific cleanup, and
161then return, permitting the module-unload operation to be completed. 163then return, permitting the module-unload operation to be completed.
162 164
163Quick Quiz #1: Is there any other situation where rcu_barrier() might 165Quick Quiz #2: Is there any other situation where rcu_barrier() might
164 be required? 166 be required?
165 167
166Your module might have additional complications. For example, if your 168Your module might have additional complications. For example, if your
@@ -240,7 +242,7 @@ reaches zero, as follows:
240 4 complete(&rcu_barrier_completion); 242 4 complete(&rcu_barrier_completion);
241 5 } 243 5 }
242 244
243Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes 245Quick Quiz #3: What happens if CPU 0's rcu_barrier_func() executes
244 immediately (thus incrementing rcu_barrier_cpu_count to the 246 immediately (thus incrementing rcu_barrier_cpu_count to the
245 value one), but the other CPU's rcu_barrier_func() invocations 247 value one), but the other CPU's rcu_barrier_func() invocations
246 are delayed for a full grace period? Couldn't this result in 248 are delayed for a full grace period? Couldn't this result in
@@ -257,7 +259,12 @@ so that your module may be safely unloaded.
257 259
258Answers to Quick Quizzes 260Answers to Quick Quizzes
259 261
260Quick Quiz #1: Is there any other situation where rcu_barrier() might 262Quick Quiz #1: Why is there no srcu_barrier()?
263
264Answer: Since there is no call_srcu(), there can be no outstanding SRCU
265 callbacks. Therefore, there is no need to wait for them.
266
267Quick Quiz #2: Is there any other situation where rcu_barrier() might
261 be required? 268 be required?
262 269
263Answer: Interestingly enough, rcu_barrier() was not originally 270Answer: Interestingly enough, rcu_barrier() was not originally
@@ -271,7 +278,7 @@ Answer: Interestingly enough, rcu_barrier() was not originally
271 implementing rcutorture, and found that rcu_barrier() solves 278 implementing rcutorture, and found that rcu_barrier() solves
272 this problem as well. 279 this problem as well.
273 280
274Quick Quiz #2: What happens if CPU 0's rcu_barrier_func() executes 281Quick Quiz #3: What happens if CPU 0's rcu_barrier_func() executes
275 immediately (thus incrementing rcu_barrier_cpu_count to the 282 immediately (thus incrementing rcu_barrier_cpu_count to the
276 value one), but the other CPU's rcu_barrier_func() invocations 283 value one), but the other CPU's rcu_barrier_func() invocations
277 are delayed for a full grace period? Couldn't this result in 284 are delayed for a full grace period? Couldn't this result in
diff --git a/Documentation/RCU/rcuref.txt b/Documentation/RCU/rcuref.txt
index 141d531aa14..4202ad09313 100644
--- a/Documentation/RCU/rcuref.txt
+++ b/Documentation/RCU/rcuref.txt
@@ -20,7 +20,7 @@ release_referenced() delete()
20{ { 20{ {
21 ... write_lock(&list_lock); 21 ... write_lock(&list_lock);
22 atomic_dec(&el->rc, relfunc) ... 22 atomic_dec(&el->rc, relfunc) ...
23 ... remove_element 23 ... delete_element
24} write_unlock(&list_lock); 24} write_unlock(&list_lock);
25 ... 25 ...
26 if (atomic_dec_and_test(&el->rc)) 26 if (atomic_dec_and_test(&el->rc))
@@ -52,7 +52,7 @@ release_referenced() delete()
52{ { 52{ {
53 ... spin_lock(&list_lock); 53 ... spin_lock(&list_lock);
54 if (atomic_dec_and_test(&el->rc)) ... 54 if (atomic_dec_and_test(&el->rc)) ...
55 call_rcu(&el->head, el_free); remove_element 55 call_rcu(&el->head, el_free); delete_element
56 ... spin_unlock(&list_lock); 56 ... spin_unlock(&list_lock);
57} ... 57} ...
58 if (atomic_dec_and_test(&el->rc)) 58 if (atomic_dec_and_test(&el->rc))
@@ -64,60 +64,3 @@ Sometimes, a reference to the element needs to be obtained in the
64update (write) stream. In such cases, atomic_inc_not_zero() might be 64update (write) stream. In such cases, atomic_inc_not_zero() might be
65overkill, since we hold the update-side spinlock. One might instead 65overkill, since we hold the update-side spinlock. One might instead
66use atomic_inc() in such cases. 66use atomic_inc() in such cases.
67
68It is not always convenient to deal with "FAIL" in the
69search_and_reference() code path. In such cases, the
70atomic_dec_and_test() may be moved from delete() to el_free()
71as follows:
72
731. 2.
74add() search_and_reference()
75{ {
76 alloc_object rcu_read_lock();
77 ... search_for_element
78 atomic_set(&el->rc, 1); atomic_inc(&el->rc);
79 spin_lock(&list_lock); ...
80
81 add_element rcu_read_unlock();
82 ... }
83 spin_unlock(&list_lock); 4.
84} delete()
853. {
86release_referenced() spin_lock(&list_lock);
87{ ...
88 ... remove_element
89 if (atomic_dec_and_test(&el->rc)) spin_unlock(&list_lock);
90 kfree(el); ...
91 ... call_rcu(&el->head, el_free);
92} ...
935. }
94void el_free(struct rcu_head *rhp)
95{
96 release_referenced();
97}
98
99The key point is that the initial reference added by add() is not removed
100until after a grace period has elapsed following removal. This means that
101search_and_reference() cannot find this element, which means that the value
102of el->rc cannot increase. Thus, once it reaches zero, there are no
103readers that can or ever will be able to reference the element. The
104element can therefore safely be freed. This in turn guarantees that if
105any reader finds the element, that reader may safely acquire a reference
106without checking the value of the reference counter.
107
108In cases where delete() can sleep, synchronize_rcu() can be called from
109delete(), so that el_free() can be subsumed into delete as follows:
110
1114.
112delete()
113{
114 spin_lock(&list_lock);
115 ...
116 remove_element
117 spin_unlock(&list_lock);
118 ...
119 synchronize_rcu();
120 if (atomic_dec_and_test(&el->rc))
121 kfree(el);
122 ...
123}
diff --git a/Documentation/RCU/stallwarn.txt b/Documentation/RCU/stallwarn.txt
index 1927151b386..4e959208f73 100644
--- a/Documentation/RCU/stallwarn.txt
+++ b/Documentation/RCU/stallwarn.txt
@@ -12,38 +12,14 @@ CONFIG_RCU_CPU_STALL_TIMEOUT
12 This kernel configuration parameter defines the period of time 12 This kernel configuration parameter defines the period of time
13 that RCU will wait from the beginning of a grace period until it 13 that RCU will wait from the beginning of a grace period until it
14 issues an RCU CPU stall warning. This time period is normally 14 issues an RCU CPU stall warning. This time period is normally
15 sixty seconds. 15 ten seconds.
16 16
17 This configuration parameter may be changed at runtime via the 17RCU_SECONDS_TILL_STALL_RECHECK
18 /sys/module/rcutree/parameters/rcu_cpu_stall_timeout, however
19 this parameter is checked only at the beginning of a cycle.
20 So if you are 30 seconds into a 70-second stall, setting this
21 sysfs parameter to (say) five will shorten the timeout for the
22 -next- stall, or the following warning for the current stall
23 (assuming the stall lasts long enough). It will not affect the
24 timing of the next warning for the current stall.
25 18
26 Stall-warning messages may be enabled and disabled completely via 19 This macro defines the period of time that RCU will wait after
27 /sys/module/rcutree/parameters/rcu_cpu_stall_suppress. 20 issuing a stall warning until it issues another stall warning
28 21 for the same stall. This time period is normally set to three
29CONFIG_RCU_CPU_STALL_VERBOSE 22 times the check interval plus thirty seconds.
30
31 This kernel configuration parameter causes the stall warning to
32 also dump the stacks of any tasks that are blocking the current
33 RCU-preempt grace period.
34
35RCU_CPU_STALL_INFO
36
37 This kernel configuration parameter causes the stall warning to
38 print out additional per-CPU diagnostic information, including
39 information on scheduling-clock ticks and RCU's idle-CPU tracking.
40
41RCU_STALL_DELAY_DELTA
42
43 Although the lockdep facility is extremely useful, it does add
44 some overhead. Therefore, under CONFIG_PROVE_RCU, the
45 RCU_STALL_DELAY_DELTA macro allows five extra seconds before
46 giving an RCU CPU stall warning message.
47 23
48RCU_STALL_RAT_DELAY 24RCU_STALL_RAT_DELAY
49 25
@@ -88,54 +64,6 @@ INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffi
88 64
89This is rare, but does happen from time to time in real life. 65This is rare, but does happen from time to time in real life.
90 66
91If the CONFIG_RCU_CPU_STALL_INFO kernel configuration parameter is set,
92more information is printed with the stall-warning message, for example:
93
94 INFO: rcu_preempt detected stall on CPU
95 0: (63959 ticks this GP) idle=241/3fffffffffffffff/0
96 (t=65000 jiffies)
97
98In kernels with CONFIG_RCU_FAST_NO_HZ, even more information is
99printed:
100
101 INFO: rcu_preempt detected stall on CPU
102 0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 drain=0 . timer not pending
103 (t=65000 jiffies)
104
105The "(64628 ticks this GP)" indicates that this CPU has taken more
106than 64,000 scheduling-clock interrupts during the current stalled
107grace period. If the CPU was not yet aware of the current grace
108period (for example, if it was offline), then this part of the message
109indicates how many grace periods behind the CPU is.
110
111The "idle=" portion of the message prints the dyntick-idle state.
112The hex number before the first "/" is the low-order 12 bits of the
113dynticks counter, which will have an even-numbered value if the CPU is
114in dyntick-idle mode and an odd-numbered value otherwise. The hex
115number between the two "/"s is the value of the nesting, which will
116be a small positive number if in the idle loop and a very large positive
117number (as shown above) otherwise.
118
119For CONFIG_RCU_FAST_NO_HZ kernels, the "drain=0" indicates that the CPU is
120not in the process of trying to force itself into dyntick-idle state, the
121"." indicates that the CPU has not given up forcing RCU into dyntick-idle
122mode (it would be "H" otherwise), and the "timer not pending" indicates
123that the CPU has not recently forced RCU into dyntick-idle mode (it
124would otherwise indicate the number of microseconds remaining in this
125forced state).
126
127
128Multiple Warnings From One Stall
129
130If a stall lasts long enough, multiple stall-warning messages will be
131printed for it. The second and subsequent messages are printed at
132longer intervals, so that the time between (say) the first and second
133message will be about three times the interval between the beginning
134of the stall and the first message.
135
136
137What Causes RCU CPU Stall Warnings?
138
139So your kernel printed an RCU CPU stall warning. The next question is 67So your kernel printed an RCU CPU stall warning. The next question is
140"What caused it?" The following problems can result in RCU CPU stall 68"What caused it?" The following problems can result in RCU CPU stall
141warnings: 69warnings:
@@ -173,11 +101,6 @@ o A CPU-bound real-time task in a CONFIG_PREEMPT_RT kernel that
173 CONFIG_TREE_PREEMPT_RCU case, you might see stall-warning 101 CONFIG_TREE_PREEMPT_RCU case, you might see stall-warning
174 messages. 102 messages.
175 103
176o A hardware or software issue shuts off the scheduler-clock
177 interrupt on a CPU that is not in dyntick-idle mode. This
178 problem really has happened, and seems to be most likely to
179 result in RCU CPU stall warnings for CONFIG_NO_HZ=n kernels.
180
181o A bug in the RCU implementation. 104o A bug in the RCU implementation.
182 105
183o A hardware failure. This is quite unlikely, but has occurred 106o A hardware failure. This is quite unlikely, but has occurred
@@ -186,11 +109,12 @@ o A hardware failure. This is quite unlikely, but has occurred
186 This resulted in a series of RCU CPU stall warnings, eventually 109 This resulted in a series of RCU CPU stall warnings, eventually
187 leading the realization that the CPU had failed. 110 leading the realization that the CPU had failed.
188 111
189The RCU, RCU-sched, and RCU-bh implementations have CPU stall warning. 112The RCU, RCU-sched, and RCU-bh implementations have CPU stall
190SRCU does not have its own CPU stall warnings, but its calls to 113warning. SRCU does not have its own CPU stall warnings, but its
191synchronize_sched() will result in RCU-sched detecting RCU-sched-related 114calls to synchronize_sched() will result in RCU-sched detecting
192CPU stalls. Please note that RCU only detects CPU stalls when there is 115RCU-sched-related CPU stalls. Please note that RCU only detects
193a grace period in progress. No grace period, no CPU stall warnings. 116CPU stalls when there is a grace period in progress. No grace period,
117no CPU stall warnings.
194 118
195To diagnose the cause of the stall, inspect the stack traces. 119To diagnose the cause of the stall, inspect the stack traces.
196The offending function will usually be near the top of the stack. 120The offending function will usually be near the top of the stack.
@@ -200,5 +124,4 @@ is occurring, which will usually be in the function nearest the top of
200that portion of the stack which remains the same from trace to trace. 124that portion of the stack which remains the same from trace to trace.
201If you can reliably trigger the stall, ftrace can be quite helpful. 125If you can reliably trigger the stall, ftrace can be quite helpful.
202 126
203RCU bugs can often be debugged with the help of CONFIG_RCU_TRACE 127RCU bugs can often be debugged with the help of CONFIG_RCU_TRACE.
204and with RCU's event tracing.
diff --git a/Documentation/RCU/torture.txt b/Documentation/RCU/torture.txt
index 7dce8a17eac..5d9016795fd 100644
--- a/Documentation/RCU/torture.txt
+++ b/Documentation/RCU/torture.txt
@@ -42,21 +42,11 @@ fqs_holdoff Holdoff time (in microseconds) between consecutive calls
42fqs_stutter Wait time (in seconds) between consecutive bursts 42fqs_stutter Wait time (in seconds) between consecutive bursts
43 of calls to force_quiescent_state(). 43 of calls to force_quiescent_state().
44 44
45irqreader Says to invoke RCU readers from irq level. This is currently 45irqreaders Says to invoke RCU readers from irq level. This is currently
46 done via timers. Defaults to "1" for variants of RCU that 46 done via timers. Defaults to "1" for variants of RCU that
47 permit this. (Or, more accurately, variants of RCU that do 47 permit this. (Or, more accurately, variants of RCU that do
48 -not- permit this know to ignore this variable.) 48 -not- permit this know to ignore this variable.)
49 49
50n_barrier_cbs If this is nonzero, RCU barrier testing will be conducted,
51 in which case n_barrier_cbs specifies the number of
52 RCU callbacks (and corresponding kthreads) to use for
53 this testing. The value cannot be negative. If you
54 specify this to be non-zero when torture_type indicates a
55 synchronous RCU implementation (one for which a member of
56 the synchronize_rcu() rather than the call_rcu() family is
57 used -- see the documentation for torture_type below), an
58 error will be reported and no testing will be carried out.
59
60nfakewriters This is the number of RCU fake writer threads to run. Fake 50nfakewriters This is the number of RCU fake writer threads to run. Fake
61 writer threads repeatedly use the synchronous "wait for 51 writer threads repeatedly use the synchronous "wait for
62 current readers" function of the interface selected by 52 current readers" function of the interface selected by
@@ -71,49 +61,11 @@ nreaders This is the number of RCU reading threads supported.
71 To properly exercise RCU implementations with preemptible 61 To properly exercise RCU implementations with preemptible
72 read-side critical sections. 62 read-side critical sections.
73 63
74onoff_interval
75 The number of seconds between each attempt to execute a
76 randomly selected CPU-hotplug operation. Defaults to
77 zero, which disables CPU hotplugging. In HOTPLUG_CPU=n
78 kernels, rcutorture will silently refuse to do any
79 CPU-hotplug operations regardless of what value is
80 specified for onoff_interval.
81
82onoff_holdoff The number of seconds to wait until starting CPU-hotplug
83 operations. This would normally only be used when
84 rcutorture was built into the kernel and started
85 automatically at boot time, in which case it is useful
86 in order to avoid confusing boot-time code with CPUs
87 coming and going.
88
89shuffle_interval 64shuffle_interval
90 The number of seconds to keep the test threads affinitied 65 The number of seconds to keep the test threads affinitied
91 to a particular subset of the CPUs, defaults to 3 seconds. 66 to a particular subset of the CPUs, defaults to 3 seconds.
92 Used in conjunction with test_no_idle_hz. 67 Used in conjunction with test_no_idle_hz.
93 68
94shutdown_secs The number of seconds to run the test before terminating
95 the test and powering off the system. The default is
96 zero, which disables test termination and system shutdown.
97 This capability is useful for automated testing.
98
99stall_cpu The number of seconds that a CPU should be stalled while
100 within both an rcu_read_lock() and a preempt_disable().
101 This stall happens only once per rcutorture run.
102 If you need multiple stalls, use modprobe and rmmod to
103 repeatedly run rcutorture. The default for stall_cpu
104 is zero, which prevents rcutorture from stalling a CPU.
105
106 Note that attempts to rmmod rcutorture while the stall
107 is ongoing will hang, so be careful what value you
108 choose for this module parameter! In addition, too-large
109 values for stall_cpu might well induce failures and
110 warnings in other parts of the kernel. You have been
111 warned!
112
113stall_cpu_holdoff
114 The number of seconds to wait after rcutorture starts
115 before stalling a CPU. Defaults to 10 seconds.
116
117stat_interval The number of seconds between output of torture 69stat_interval The number of seconds between output of torture
118 statistics (via printk()). Regardless of the interval, 70 statistics (via printk()). Regardless of the interval,
119 statistics are printed when the module is unloaded. 71 statistics are printed when the module is unloaded.
@@ -127,77 +79,19 @@ stutter The length of time to run the test before pausing for this
127 Specifying "stutter=0" causes the test to run continuously 79 Specifying "stutter=0" causes the test to run continuously
128 without pausing, which is the old default behavior. 80 without pausing, which is the old default behavior.
129 81
130test_boost Whether or not to test the ability of RCU to do priority
131 boosting. Defaults to "test_boost=1", which performs
132 RCU priority-inversion testing only if the selected
133 RCU implementation supports priority boosting. Specifying
134 "test_boost=0" never performs RCU priority-inversion
135 testing. Specifying "test_boost=2" performs RCU
136 priority-inversion testing even if the selected RCU
137 implementation does not support RCU priority boosting,
138 which can be used to test rcutorture's ability to
139 carry out RCU priority-inversion testing.
140
141test_boost_interval
142 The number of seconds in an RCU priority-inversion test
143 cycle. Defaults to "test_boost_interval=7". It is
144 usually wise for this value to be relatively prime to
145 the value selected for "stutter".
146
147test_boost_duration
148 The number of seconds to do RCU priority-inversion testing
149 within any given "test_boost_interval". Defaults to
150 "test_boost_duration=4".
151
152test_no_idle_hz Whether or not to test the ability of RCU to operate in 82test_no_idle_hz Whether or not to test the ability of RCU to operate in
153 a kernel that disables the scheduling-clock interrupt to 83 a kernel that disables the scheduling-clock interrupt to
154 idle CPUs. Boolean parameter, "1" to test, "0" otherwise. 84 idle CPUs. Boolean parameter, "1" to test, "0" otherwise.
155 Defaults to omitting this test. 85 Defaults to omitting this test.
156 86
157torture_type The type of RCU to test, with string values as follows: 87torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API,
158 88 "rcu_sync" for rcu_read_lock() with synchronous reclamation,
159 "rcu": rcu_read_lock(), rcu_read_unlock() and call_rcu(). 89 "rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for
160 90 rcu_read_lock_bh() with synchronous reclamation, "srcu" for
161 "rcu_sync": rcu_read_lock(), rcu_read_unlock(), and 91 the "srcu_read_lock()" API, "sched" for the use of
162 synchronize_rcu(). 92 preempt_disable() together with synchronize_sched(),
163 93 and "sched_expedited" for the use of preempt_disable()
164 "rcu_expedited": rcu_read_lock(), rcu_read_unlock(), and 94 with synchronize_sched_expedited().
165 synchronize_rcu_expedited().
166
167 "rcu_bh": rcu_read_lock_bh(), rcu_read_unlock_bh(), and
168 call_rcu_bh().
169
170 "rcu_bh_sync": rcu_read_lock_bh(), rcu_read_unlock_bh(),
171 and synchronize_rcu_bh().
172
173 "rcu_bh_expedited": rcu_read_lock_bh(), rcu_read_unlock_bh(),
174 and synchronize_rcu_bh_expedited().
175
176 "srcu": srcu_read_lock(), srcu_read_unlock() and
177 call_srcu().
178
179 "srcu_sync": srcu_read_lock(), srcu_read_unlock() and
180 synchronize_srcu().
181
182 "srcu_expedited": srcu_read_lock(), srcu_read_unlock() and
183 synchronize_srcu_expedited().
184
185 "srcu_raw": srcu_read_lock_raw(), srcu_read_unlock_raw(),
186 and call_srcu().
187
188 "srcu_raw_sync": srcu_read_lock_raw(), srcu_read_unlock_raw(),
189 and synchronize_srcu().
190
191 "sched": preempt_disable(), preempt_enable(), and
192 call_rcu_sched().
193
194 "sched_sync": preempt_disable(), preempt_enable(), and
195 synchronize_sched().
196
197 "sched_expedited": preempt_disable(), preempt_enable(), and
198 synchronize_sched_expedited().
199
200 Defaults to "rcu".
201 95
202verbose Enable debug printk()s. Default is disabled. 96verbose Enable debug printk()s. Default is disabled.
203 97
@@ -206,12 +100,12 @@ OUTPUT
206 100
207The statistics output is as follows: 101The statistics output is as follows:
208 102
209 rcu-torture:--- Start of test: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 103 rcu-torture: --- Start of test: nreaders=16 stat_interval=0 verbose=0
210 rcu-torture: rtc: (null) ver: 155441 tfle: 0 rta: 155441 rtaf: 8884 rtf: 155440 rtmbe: 0 rtbe: 0 rtbke: 0 rtbre: 0 rtbf: 0 rtb: 0 nt: 3055767 104 rcu-torture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915
211 rcu-torture: Reader Pipe: 727860534 34213 0 0 0 0 0 0 0 0 0 105 rcu-torture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0
212 rcu-torture: Reader Batch: 727877838 17003 0 0 0 0 0 0 0 0 0 106 rcu-torture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0
213 rcu-torture: Free-Block Circulation: 155440 155440 155440 155440 155440 155440 155440 155440 155440 155440 0 107 rcu-torture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0
214 rcu-torture:--- End of test: SUCCESS: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4 108 rcu-torture: --- End of test
215 109
216The command "dmesg | grep torture:" will extract this information on 110The command "dmesg | grep torture:" will extract this information on
217most systems. On more esoteric configurations, it may be necessary to 111most systems. On more esoteric configurations, it may be necessary to
@@ -219,58 +113,26 @@ use other commands to access the output of the printk()s used by
219the RCU torture test. The printk()s use KERN_ALERT, so they should 113the RCU torture test. The printk()s use KERN_ALERT, so they should
220be evident. ;-) 114be evident. ;-)
221 115
222The first and last lines show the rcutorture module parameters, and the
223last line shows either "SUCCESS" or "FAILURE", based on rcutorture's
224automatic determination as to whether RCU operated correctly.
225
226The entries are as follows: 116The entries are as follows:
227 117
228o "rtc": The hexadecimal address of the structure currently visible 118o "rtc": The hexadecimal address of the structure currently visible
229 to readers. 119 to readers.
230 120
231o "ver": The number of times since boot that the RCU writer task 121o "ver": The number of times since boot that the rcutw writer task
232 has changed the structure visible to readers. 122 has changed the structure visible to readers.
233 123
234o "tfle": If non-zero, indicates that the "torture freelist" 124o "tfle": If non-zero, indicates that the "torture freelist"
235 containing structures to be placed into the "rtc" area is empty. 125 containing structure to be placed into the "rtc" area is empty.
236 This condition is important, since it can fool you into thinking 126 This condition is important, since it can fool you into thinking
237 that RCU is working when it is not. :-/ 127 that RCU is working when it is not. :-/
238 128
239o "rta": Number of structures allocated from the torture freelist. 129o "rta": Number of structures allocated from the torture freelist.
240 130
241o "rtaf": Number of allocations from the torture freelist that have 131o "rtaf": Number of allocations from the torture freelist that have
242 failed due to the list being empty. It is not unusual for this 132 failed due to the list being empty.
243 to be non-zero, but it is bad for it to be a large fraction of
244 the value indicated by "rta".
245 133
246o "rtf": Number of frees into the torture freelist. 134o "rtf": Number of frees into the torture freelist.
247 135
248o "rtmbe": A non-zero value indicates that rcutorture believes that
249 rcu_assign_pointer() and rcu_dereference() are not working
250 correctly. This value should be zero.
251
252o "rtbe": A non-zero value indicates that one of the rcu_barrier()
253 family of functions is not working correctly.
254
255o "rtbke": rcutorture was unable to create the real-time kthreads
256 used to force RCU priority inversion. This value should be zero.
257
258o "rtbre": Although rcutorture successfully created the kthreads
259 used to force RCU priority inversion, it was unable to set them
260 to the real-time priority level of 1. This value should be zero.
261
262o "rtbf": The number of times that RCU priority boosting failed
263 to resolve RCU priority inversion.
264
265o "rtb": The number of times that rcutorture attempted to force
266 an RCU priority inversion condition. If you are testing RCU
267 priority boosting via the "test_boost" module parameter, this
268 value should be non-zero.
269
270o "nt": The number of times rcutorture ran RCU read-side code from
271 within a timer handler. This value should be non-zero only
272 if you specified the "irqreader" module parameter.
273
274o "Reader Pipe": Histogram of "ages" of structures seen by readers. 136o "Reader Pipe": Histogram of "ages" of structures seen by readers.
275 If any entries past the first two are non-zero, RCU is broken. 137 If any entries past the first two are non-zero, RCU is broken.
276 And rcutorture prints the error flag string "!!!" to make sure 138 And rcutorture prints the error flag string "!!!" to make sure
@@ -300,15 +162,26 @@ o "Free-Block Circulation": Shows the number of torture structures
300 somehow gets incremented farther than it should. 162 somehow gets incremented farther than it should.
301 163
302Different implementations of RCU can provide implementation-specific 164Different implementations of RCU can provide implementation-specific
303additional information. For example, SRCU provides the following 165additional information. For example, SRCU provides the following:
304additional line:
305 166
167 srcu-torture: rtc: f8cf46a8 ver: 355 tfle: 0 rta: 356 rtaf: 0 rtf: 346 rtmbe: 0
168 srcu-torture: Reader Pipe: 559738 939 0 0 0 0 0 0 0 0 0
169 srcu-torture: Reader Batch: 560434 243 0 0 0 0 0 0 0 0
170 srcu-torture: Free-Block Circulation: 355 354 353 352 351 350 349 348 347 346 0
306 srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1) 171 srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1)
307 172
308This line shows the per-CPU counter state. The numbers in parentheses are 173The first four lines are similar to those for RCU. The last line shows
309the values of the "old" and "current" counters for the corresponding CPU. 174the per-CPU counter state. The numbers in parentheses are the values
310The "idx" value maps the "old" and "current" values to the underlying 175of the "old" and "current" counters for the corresponding CPU. The
311array, and is useful for debugging. 176"idx" value maps the "old" and "current" values to the underlying array,
177and is useful for debugging.
178
179Similarly, sched_expedited RCU provides the following:
180
181 sched_expedited-torture: rtc: d0000000016c1880 ver: 1090796 tfle: 0 rta: 1090796 rtaf: 0 rtf: 1090787 rtmbe: 0 nt: 27713319
182 sched_expedited-torture: Reader Pipe: 12660320201 95875 0 0 0 0 0 0 0 0 0
183 sched_expedited-torture: Reader Batch: 12660424885 0 0 0 0 0 0 0 0 0 0
184 sched_expedited-torture: Free-Block Circulation: 1090795 1090795 1090794 1090793 1090792 1090791 1090790 1090789 1090788 1090787 0
312 185
313 186
314USAGE 187USAGE
@@ -318,13 +191,11 @@ The following script may be used to torture RCU:
318 #!/bin/sh 191 #!/bin/sh
319 192
320 modprobe rcutorture 193 modprobe rcutorture
321 sleep 3600 194 sleep 100
322 rmmod rcutorture 195 rmmod rcutorture
323 dmesg | grep torture: 196 dmesg | grep torture:
324 197
325The output can be manually inspected for the error flag of "!!!". 198The output can be manually inspected for the error flag of "!!!".
326One could of course create a more elaborate script that automatically 199One could of course create a more elaborate script that automatically
327checked for such errors. The "rmmod" command forces a "SUCCESS", 200checked for such errors. The "rmmod" command forces a "SUCCESS" or
328"FAILURE", or "RCU_HOTPLUG" indication to be printk()ed. The first 201"FAILURE" indication to be printk()ed.
329two are self-explanatory, while the last indicates that while there
330were no RCU failures, CPU-hotplug problems were detected.
diff --git a/Documentation/RCU/trace.txt b/Documentation/RCU/trace.txt
index c776968f446..8173cec473a 100644
--- a/Documentation/RCU/trace.txt
+++ b/Documentation/RCU/trace.txt
@@ -10,63 +10,51 @@ for rcutree and next for rcutiny.
10 10
11CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats 11CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats
12 12
13These implementations of RCU provide several debugfs directories under the 13These implementations of RCU provides several debugfs files under the
14top-level directory "rcu": 14top-level directory "rcu":
15 15
16rcu/rcu_bh 16rcu/rcudata:
17rcu/rcu_preempt
18rcu/rcu_sched
19
20Each directory contains files for the corresponding flavor of RCU.
21Note that rcu/rcu_preempt is only present for CONFIG_TREE_PREEMPT_RCU.
22For CONFIG_TREE_RCU, the RCU flavor maps onto the RCU-sched flavor,
23so that activity for both appears in rcu/rcu_sched.
24
25In addition, the following file appears in the top-level directory:
26rcu/rcutorture. This file displays rcutorture test progress. The output
27of "cat rcu/rcutorture" looks as follows:
28
29rcutorture test sequence: 0 (test in progress)
30rcutorture update version number: 615
31
32The first line shows the number of rcutorture tests that have completed
33since boot. If a test is currently running, the "(test in progress)"
34string will appear as shown above. The second line shows the number of
35update cycles that the current test has started, or zero if there is
36no test in progress.
37
38
39Within each flavor directory (rcu/rcu_bh, rcu/rcu_sched, and possibly
40also rcu/rcu_preempt) the following files will be present:
41
42rcudata:
43 Displays fields in struct rcu_data. 17 Displays fields in struct rcu_data.
44rcuexp: 18rcu/rcudata.csv:
45 Displays statistics for expedited grace periods. 19 Comma-separated values spreadsheet version of rcudata.
46rcugp: 20rcu/rcugp:
47 Displays grace-period counters. 21 Displays grace-period counters.
48rcuhier: 22rcu/rcuhier:
49 Displays the struct rcu_node hierarchy. 23 Displays the struct rcu_node hierarchy.
50rcu_pending: 24rcu/rcu_pending:
51 Displays counts of the reasons rcu_pending() decided that RCU had 25 Displays counts of the reasons rcu_pending() decided that RCU had
52 work to do. 26 work to do.
53rcuboost: 27rcu/rcutorture:
28 Displays rcutorture test progress.
29rcu/rcuboost:
54 Displays RCU boosting statistics. Only present if 30 Displays RCU boosting statistics. Only present if
55 CONFIG_RCU_BOOST=y. 31 CONFIG_RCU_BOOST=y.
56 32
57The output of "cat rcu/rcu_preempt/rcudata" looks as follows: 33The output of "cat rcu/rcudata" looks as follows:
58 34
59 0!c=30455 g=30456 pq=1 qp=1 dt=126535/140000000000000/0 df=2002 of=4 ql=0/0 qs=N... b=10 ci=74572 nci=0 co=1131 ca=716 35rcu_sched:
60 1!c=30719 g=30720 pq=1 qp=0 dt=132007/140000000000000/0 df=1874 of=10 ql=0/0 qs=N... b=10 ci=123209 nci=0 co=685 ca=982 36 0 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0
61 2!c=30150 g=30151 pq=1 qp=1 dt=138537/140000000000000/0 df=1707 of=8 ql=0/0 qs=N... b=10 ci=80132 nci=0 co=1328 ca=1458 37 1 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0
62 3 c=31249 g=31250 pq=1 qp=0 dt=107255/140000000000000/0 df=1749 of=6 ql=0/450 qs=NRW. b=10 ci=151700 nci=0 co=509 ca=622 38 2 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0
63 4!c=29502 g=29503 pq=1 qp=1 dt=83647/140000000000000/0 df=965 of=5 ql=0/0 qs=N... b=10 ci=65643 nci=0 co=1373 ca=1521 39 3 c=20942 g=20943 pq=1 pqc=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0
64 5 c=31201 g=31202 pq=1 qp=1 dt=70422/0/0 df=535 of=7 ql=0/0 qs=.... b=10 ci=58500 nci=0 co=764 ca=698 40 4 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0
65 6!c=30253 g=30254 pq=1 qp=1 dt=95363/140000000000000/0 df=780 of=5 ql=0/0 qs=N... b=10 ci=100607 nci=0 co=1414 ca=1353 41 5 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0
66 7 c=31178 g=31178 pq=1 qp=0 dt=91536/0/0 df=547 of=4 ql=0/0 qs=.... b=10 ci=109819 nci=0 co=1115 ca=969 42 6 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0
67 43 7 c=20897 g=20897 pq=1 pqc=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0
68This file has one line per CPU, or eight for this 8-CPU system. 44rcu_bh:
69The fields are as follows: 45 0 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0
46 1 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0
47 2 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0
48 3 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0
49 4 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0
50 5 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0
51 6 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0
52 7 c=1474 g=1474 pq=1 pqc=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0
53
54The first section lists the rcu_data structures for rcu_sched, the second
55for rcu_bh. Note that CONFIG_TREE_PREEMPT_RCU kernels will have an
56additional section for rcu_preempt. Each section has one line per CPU,
57or eight for this 8-CPU system. The fields are as follows:
70 58
71o The number at the beginning of each line is the CPU number. 59o The number at the beginning of each line is the CPU number.
72 CPUs numbers followed by an exclamation mark are offline, 60 CPUs numbers followed by an exclamation mark are offline,
@@ -76,13 +64,11 @@ o The number at the beginning of each line is the CPU number.
76 substantially larger than the number of actual CPUs. 64 substantially larger than the number of actual CPUs.
77 65
78o "c" is the count of grace periods that this CPU believes have 66o "c" is the count of grace periods that this CPU believes have
79 completed. Offlined CPUs and CPUs in dynticks idle mode may lag 67 completed. Offlined CPUs and CPUs in dynticks idle mode may
80 quite a ways behind, for example, CPU 4 under "rcu_sched" above, 68 lag quite a ways behind, for example, CPU 6 under "rcu_sched"
81 which has been offline through 16 RCU grace periods. It is not 69 above, which has been offline through not quite 40,000 RCU grace
82 unusual to see offline CPUs lagging by thousands of grace periods. 70 periods. It is not unusual to see CPUs lagging by thousands of
83 Note that although the grace-period number is an unsigned long, 71 grace periods.
84 it is printed out as a signed long to allow more human-friendly
85 representation near boot time.
86 72
87o "g" is the count of grace periods that this CPU believes have 73o "g" is the count of grace periods that this CPU believes have
88 started. Again, offlined CPUs and CPUs in dynticks idle mode 74 started. Again, offlined CPUs and CPUs in dynticks idle mode
@@ -98,25 +84,34 @@ o "pq" indicates that this CPU has passed through a quiescent state
98 CPU has not yet reported that fact, (2) some other CPU has not 84 CPU has not yet reported that fact, (2) some other CPU has not
99 yet reported for this grace period, or (3) both. 85 yet reported for this grace period, or (3) both.
100 86
87o "pqc" indicates which grace period the last-observed quiescent
88 state for this CPU corresponds to. This is important for handling
89 the race between CPU 0 reporting an extended dynticks-idle
90 quiescent state for CPU 1 and CPU 1 suddenly waking up and
91 reporting its own quiescent state. If CPU 1 was the last CPU
92 for the current grace period, then the CPU that loses this race
93 will attempt to incorrectly mark CPU 1 as having checked in for
94 the next grace period!
95
101o "qp" indicates that RCU still expects a quiescent state from 96o "qp" indicates that RCU still expects a quiescent state from
102 this CPU. Offlined CPUs and CPUs in dyntick idle mode might 97 this CPU. Offlined CPUs and CPUs in dyntick idle mode might
103 well have qp=1, which is OK: RCU is still ignoring them. 98 well have qp=1, which is OK: RCU is still ignoring them.
104 99
105o "dt" is the current value of the dyntick counter that is incremented 100o "dt" is the current value of the dyntick counter that is incremented
106 when entering or leaving idle, either due to a context switch or 101 when entering or leaving dynticks idle state, either by the
107 due to an interrupt. This number is even if the CPU is in idle 102 scheduler or by irq. This number is even if the CPU is in
108 from RCU's viewpoint and odd otherwise. The number after the 103 dyntick idle mode and odd otherwise. The number after the first
109 first "/" is the interrupt nesting depth when in idle state, 104 "/" is the interrupt nesting depth when in dyntick-idle state,
110 or a large number added to the interrupt-nesting depth when 105 or one greater than the interrupt-nesting depth otherwise.
111 running a non-idle task. Some architectures do not accurately 106 The number after the second "/" is the NMI nesting depth.
112 count interrupt nesting when running in non-idle kernel context, 107
113 which can result in interesting anomalies such as negative 108 This field is displayed only for CONFIG_NO_HZ kernels.
114 interrupt-nesting levels. The number after the second "/"
115 is the NMI nesting depth.
116 109
117o "df" is the number of times that some other CPU has forced a 110o "df" is the number of times that some other CPU has forced a
118 quiescent state on behalf of this CPU due to this CPU being in 111 quiescent state on behalf of this CPU due to this CPU being in
119 idle state. 112 dynticks-idle state.
113
114 This field is displayed only for CONFIG_NO_HZ kernels.
120 115
121o "of" is the number of times that some other CPU has forced a 116o "of" is the number of times that some other CPU has forced a
122 quiescent state on behalf of this CPU due to this CPU being 117 quiescent state on behalf of this CPU due to this CPU being
@@ -128,14 +123,14 @@ o "of" is the number of times that some other CPU has forced a
128 CPU is offline when it is really alive and kicking) is a fatal 123 CPU is offline when it is really alive and kicking) is a fatal
129 error, so it makes sense to err conservatively. 124 error, so it makes sense to err conservatively.
130 125
126o "ri" is the number of times that RCU has seen fit to send a
127 reschedule IPI to this CPU in order to get it to report a
128 quiescent state.
129
131o "ql" is the number of RCU callbacks currently residing on 130o "ql" is the number of RCU callbacks currently residing on
132 this CPU. The first number is the number of "lazy" callbacks 131 this CPU. This is the total number of callbacks, regardless
133 that are known to RCU to only be freeing memory, and the number 132 of what state they are in (new, waiting for grace period to
134 after the "/" is the total number of callbacks, lazy or not. 133 start, waiting for grace period to end, ready to invoke).
135 These counters count callbacks regardless of what phase of
136 grace-period processing that they are in (new, waiting for
137 grace period to start, waiting for grace period to end, ready
138 to invoke).
139 134
140o "qs" gives an indication of the state of the callback queue 135o "qs" gives an indication of the state of the callback queue
141 with four characters: 136 with four characters:
@@ -163,43 +158,6 @@ o "qs" gives an indication of the state of the callback queue
163 If there are no callbacks in a given one of the above states, 158 If there are no callbacks in a given one of the above states,
164 the corresponding character is replaced by ".". 159 the corresponding character is replaced by ".".
165 160
166o "b" is the batch limit for this CPU. If more than this number
167 of RCU callbacks is ready to invoke, then the remainder will
168 be deferred.
169
170o "ci" is the number of RCU callbacks that have been invoked for
171 this CPU. Note that ci+nci+ql is the number of callbacks that have
172 been registered in absence of CPU-hotplug activity.
173
174o "nci" is the number of RCU callbacks that have been offloaded from
175 this CPU. This will always be zero unless the kernel was built
176 with CONFIG_RCU_NOCB_CPU=y and the "rcu_nocbs=" kernel boot
177 parameter was specified.
178
179o "co" is the number of RCU callbacks that have been orphaned due to
180 this CPU going offline. These orphaned callbacks have been moved
181 to an arbitrarily chosen online CPU.
182
183o "ca" is the number of RCU callbacks that have been adopted by this
184 CPU due to other CPUs going offline. Note that ci+co-ca+ql is
185 the number of RCU callbacks registered on this CPU.
186
187
188Kernels compiled with CONFIG_RCU_BOOST=y display the following from
189/debug/rcu/rcu_preempt/rcudata:
190
191 0!c=12865 g=12866 pq=1 qp=1 dt=83113/140000000000000/0 df=288 of=11 ql=0/0 qs=N... kt=0/O ktl=944 b=10 ci=60709 nci=0 co=748 ca=871
192 1 c=14407 g=14408 pq=1 qp=0 dt=100679/140000000000000/0 df=378 of=7 ql=0/119 qs=NRW. kt=0/W ktl=9b6 b=10 ci=109740 nci=0 co=589 ca=485
193 2 c=14407 g=14408 pq=1 qp=0 dt=105486/0/0 df=90 of=9 ql=0/89 qs=NRW. kt=0/W ktl=c0c b=10 ci=83113 nci=0 co=533 ca=490
194 3 c=14407 g=14408 pq=1 qp=0 dt=107138/0/0 df=142 of=8 ql=0/188 qs=NRW. kt=0/W ktl=b96 b=10 ci=121114 nci=0 co=426 ca=290
195 4 c=14405 g=14406 pq=1 qp=1 dt=50238/0/0 df=706 of=7 ql=0/0 qs=.... kt=0/W ktl=812 b=10 ci=34929 nci=0 co=643 ca=114
196 5!c=14168 g=14169 pq=1 qp=0 dt=45465/140000000000000/0 df=161 of=11 ql=0/0 qs=N... kt=0/O ktl=b4d b=10 ci=47712 nci=0 co=677 ca=722
197 6 c=14404 g=14405 pq=1 qp=0 dt=59454/0/0 df=94 of=6 ql=0/0 qs=.... kt=0/W ktl=e57 b=10 ci=55597 nci=0 co=701 ca=811
198 7 c=14407 g=14408 pq=1 qp=1 dt=68850/0/0 df=31 of=8 ql=0/0 qs=.... kt=0/W ktl=14bd b=10 ci=77475 nci=0 co=508 ca=1042
199
200This is similar to the output discussed above, but contains the following
201additional fields:
202
203o "kt" is the per-CPU kernel-thread state. The digit preceding 161o "kt" is the per-CPU kernel-thread state. The digit preceding
204 the first slash is zero if there is no work pending and 1 162 the first slash is zero if there is no work pending and 1
205 otherwise. The character between the first pair of slashes is 163 otherwise. The character between the first pair of slashes is
@@ -226,59 +184,39 @@ o "kt" is the per-CPU kernel-thread state. The digit preceding
226 The number after the final slash is the CPU that the kthread 184 The number after the final slash is the CPU that the kthread
227 is actually running on. 185 is actually running on.
228 186
229 This field is displayed only for CONFIG_RCU_BOOST kernels.
230
231o "ktl" is the low-order 16 bits (in hexadecimal) of the count of 187o "ktl" is the low-order 16 bits (in hexadecimal) of the count of
232 the number of times that this CPU's per-CPU kthread has gone 188 the number of times that this CPU's per-CPU kthread has gone
233 through its loop servicing invoke_rcu_cpu_kthread() requests. 189 through its loop servicing invoke_rcu_cpu_kthread() requests.
234 190
235 This field is displayed only for CONFIG_RCU_BOOST kernels. 191o "b" is the batch limit for this CPU. If more than this number
236 192 of RCU callbacks is ready to invoke, then the remainder will
237 193 be deferred.
238The output of "cat rcu/rcu_preempt/rcuexp" looks as follows:
239
240s=21872 d=21872 w=0 tf=0 wd1=0 wd2=0 n=0 sc=21872 dt=21872 dl=0 dx=21872
241
242These fields are as follows:
243
244o "s" is the starting sequence number.
245
246o "d" is the ending sequence number. When the starting and ending
247 numbers differ, there is an expedited grace period in progress.
248
249o "w" is the number of times that the sequence numbers have been
250 in danger of wrapping.
251
252o "tf" is the number of times that contention has resulted in a
253 failure to begin an expedited grace period.
254
255o "wd1" and "wd2" are the number of times that an attempt to
256 start an expedited grace period found that someone else had
257 completed an expedited grace period that satisfies the
258 attempted request. "Our work is done."
259
260o "n" is number of times that contention was so great that
261 the request was demoted from an expedited grace period to
262 a normal grace period.
263 194
264o "sc" is the number of times that the attempt to start a 195o "ci" is the number of RCU callbacks that have been invoked for
265 new expedited grace period succeeded. 196 this CPU. Note that ci+ql is the number of callbacks that have
197 been registered in absence of CPU-hotplug activity.
266 198
267o "dt" is the number of times that we attempted to update 199o "co" is the number of RCU callbacks that have been orphaned due to
268 the "d" counter. 200 this CPU going offline. These orphaned callbacks have been moved
201 to an arbitrarily chosen online CPU.
269 202
270o "dl" is the number of times that we failed to update the "d" 203o "ca" is the number of RCU callbacks that have been adopted due to
271 counter. 204 other CPUs going offline. Note that ci+co-ca+ql is the number of
205 RCU callbacks registered on this CPU.
272 206
273o "dx" is the number of times that we succeeded in updating 207There is also an rcu/rcudata.csv file with the same information in
274 the "d" counter. 208comma-separated-variable spreadsheet format.
275 209
276 210
277The output of "cat rcu/rcu_preempt/rcugp" looks as follows: 211The output of "cat rcu/rcugp" looks as follows:
278 212
279completed=31249 gpnum=31250 age=1 max=18 213rcu_sched: completed=33062 gpnum=33063
214rcu_bh: completed=464 gpnum=464
280 215
281These fields are taken from the rcu_state structure, and are as follows: 216Again, this output is for both "rcu_sched" and "rcu_bh". Note that
217kernels built with CONFIG_TREE_PREEMPT_RCU will have an additional
218"rcu_preempt" line. The fields are taken from the rcu_state structure,
219and are as follows:
282 220
283o "completed" is the number of grace periods that have completed. 221o "completed" is the number of grace periods that have completed.
284 It is comparable to the "c" field from rcu/rcudata in that a 222 It is comparable to the "c" field from rcu/rcudata in that a
@@ -286,42 +224,44 @@ o "completed" is the number of grace periods that have completed.
286 that the corresponding RCU grace period has completed. 224 that the corresponding RCU grace period has completed.
287 225
288o "gpnum" is the number of grace periods that have started. It is 226o "gpnum" is the number of grace periods that have started. It is
289 similarly comparable to the "g" field from rcu/rcudata in that 227 comparable to the "g" field from rcu/rcudata in that a CPU
290 a CPU whose "g" field matches the value of "gpnum" is aware that 228 whose "g" field matches the value of "gpnum" is aware that the
291 the corresponding RCU grace period has started. 229 corresponding RCU grace period has started.
292
293 If these two fields are equal, then there is no grace period
294 in progress, in other words, RCU is idle. On the other hand,
295 if the two fields differ (as they are above), then an RCU grace
296 period is in progress.
297 230
298o "age" is the number of jiffies that the current grace period 231 If these two fields are equal (as they are for "rcu_bh" above),
299 has extended for, or zero if there is no grace period currently 232 then there is no grace period in progress, in other words, RCU
300 in effect. 233 is idle. On the other hand, if the two fields differ (as they
234 do for "rcu_sched" above), then an RCU grace period is in progress.
301 235
302o "max" is the age in jiffies of the longest-duration grace period
303 thus far.
304 236
305The output of "cat rcu/rcu_preempt/rcuhier" looks as follows: 237The output of "cat rcu/rcuhier" looks as follows, with very long lines:
306 238
307c=14407 g=14408 s=0 jfq=2 j=c863 nfqs=12040/nfqsng=0(12040) fqlh=1051 oqlen=0/0 239c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6
3083/3 ..>. 0:7 ^0 2401/1 ..>. 0:127 ^0
309e/e ..>. 0:3 ^0 d/d ..>. 4:7 ^1 2413/3 ..>. 0:35 ^0 0/0 ..>. 36:71 ^1 0/0 ..>. 72:107 ^2 0/0 ..>. 108:127 ^3
2423/3f ..>. 0:5 ^0 2/3 ..>. 6:11 ^1 0/0 ..>. 12:17 ^2 0/0 ..>. 18:23 ^3 0/0 ..>. 24:29 ^4 0/0 ..>. 30:35 ^5 0/0 ..>. 36:41 ^0 0/0 ..>. 42:47 ^1 0/0 ..>. 48:53 ^2 0/0 ..>. 54:59 ^3 0/0 ..>. 60:65 ^4 0/0 ..>. 66:71 ^5 0/0 ..>. 72:77 ^0 0/0 ..>. 78:83 ^1 0/0 ..>. 84:89 ^2 0/0 ..>. 90:95 ^3 0/0 ..>. 96:101 ^4 0/0 ..>. 102:107 ^5 0/0 ..>. 108:113 ^0 0/0 ..>. 114:119 ^1 0/0 ..>. 120:125 ^2 0/0 ..>. 126:127 ^3
243rcu_bh:
244c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0
2450/1 ..>. 0:127 ^0
2460/3 ..>. 0:35 ^0 0/0 ..>. 36:71 ^1 0/0 ..>. 72:107 ^2 0/0 ..>. 108:127 ^3
2470/3f ..>. 0:5 ^0 0/3 ..>. 6:11 ^1 0/0 ..>. 12:17 ^2 0/0 ..>. 18:23 ^3 0/0 ..>. 24:29 ^4 0/0 ..>. 30:35 ^5 0/0 ..>. 36:41 ^0 0/0 ..>. 42:47 ^1 0/0 ..>. 48:53 ^2 0/0 ..>. 54:59 ^3 0/0 ..>. 60:65 ^4 0/0 ..>. 66:71 ^5 0/0 ..>. 72:77 ^0 0/0 ..>. 78:83 ^1 0/0 ..>. 84:89 ^2 0/0 ..>. 90:95 ^3 0/0 ..>. 96:101 ^4 0/0 ..>. 102:107 ^5 0/0 ..>. 108:113 ^0 0/0 ..>. 114:119 ^1 0/0 ..>. 120:125 ^2 0/0 ..>. 126:127 ^3
310 248
311The fields are as follows: 249This is once again split into "rcu_sched" and "rcu_bh" portions,
250and CONFIG_TREE_PREEMPT_RCU kernels will again have an additional
251"rcu_preempt" section. The fields are as follows:
312 252
313o "c" is exactly the same as "completed" under rcu/rcu_preempt/rcugp. 253o "c" is exactly the same as "completed" under rcu/rcugp.
314 254
315o "g" is exactly the same as "gpnum" under rcu/rcu_preempt/rcugp. 255o "g" is exactly the same as "gpnum" under rcu/rcugp.
316 256
317o "s" is the current state of the force_quiescent_state() 257o "s" is the "signaled" state that drives force_quiescent_state()'s
318 state machine. 258 state machine.
319 259
320o "jfq" is the number of jiffies remaining for this grace period 260o "jfq" is the number of jiffies remaining for this grace period
321 before force_quiescent_state() is invoked to help push things 261 before force_quiescent_state() is invoked to help push things
322 along. Note that CPUs in idle mode throughout the grace period 262 along. Note that CPUs in dyntick-idle mode throughout the grace
323 will not report on their own, but rather must be check by some 263 period will not report on their own, but rather must be check by
324 other CPU via force_quiescent_state(). 264 some other CPU via force_quiescent_state().
325 265
326o "j" is the low-order four hex digits of the jiffies counter. 266o "j" is the low-order four hex digits of the jiffies counter.
327 Yes, Paul did run into a number of problems that turned out to 267 Yes, Paul did run into a number of problems that turned out to
@@ -332,8 +272,7 @@ o "nfqs" is the number of calls to force_quiescent_state() since
332 272
333o "nfqsng" is the number of useless calls to force_quiescent_state(), 273o "nfqsng" is the number of useless calls to force_quiescent_state(),
334 where there wasn't actually a grace period active. This can 274 where there wasn't actually a grace period active. This can
335 no longer happen due to grace-period processing being pushed 275 happen due to races. The number in parentheses is the difference
336 into a kthread. The number in parentheses is the difference
337 between "nfqs" and "nfqsng", or the number of times that 276 between "nfqs" and "nfqsng", or the number of times that
338 force_quiescent_state() actually did some real work. 277 force_quiescent_state() actually did some real work.
339 278
@@ -341,27 +280,28 @@ o "fqlh" is the number of calls to force_quiescent_state() that
341 exited immediately (without even being counted in nfqs above) 280 exited immediately (without even being counted in nfqs above)
342 due to contention on ->fqslock. 281 due to contention on ->fqslock.
343 282
344o Each element of the form "3/3 ..>. 0:7 ^0" represents one rcu_node 283o Each element of the form "1/1 0:127 ^0" represents one struct
345 structure. Each line represents one level of the hierarchy, 284 rcu_node. Each line represents one level of the hierarchy, from
346 from root to leaves. It is best to think of the rcu_data 285 root to leaves. It is best to think of the rcu_data structures
347 structures as forming yet another level after the leaves. 286 as forming yet another level after the leaves. Note that there
348 Note that there might be either one, two, three, or even four 287 might be either one, two, or three levels of rcu_node structures,
349 levels of rcu_node structures, depending on the relationship 288 depending on the relationship between CONFIG_RCU_FANOUT and
350 between CONFIG_RCU_FANOUT, CONFIG_RCU_FANOUT_LEAF (possibly 289 CONFIG_NR_CPUS.
351 adjusted using the rcu_fanout_leaf kernel boot parameter), and
352 CONFIG_NR_CPUS (possibly adjusted using the nr_cpu_ids count of
353 possible CPUs for the booting hardware).
354 290
355 o The numbers separated by the "/" are the qsmask followed 291 o The numbers separated by the "/" are the qsmask followed
356 by the qsmaskinit. The qsmask will have one bit 292 by the qsmaskinit. The qsmask will have one bit
357 set for each entity in the next lower level that has 293 set for each entity in the next lower level that
358 not yet checked in for the current grace period ("e" 294 has not yet checked in for the current grace period.
359 indicating CPUs 5, 6, and 7 in the example above).
360 The qsmaskinit will have one bit for each entity that is 295 The qsmaskinit will have one bit for each entity that is
361 currently expected to check in during each grace period. 296 currently expected to check in during each grace period.
362 The value of qsmaskinit is assigned to that of qsmask 297 The value of qsmaskinit is assigned to that of qsmask
363 at the beginning of each grace period. 298 at the beginning of each grace period.
364 299
300 For example, for "rcu_sched", the qsmask of the first
301 entry of the lowest level is 0x14, meaning that we
302 are still waiting for CPUs 2 and 4 to check in for the
303 current grace period.
304
365 o The characters separated by the ">" indicate the state 305 o The characters separated by the ">" indicate the state
366 of the blocked-tasks lists. A "G" preceding the ">" 306 of the blocked-tasks lists. A "G" preceding the ">"
367 indicates that at least one task blocked in an RCU 307 indicates that at least one task blocked in an RCU
@@ -376,39 +316,48 @@ o Each element of the form "3/3 ..>. 0:7 ^0" represents one rcu_node
376 A "." character appears if the corresponding condition 316 A "." character appears if the corresponding condition
377 does not hold, so that "..>." indicates that no tasks 317 does not hold, so that "..>." indicates that no tasks
378 are blocked. In contrast, "GE>T" indicates maximal 318 are blocked. In contrast, "GE>T" indicates maximal
379 inconvenience from blocked tasks. CONFIG_TREE_RCU 319 inconvenience from blocked tasks.
380 builds of the kernel will always show "..>.".
381 320
382 o The numbers separated by the ":" are the range of CPUs 321 o The numbers separated by the ":" are the range of CPUs
383 served by this struct rcu_node. This can be helpful 322 served by this struct rcu_node. This can be helpful
384 in working out how the hierarchy is wired together. 323 in working out how the hierarchy is wired together.
385 324
386 For example, the example rcu_node structure shown above 325 For example, the first entry at the lowest level shows
387 has "0:7", indicating that it covers CPUs 0 through 7. 326 "0:5", indicating that it covers CPUs 0 through 5.
388 327
389 o The number after the "^" indicates the bit in the 328 o The number after the "^" indicates the bit in the
390 next higher level rcu_node structure that this rcu_node 329 next higher level rcu_node structure that this
391 structure corresponds to. For example, the "d/d ..>. 4:7 330 rcu_node structure corresponds to.
392 ^1" has a "1" in this position, indicating that it 331
393 corresponds to the "1" bit in the "3" shown in the 332 For example, the first entry at the lowest level shows
394 "3/3 ..>. 0:7 ^0" entry on the next level up. 333 "^0", indicating that it corresponds to bit zero in
395 334 the first entry at the middle level.
396 335
397The output of "cat rcu/rcu_sched/rcu_pending" looks as follows: 336
398 337The output of "cat rcu/rcu_pending" looks as follows:
399 0!np=26111 qsp=29 rpq=5386 cbr=1 cng=570 gpc=3674 gps=577 nn=15903 338
400 1!np=28913 qsp=35 rpq=6097 cbr=1 cng=448 gpc=3700 gps=554 nn=18113 339rcu_sched:
401 2!np=32740 qsp=37 rpq=6202 cbr=0 cng=476 gpc=4627 gps=546 nn=20889 340 0 np=255892 qsp=53936 rpq=85 cbr=0 cng=14417 gpc=10033 gps=24320 nf=6445 nn=146741
402 3 np=23679 qsp=22 rpq=5044 cbr=1 cng=415 gpc=3403 gps=347 nn=14469 341 1 np=261224 qsp=54638 rpq=33 cbr=0 cng=25723 gpc=16310 gps=2849 nf=5912 nn=155792
403 4!np=30714 qsp=4 rpq=5574 cbr=0 cng=528 gpc=3931 gps=639 nn=20042 342 2 np=237496 qsp=49664 rpq=23 cbr=0 cng=2762 gpc=45478 gps=1762 nf=1201 nn=136629
404 5 np=28910 qsp=2 rpq=5246 cbr=0 cng=428 gpc=4105 gps=709 nn=18422 343 3 np=236249 qsp=48766 rpq=98 cbr=0 cng=286 gpc=48049 gps=1218 nf=207 nn=137723
405 6!np=38648 qsp=5 rpq=7076 cbr=0 cng=840 gpc=4072 gps=961 nn=25699 344 4 np=221310 qsp=46850 rpq=7 cbr=0 cng=26 gpc=43161 gps=4634 nf=3529 nn=123110
406 7 np=37275 qsp=2 rpq=6873 cbr=0 cng=868 gpc=3416 gps=971 nn=25147 345 5 np=237332 qsp=48449 rpq=9 cbr=0 cng=54 gpc=47920 gps=3252 nf=201 nn=137456
407 346 6 np=219995 qsp=46718 rpq=12 cbr=0 cng=50 gpc=42098 gps=6093 nf=4202 nn=120834
408The fields are as follows: 347 7 np=249893 qsp=49390 rpq=42 cbr=0 cng=72 gpc=38400 gps=17102 nf=41 nn=144888
409 348rcu_bh:
410o The leading number is the CPU number, with "!" indicating 349 0 np=146741 qsp=1419 rpq=6 cbr=0 cng=6 gpc=0 gps=0 nf=2 nn=145314
411 an offline CPU. 350 1 np=155792 qsp=12597 rpq=3 cbr=0 cng=0 gpc=4 gps=8 nf=3 nn=143180
351 2 np=136629 qsp=18680 rpq=1 cbr=0 cng=0 gpc=7 gps=6 nf=0 nn=117936
352 3 np=137723 qsp=2843 rpq=0 cbr=0 cng=0 gpc=10 gps=7 nf=0 nn=134863
353 4 np=123110 qsp=12433 rpq=0 cbr=0 cng=0 gpc=4 gps=2 nf=0 nn=110671
354 5 np=137456 qsp=4210 rpq=1 cbr=0 cng=0 gpc=6 gps=5 nf=0 nn=133235
355 6 np=120834 qsp=9902 rpq=2 cbr=0 cng=0 gpc=6 gps=3 nf=2 nn=110921
356 7 np=144888 qsp=26336 rpq=0 cbr=0 cng=0 gpc=8 gps=2 nf=0 nn=118542
357
358As always, this is once again split into "rcu_sched" and "rcu_bh"
359portions, with CONFIG_TREE_PREEMPT_RCU kernels having an additional
360"rcu_preempt" section. The fields are as follows:
412 361
413o "np" is the number of times that __rcu_pending() has been invoked 362o "np" is the number of times that __rcu_pending() has been invoked
414 for the corresponding flavor of RCU. 363 for the corresponding flavor of RCU.
@@ -432,23 +381,49 @@ o "gpc" is the number of times that an old grace period had
432o "gps" is the number of times that a new grace period had started, 381o "gps" is the number of times that a new grace period had started,
433 but this CPU was not yet aware of it. 382 but this CPU was not yet aware of it.
434 383
435o "nn" is the number of times that this CPU needed nothing. 384o "nf" is the number of times that this CPU suspected that the
385 current grace period had run for too long, and thus needed to
386 be forced.
387
388 Please note that "forcing" consists of sending resched IPIs
389 to holdout CPUs. If that CPU really still is in an old RCU
390 read-side critical section, then we really do have to wait for it.
391 The assumption behing "forcing" is that the CPU is not still in
392 an old RCU read-side critical section, but has not yet responded
393 for some other reason.
394
395o "nn" is the number of times that this CPU needed nothing. Alert
396 readers will note that the rcu "nn" number for a given CPU very
397 closely matches the rcu_bh "np" number for that same CPU. This
398 is due to short-circuit evaluation in rcu_pending().
399
400
401The output of "cat rcu/rcutorture" looks as follows:
402
403rcutorture test sequence: 0 (test in progress)
404rcutorture update version number: 615
405
406The first line shows the number of rcutorture tests that have completed
407since boot. If a test is currently running, the "(test in progress)"
408string will appear as shown above. The second line shows the number of
409update cycles that the current test has started, or zero if there is
410no test in progress.
436 411
437 412
438The output of "cat rcu/rcuboost" looks as follows: 413The output of "cat rcu/rcuboost" looks as follows:
439 414
4400:3 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=c864 bt=c894 4150:5 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=2f95 bt=300f
441 balk: nt=0 egt=4695 bt=0 nb=0 ny=56 nos=0 416 balk: nt=0 egt=989 bt=0 nb=0 ny=0 nos=16
4424:7 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=c864 bt=c894 4176:7 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=2f95 bt=300f
443 balk: nt=0 egt=6541 bt=0 nb=0 ny=126 nos=0 418 balk: nt=0 egt=225 bt=0 nb=0 ny=0 nos=6
444 419
445This information is output only for rcu_preempt. Each two-line entry 420This information is output only for rcu_preempt. Each two-line entry
446corresponds to a leaf rcu_node strcuture. The fields are as follows: 421corresponds to a leaf rcu_node strcuture. The fields are as follows:
447 422
448o "n:m" is the CPU-number range for the corresponding two-line 423o "n:m" is the CPU-number range for the corresponding two-line
449 entry. In the sample output above, the first entry covers 424 entry. In the sample output above, the first entry covers
450 CPUs zero through three and the second entry covers CPUs four 425 CPUs zero through five and the second entry covers CPUs 6
451 through seven. 426 and 7.
452 427
453o "tasks=TNEB" gives the state of the various segments of the 428o "tasks=TNEB" gives the state of the various segments of the
454 rnp->blocked_tasks list: 429 rnp->blocked_tasks list:
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt
index 0cc7820967f..6ef692667e2 100644
--- a/Documentation/RCU/whatisRCU.txt
+++ b/Documentation/RCU/whatisRCU.txt
@@ -4,7 +4,6 @@ to start learning about RCU:
41. What is RCU, Fundamentally? http://lwn.net/Articles/262464/ 41. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
52. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/ 52. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
63. RCU part 3: the RCU API http://lwn.net/Articles/264090/ 63. RCU part 3: the RCU API http://lwn.net/Articles/264090/
74. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
8 7
9 8
10What is RCU? 9What is RCU?
@@ -499,8 +498,6 @@ The foo_reclaim() function might appear as follows:
499 { 498 {
500 struct foo *fp = container_of(rp, struct foo, rcu); 499 struct foo *fp = container_of(rp, struct foo, rcu);
501 500
502 foo_cleanup(fp->a);
503
504 kfree(fp); 501 kfree(fp);
505 } 502 }
506 503
@@ -523,12 +520,6 @@ o Use call_rcu() -after- removing a data element from an
523 read-side critical sections that might be referencing that 520 read-side critical sections that might be referencing that
524 data item. 521 data item.
525 522
526If the callback for call_rcu() is not doing anything more than calling
527kfree() on the structure, you can use kfree_rcu() instead of call_rcu()
528to avoid having to write your own callback:
529
530 kfree_rcu(old_fp, rcu);
531
532Again, see checklist.txt for additional rules governing the use of RCU. 523Again, see checklist.txt for additional rules governing the use of RCU.
533 524
534 525
@@ -781,8 +772,8 @@ a single atomic update, converting to RCU will require special care.
781 772
782Also, the presence of synchronize_rcu() means that the RCU version of 773Also, the presence of synchronize_rcu() means that the RCU version of
783delete() can now block. If this is a problem, there is a callback-based 774delete() can now block. If this is a problem, there is a callback-based
784mechanism that never blocks, namely call_rcu() or kfree_rcu(), that can 775mechanism that never blocks, namely call_rcu(), that can be used in
785be used in place of synchronize_rcu(). 776place of synchronize_rcu().
786 777
787 778
7887. FULL LIST OF RCU APIs 7797. FULL LIST OF RCU APIs
@@ -797,7 +788,9 @@ RCU list traversal:
797 list_for_each_entry_rcu 788 list_for_each_entry_rcu
798 hlist_for_each_entry_rcu 789 hlist_for_each_entry_rcu
799 hlist_nulls_for_each_entry_rcu 790 hlist_nulls_for_each_entry_rcu
800 list_for_each_entry_continue_rcu 791
792 list_for_each_continue_rcu (to be deprecated in favor of new
793 list_for_each_entry_continue_rcu)
801 794
802RCU pointer/list update: 795RCU pointer/list update:
803 796
@@ -819,7 +812,6 @@ RCU: Critical sections Grace period Barrier
819 rcu_read_unlock synchronize_rcu 812 rcu_read_unlock synchronize_rcu
820 rcu_dereference synchronize_rcu_expedited 813 rcu_dereference synchronize_rcu_expedited
821 call_rcu 814 call_rcu
822 kfree_rcu
823 815
824 816
825bh: Critical sections Grace period Barrier 817bh: Critical sections Grace period Barrier
@@ -840,10 +832,8 @@ sched: Critical sections Grace period Barrier
840 832
841SRCU: Critical sections Grace period Barrier 833SRCU: Critical sections Grace period Barrier
842 834
843 srcu_read_lock synchronize_srcu srcu_barrier 835 srcu_read_lock synchronize_srcu N/A
844 srcu_read_unlock call_srcu 836 srcu_read_unlock synchronize_srcu_expedited
845 srcu_read_lock_raw synchronize_srcu_expedited
846 srcu_read_unlock_raw
847 srcu_dereference 837 srcu_dereference
848 838
849SRCU: Initialization/cleanup 839SRCU: Initialization/cleanup
@@ -865,38 +855,27 @@ list can be helpful:
865 855
866a. Will readers need to block? If so, you need SRCU. 856a. Will readers need to block? If so, you need SRCU.
867 857
868b. Is it necessary to start a read-side critical section in a 858b. What about the -rt patchset? If readers would need to block
869 hardirq handler or exception handler, and then to complete
870 this read-side critical section in the task that was
871 interrupted? If so, you need SRCU's srcu_read_lock_raw() and
872 srcu_read_unlock_raw() primitives.
873
874c. What about the -rt patchset? If readers would need to block
875 in an non-rt kernel, you need SRCU. If readers would block 859 in an non-rt kernel, you need SRCU. If readers would block
876 in a -rt kernel, but not in a non-rt kernel, SRCU is not 860 in a -rt kernel, but not in a non-rt kernel, SRCU is not
877 necessary. 861 necessary.
878 862
879d. Do you need to treat NMI handlers, hardirq handlers, 863c. Do you need to treat NMI handlers, hardirq handlers,
880 and code segments with preemption disabled (whether 864 and code segments with preemption disabled (whether
881 via preempt_disable(), local_irq_save(), local_bh_disable(), 865 via preempt_disable(), local_irq_save(), local_bh_disable(),
882 or some other mechanism) as if they were explicit RCU readers? 866 or some other mechanism) as if they were explicit RCU readers?
883 If so, RCU-sched is the only choice that will work for you. 867 If so, you need RCU-sched.
884 868
885e. Do you need RCU grace periods to complete even in the face 869d. Do you need RCU grace periods to complete even in the face
886 of softirq monopolization of one or more of the CPUs? For 870 of softirq monopolization of one or more of the CPUs? For
887 example, is your code subject to network-based denial-of-service 871 example, is your code subject to network-based denial-of-service
888 attacks? If so, you need RCU-bh. 872 attacks? If so, you need RCU-bh.
889 873
890f. Is your workload too update-intensive for normal use of 874e. Is your workload too update-intensive for normal use of
891 RCU, but inappropriate for other synchronization mechanisms? 875 RCU, but inappropriate for other synchronization mechanisms?
892 If so, consider SLAB_DESTROY_BY_RCU. But please be careful! 876 If so, consider SLAB_DESTROY_BY_RCU. But please be careful!
893 877
894g. Do you need read-side critical sections that are respected 878f. Otherwise, use RCU.
895 even though they are in the middle of the idle loop, during
896 user-mode execution, or on an offlined CPU? If so, SRCU is the
897 only choice that will work for you.
898
899h. Otherwise, use RCU.
900 879
901Of course, this all assumes that you have determined that RCU is in fact 880Of course, this all assumes that you have determined that RCU is in fact
902the right tool for your job. 881the right tool for your job.