aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/RCU/trace.txt12
-rw-r--r--kernel/rcutree.c10
-rw-r--r--kernel/rcutree_plugin.h2
3 files changed, 11 insertions, 13 deletions
diff --git a/Documentation/RCU/trace.txt b/Documentation/RCU/trace.txt
index ff6d3f10c82f..6a8c73f55b80 100644
--- a/Documentation/RCU/trace.txt
+++ b/Documentation/RCU/trace.txt
@@ -134,7 +134,8 @@ o "ci" is the number of RCU callbacks that have been invoked for
134 been registered in absence of CPU-hotplug activity. 134 been registered in absence of CPU-hotplug activity.
135 135
136o "co" is the number of RCU callbacks that have been orphaned due to 136o "co" is the number of RCU callbacks that have been orphaned due to
137 this CPU going offline. 137 this CPU going offline. These orphaned callbacks have been moved
138 to an arbitrarily chosen online CPU.
138 139
139o "ca" is the number of RCU callbacks that have been adopted due to 140o "ca" is the number of RCU callbacks that have been adopted due to
140 other CPUs going offline. Note that ci+co-ca+ql is the number of 141 other CPUs going offline. Note that ci+co-ca+ql is the number of
@@ -172,12 +173,12 @@ o "gpnum" is the number of grace periods that have started. It is
172 173
173The output of "cat rcu/rcuhier" looks as follows, with very long lines: 174The output of "cat rcu/rcuhier" looks as follows, with very long lines:
174 175
175c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6 oqlen=0 176c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6
1761/1 .>. 0:127 ^0 1771/1 .>. 0:127 ^0
1773/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 1783/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3
1783/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 1793/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
179rcu_bh: 180rcu_bh:
180c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 oqlen=0 181c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0
1810/1 .>. 0:127 ^0 1820/1 .>. 0:127 ^0
1820/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 1830/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3
1830/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 1840/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
@@ -216,11 +217,6 @@ o "fqlh" is the number of calls to force_quiescent_state() that
216 exited immediately (without even being counted in nfqs above) 217 exited immediately (without even being counted in nfqs above)
217 due to contention on ->fqslock. 218 due to contention on ->fqslock.
218 219
219o "oqlen" is the number of callbacks on the "orphan" callback
220 list. RCU callbacks are placed on this list by CPUs going
221 offline, and are "adopted" either by the CPU helping the outgoing
222 CPU or by the next rcu_barrier*() call, whichever comes first.
223
224o Each element of the form "1/1 0:127 ^0" represents one struct 220o Each element of the form "1/1 0:127 ^0" represents one struct
225 rcu_node. Each line represents one level of the hierarchy, from 221 rcu_node. Each line represents one level of the hierarchy, from
226 root to leaves. It is best to think of the rcu_data structures 222 root to leaves. It is best to think of the rcu_data structures
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 669d7fe049d1..120820ffc657 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -1668,7 +1668,9 @@ static void _rcu_barrier(struct rcu_state *rsp,
1668 * decrement rcu_barrier_cpu_count -- otherwise the first CPU 1668 * decrement rcu_barrier_cpu_count -- otherwise the first CPU
1669 * might complete its grace period before all of the other CPUs 1669 * might complete its grace period before all of the other CPUs
1670 * did their increment, causing this function to return too 1670 * did their increment, causing this function to return too
1671 * early. 1671 * early. Note that on_each_cpu() disables irqs, which prevents
1672 * any CPUs from coming online or going offline until each online
1673 * CPU has queued its RCU-barrier callback.
1672 */ 1674 */
1673 atomic_set(&rcu_barrier_cpu_count, 1); 1675 atomic_set(&rcu_barrier_cpu_count, 1);
1674 on_each_cpu(rcu_barrier_func, (void *)call_rcu_func, 1); 1676 on_each_cpu(rcu_barrier_func, (void *)call_rcu_func, 1);
@@ -1797,9 +1799,9 @@ static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
1797 case CPU_DYING: 1799 case CPU_DYING:
1798 case CPU_DYING_FROZEN: 1800 case CPU_DYING_FROZEN:
1799 /* 1801 /*
1800 * The whole machine is "stopped" except this cpu, so we can 1802 * The whole machine is "stopped" except this CPU, so we can
1801 * touch any data without introducing corruption. And we send 1803 * touch any data without introducing corruption. We send the
1802 * the callbacks to an attribute chosen online cpu. 1804 * dying CPU's callbacks to an arbitrarily chosen online CPU.
1803 */ 1805 */
1804 rcu_send_cbs_to_online(&rcu_bh_state); 1806 rcu_send_cbs_to_online(&rcu_bh_state);
1805 rcu_send_cbs_to_online(&rcu_sched_state); 1807 rcu_send_cbs_to_online(&rcu_sched_state);
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index 0de359be5b41..643c8f650dd0 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -774,7 +774,7 @@ static void __cpuinit rcu_preempt_init_percpu_data(int cpu)
774} 774}
775 775
776/* 776/*
777 * Move preemptable DYING RCU's callbacks to other online CPU. 777 * Move preemptable RCU's callbacks from dying CPU to other online CPU.
778 */ 778 */
779static void rcu_preempt_send_cbs_to_online(void) 779static void rcu_preempt_send_cbs_to_online(void)
780{ 780{