diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-04-14 00:31:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-14 05:33:43 -0400 |
commit | 7ba5c840e64d4a967379f1ae3eca73278180b11d (patch) | |
tree | b77d70ce2b80f3be27add39fcd3bc7fbfe7a0847 /kernel/rcutree.c | |
parent | 05cfbd66d07c44865983c8b65ae9d0037d874206 (diff) |
rcu: Add __rcu_pending tracing to hierarchical RCU
Add tracing to __rcu_pending() to provide information on why RCU
processing was kicked off. This is helpful for debugging hierarchical
RCU, and might also be helpful in learning how hierarchical RCU operates.
Located-by: Anton Blanchard <anton@au1.ibm.com>
Tested-by: Anton Blanchard <anton@au1.ibm.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: anton@samba.org
Cc: akpm@linux-foundation.org
Cc: dipankar@in.ibm.com
Cc: manfred@colorfullife.com
Cc: cl@linux-foundation.org
Cc: josht@linux.vnet.ibm.com
Cc: schamp@sgi.com
Cc: niv@us.ibm.com
Cc: dvhltc@us.ibm.com
Cc: ego@in.ibm.com
Cc: laijs@cn.fujitsu.com
Cc: rostedt@goodmis.org
Cc: peterz@infradead.org
Cc: penberg@cs.helsinki.fi
Cc: andi@firstfloor.org
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
LKML-Reference: <1239683479943-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r-- | kernel/rcutree.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index d2a372fb0b9b..0dccfbba6d26 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -1259,31 +1259,44 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1259 | check_cpu_stall(rsp, rdp); | 1259 | check_cpu_stall(rsp, rdp); |
1260 | 1260 | ||
1261 | /* Is the RCU core waiting for a quiescent state from this CPU? */ | 1261 | /* Is the RCU core waiting for a quiescent state from this CPU? */ |
1262 | if (rdp->qs_pending) | 1262 | if (rdp->qs_pending) { |
1263 | rdp->n_rp_qs_pending++; | ||
1263 | return 1; | 1264 | return 1; |
1265 | } | ||
1264 | 1266 | ||
1265 | /* Does this CPU have callbacks ready to invoke? */ | 1267 | /* Does this CPU have callbacks ready to invoke? */ |
1266 | if (cpu_has_callbacks_ready_to_invoke(rdp)) | 1268 | if (cpu_has_callbacks_ready_to_invoke(rdp)) { |
1269 | rdp->n_rp_cb_ready++; | ||
1267 | return 1; | 1270 | return 1; |
1271 | } | ||
1268 | 1272 | ||
1269 | /* Has RCU gone idle with this CPU needing another grace period? */ | 1273 | /* Has RCU gone idle with this CPU needing another grace period? */ |
1270 | if (cpu_needs_another_gp(rsp, rdp)) | 1274 | if (cpu_needs_another_gp(rsp, rdp)) { |
1275 | rdp->n_rp_cpu_needs_gp++; | ||
1271 | return 1; | 1276 | return 1; |
1277 | } | ||
1272 | 1278 | ||
1273 | /* Has another RCU grace period completed? */ | 1279 | /* Has another RCU grace period completed? */ |
1274 | if (ACCESS_ONCE(rsp->completed) != rdp->completed) /* outside of lock */ | 1280 | if (ACCESS_ONCE(rsp->completed) != rdp->completed) { /* outside lock */ |
1281 | rdp->n_rp_gp_completed++; | ||
1275 | return 1; | 1282 | return 1; |
1283 | } | ||
1276 | 1284 | ||
1277 | /* Has a new RCU grace period started? */ | 1285 | /* Has a new RCU grace period started? */ |
1278 | if (ACCESS_ONCE(rsp->gpnum) != rdp->gpnum) /* outside of lock */ | 1286 | if (ACCESS_ONCE(rsp->gpnum) != rdp->gpnum) { /* outside lock */ |
1287 | rdp->n_rp_gp_started++; | ||
1279 | return 1; | 1288 | return 1; |
1289 | } | ||
1280 | 1290 | ||
1281 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ | 1291 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ |
1282 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && | 1292 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && |
1283 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) | 1293 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) { |
1294 | rdp->n_rp_need_fqs++; | ||
1284 | return 1; | 1295 | return 1; |
1296 | } | ||
1285 | 1297 | ||
1286 | /* nothing to do */ | 1298 | /* nothing to do */ |
1299 | rdp->n_rp_need_nothing++; | ||
1287 | return 0; | 1300 | return 0; |
1288 | } | 1301 | } |
1289 | 1302 | ||