diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-05 12:52:14 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-05 12:52:14 -0500 |
| commit | 607781762e7aae9c976f0a9a8829d4ba3e2da4ab (patch) | |
| tree | 933dad6ecb0be49e9b1ef41b69d5aa256510720e | |
| parent | d0b093a8b5ae34ee8be1f7e0dd197fe4788fa1d5 (diff) | |
| parent | 8bfb2f8e655b9d0c45fde679fcd5fd97e34513db (diff) | |
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (31 commits)
rcu: Make RCU's CPU-stall detector be default
rcu: Add expedited grace-period support for preemptible RCU
rcu: Enable fourth level of TREE_RCU hierarchy
rcu: Rename "quiet" functions
rcu: Re-arrange code to reduce #ifdef pain
rcu: Eliminate unneeded function wrapping
rcu: Fix grace-period-stall bug on large systems with CPU hotplug
rcu: Eliminate __rcu_pending() false positives
rcu: Further cleanups of use of lastcomp
rcu: Simplify association of forced quiescent states with grace periods
rcu: Accelerate callback processing on CPUs not detecting GP end
rcu: Mark init-time-only rcu_bootup_announce() as __init
rcu: Simplify association of quiescent states with grace periods
rcu: Rename dynticks_completed to completed_fqs
rcu: Enable synchronize_sched_expedited() fastpath
rcu: Remove inline from forward-referenced functions
rcu: Fix note_new_gpnum() uses of ->gpnum
rcu: Fix synchronization for rcu_process_gp_end() uses of ->completed counter
rcu: Prepare for synchronization fixes: clean up for non-NO_HZ handling of ->completed counter
rcu: Cleanup: balance rcu_irq_enter()/rcu_irq_exit() calls
...
| -rw-r--r-- | Documentation/RCU/trace.txt | 254 | ||||
| -rw-r--r-- | Documentation/RCU/whatisRCU.txt | 2 | ||||
| -rw-r--r-- | include/linux/hardirq.h | 24 | ||||
| -rw-r--r-- | include/linux/rcupdate.h | 10 | ||||
| -rw-r--r-- | include/linux/rcutiny.h | 104 | ||||
| -rw-r--r-- | include/linux/rcutree.h | 7 | ||||
| -rw-r--r-- | include/linux/srcu.h | 1 | ||||
| -rw-r--r-- | init/Kconfig | 9 | ||||
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/rcupdate.c | 122 | ||||
| -rw-r--r-- | kernel/rcutiny.c | 282 | ||||
| -rw-r--r-- | kernel/rcutorture.c | 65 | ||||
| -rw-r--r-- | kernel/rcutree.c | 465 | ||||
| -rw-r--r-- | kernel/rcutree.h | 69 | ||||
| -rw-r--r-- | kernel/rcutree_plugin.h | 309 | ||||
| -rw-r--r-- | kernel/rcutree_trace.c | 12 | ||||
| -rw-r--r-- | kernel/sched.c | 1 | ||||
| -rw-r--r-- | kernel/softirq.c | 2 | ||||
| -rw-r--r-- | kernel/srcu.c | 74 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 2 |
20 files changed, 1234 insertions, 581 deletions
diff --git a/Documentation/RCU/trace.txt b/Documentation/RCU/trace.txt index 187bbf10c923..8608fd85e921 100644 --- a/Documentation/RCU/trace.txt +++ b/Documentation/RCU/trace.txt | |||
| @@ -1,185 +1,10 @@ | |||
| 1 | CONFIG_RCU_TRACE debugfs Files and Formats | 1 | CONFIG_RCU_TRACE debugfs Files and Formats |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | The rcupreempt and rcutree implementations of RCU provide debugfs trace | 4 | The rcutree implementation of RCU provides debugfs trace output that |
| 5 | output that summarizes counters and state. This information is useful for | 5 | summarizes counters and state. This information is useful for debugging |
| 6 | debugging RCU itself, and can sometimes also help to debug abuses of RCU. | 6 | RCU itself, and can sometimes also help to debug abuses of RCU. |
| 7 | Note that the rcuclassic implementation of RCU does not provide debugfs | 7 | The following sections describe the debugfs files and formats. |
| 8 | trace output. | ||
| 9 | |||
| 10 | The following sections describe the debugfs files and formats for | ||
| 11 | preemptable RCU (rcupreempt) and hierarchical RCU (rcutree). | ||
| 12 | |||
| 13 | |||
| 14 | Preemptable RCU debugfs Files and Formats | ||
| 15 | |||
| 16 | This implementation of RCU provides three debugfs files under the | ||
| 17 | top-level directory RCU: rcu/rcuctrs (which displays the per-CPU | ||
| 18 | counters used by preemptable RCU) rcu/rcugp (which displays grace-period | ||
| 19 | counters), and rcu/rcustats (which internal counters for debugging RCU). | ||
| 20 | |||
| 21 | The output of "cat rcu/rcuctrs" looks as follows: | ||
| 22 | |||
| 23 | CPU last cur F M | ||
| 24 | 0 5 -5 0 0 | ||
| 25 | 1 -1 0 0 0 | ||
| 26 | 2 0 1 0 0 | ||
| 27 | 3 0 1 0 0 | ||
| 28 | 4 0 1 0 0 | ||
| 29 | 5 0 1 0 0 | ||
| 30 | 6 0 2 0 0 | ||
| 31 | 7 0 -1 0 0 | ||
| 32 | 8 0 1 0 0 | ||
| 33 | ggp = 26226, state = waitzero | ||
| 34 | |||
| 35 | The per-CPU fields are as follows: | ||
| 36 | |||
| 37 | o "CPU" gives the CPU number. Offline CPUs are not displayed. | ||
| 38 | |||
| 39 | o "last" gives the value of the counter that is being decremented | ||
| 40 | for the current grace period phase. In the example above, | ||
| 41 | the counters sum to 4, indicating that there are still four | ||
| 42 | RCU read-side critical sections still running that started | ||
| 43 | before the last counter flip. | ||
| 44 | |||
| 45 | o "cur" gives the value of the counter that is currently being | ||
| 46 | both incremented (by rcu_read_lock()) and decremented (by | ||
| 47 | rcu_read_unlock()). In the example above, the counters sum to | ||
| 48 | 1, indicating that there is only one RCU read-side critical section | ||
| 49 | still running that started after the last counter flip. | ||
| 50 | |||
| 51 | o "F" indicates whether RCU is waiting for this CPU to acknowledge | ||
| 52 | a counter flip. In the above example, RCU is not waiting on any, | ||
| 53 | which is consistent with the state being "waitzero" rather than | ||
| 54 | "waitack". | ||
| 55 | |||
| 56 | o "M" indicates whether RCU is waiting for this CPU to execute a | ||
| 57 | memory barrier. In the above example, RCU is not waiting on any, | ||
| 58 | which is consistent with the state being "waitzero" rather than | ||
| 59 | "waitmb". | ||
| 60 | |||
| 61 | o "ggp" is the global grace-period counter. | ||
| 62 | |||
| 63 | o "state" is the RCU state, which can be one of the following: | ||
| 64 | |||
| 65 | o "idle": there is no grace period in progress. | ||
| 66 | |||
| 67 | o "waitack": RCU just incremented the global grace-period | ||
| 68 | counter, which has the effect of reversing the roles of | ||
| 69 | the "last" and "cur" counters above, and is waiting for | ||
| 70 | all the CPUs to acknowledge the flip. Once the flip has | ||
| 71 | been acknowledged, CPUs will no longer be incrementing | ||
| 72 | what are now the "last" counters, so that their sum will | ||
| 73 | decrease monotonically down to zero. | ||
| 74 | |||
| 75 | o "waitzero": RCU is waiting for the sum of the "last" counters | ||
| 76 | to decrease to zero. | ||
| 77 | |||
| 78 | o "waitmb": RCU is waiting for each CPU to execute a memory | ||
| 79 | barrier, which ensures that instructions from a given CPU's | ||
| 80 | last RCU read-side critical section cannot be reordered | ||
| 81 | with instructions following the memory-barrier instruction. | ||
| 82 | |||
| 83 | The output of "cat rcu/rcugp" looks as follows: | ||
| 84 | |||
| 85 | oldggp=48870 newggp=48873 | ||
| 86 | |||
| 87 | Note that reading from this file provokes a synchronize_rcu(). The | ||
| 88 | "oldggp" value is that of "ggp" from rcu/rcuctrs above, taken before | ||
| 89 | executing the synchronize_rcu(), and the "newggp" value is also the | ||
| 90 | "ggp" value, but taken after the synchronize_rcu() command returns. | ||
| 91 | |||
| 92 | |||
| 93 | The output of "cat rcu/rcugp" looks as follows: | ||
| 94 | |||
| 95 | na=1337955 nl=40 wa=1337915 wl=44 da=1337871 dl=0 dr=1337871 di=1337871 | ||
| 96 | 1=50989 e1=6138 i1=49722 ie1=82 g1=49640 a1=315203 ae1=265563 a2=49640 | ||
| 97 | z1=1401244 ze1=1351605 z2=49639 m1=5661253 me1=5611614 m2=49639 | ||
| 98 | |||
| 99 | These are counters tracking internal preemptable-RCU events, however, | ||
| 100 | some of them may be useful for debugging algorithms using RCU. In | ||
| 101 | particular, the "nl", "wl", and "dl" values track the number of RCU | ||
| 102 | callbacks in various states. The fields are as follows: | ||
| 103 | |||
| 104 | o "na" is the total number of RCU callbacks that have been enqueued | ||
| 105 | since boot. | ||
| 106 | |||
| 107 | o "nl" is the number of RCU callbacks waiting for the previous | ||
| 108 | grace period to end so that they can start waiting on the next | ||
| 109 | grace period. | ||
| 110 | |||
| 111 | o "wa" is the total number of RCU callbacks that have started waiting | ||
| 112 | for a grace period since boot. "na" should be roughly equal to | ||
| 113 | "nl" plus "wa". | ||
| 114 | |||
| 115 | o "wl" is the number of RCU callbacks currently waiting for their | ||
| 116 | grace period to end. | ||
| 117 | |||
| 118 | o "da" is the total number of RCU callbacks whose grace periods | ||
| 119 | have completed since boot. "wa" should be roughly equal to | ||
| 120 | "wl" plus "da". | ||
| 121 | |||
| 122 | o "dr" is the total number of RCU callbacks that have been removed | ||
| 123 | from the list of callbacks ready to invoke. "dr" should be roughly | ||
| 124 | equal to "da". | ||
| 125 | |||
| 126 | o "di" is the total number of RCU callbacks that have been invoked | ||
| 127 | since boot. "di" should be roughly equal to "da", though some | ||
| 128 | early versions of preemptable RCU had a bug so that only the | ||
| 129 | last CPU's count of invocations was displayed, rather than the | ||
| 130 | sum of all CPU's counts. | ||
| 131 | |||
| 132 | o "1" is the number of calls to rcu_try_flip(). This should be | ||
| 133 | roughly equal to the sum of "e1", "i1", "a1", "z1", and "m1" | ||
| 134 | described below. In other words, the number of times that | ||
| 135 | the state machine is visited should be equal to the sum of the | ||
| 136 | number of times that each state is visited plus the number of | ||
| 137 | times that the state-machine lock acquisition failed. | ||
| 138 | |||
| 139 | o "e1" is the number of times that rcu_try_flip() was unable to | ||
| 140 | acquire the fliplock. | ||
| 141 | |||
| 142 | o "i1" is the number of calls to rcu_try_flip_idle(). | ||
| 143 | |||
| 144 | o "ie1" is the number of times rcu_try_flip_idle() exited early | ||
| 145 | due to the calling CPU having no work for RCU. | ||
| 146 | |||
| 147 | o "g1" is the number of times that rcu_try_flip_idle() decided | ||
| 148 | to start a new grace period. "i1" should be roughly equal to | ||
| 149 | "ie1" plus "g1". | ||
