diff options
-rw-r--r-- | Documentation/RCU/trace.txt | 12 | ||||
-rw-r--r-- | kernel/rcutree.c | 10 | ||||
-rw-r--r-- | kernel/rcutree_plugin.h | 2 |
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 | ||
136 | o "co" is the number of RCU callbacks that have been orphaned due to | 136 | o "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 | ||
139 | o "ca" is the number of RCU callbacks that have been adopted due to | 140 | o "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 | ||
173 | The output of "cat rcu/rcuhier" looks as follows, with very long lines: | 174 | The output of "cat rcu/rcuhier" looks as follows, with very long lines: |
174 | 175 | ||
175 | c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6 oqlen=0 | 176 | c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6 |
176 | 1/1 .>. 0:127 ^0 | 177 | 1/1 .>. 0:127 ^0 |
177 | 3/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 | 178 | 3/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 |
178 | 3/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 | 179 | 3/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 |
179 | rcu_bh: | 180 | rcu_bh: |
180 | c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 oqlen=0 | 181 | c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 |
181 | 0/1 .>. 0:127 ^0 | 182 | 0/1 .>. 0:127 ^0 |
182 | 0/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 | 183 | 0/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 |
183 | 0/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 | 184 | 0/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 | ||
219 | o "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 | |||
224 | o Each element of the form "1/1 0:127 ^0" represents one struct | 220 | o 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 | */ |
779 | static void rcu_preempt_send_cbs_to_online(void) | 779 | static void rcu_preempt_send_cbs_to_online(void) |
780 | { | 780 | { |