aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul E. McKenney <paul.mckenney@linaro.org>2012-05-05 22:10:35 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-06-06 23:43:27 -0400
commitfd4b352687fd8604d49c190c4c9ea9e369fd42d5 (patch)
tree1e20de9090f7d74eef642ac263dd71da0b494d7d
parent8f5af6f1f2d09fe5eac86a5dc1731a5917c1503a (diff)
rcu: Update RCU_FAST_NO_HZ tracing for lazy callbacks
In the current code, a short dyntick-idle interval (where there is at least one non-lazy callback on the CPU) and a long dyntick-idle interval (where there are only lazy callbacks on the CPU) are traced identically, which can be less than helpful. This commit therefore emits different event traces in these two cases. Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Heiko Carstens <heiko.carstens@de.ibm.com> Tested-by: Pascal Chapperon <pascal.chapperon@wanadoo.fr>
-rw-r--r--include/trace/events/rcu.h1
-rw-r--r--kernel/rcutree_plugin.h8
2 files changed, 6 insertions, 3 deletions
diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h
index 1480900c511c..d274734b2aa4 100644
--- a/include/trace/events/rcu.h
+++ b/include/trace/events/rcu.h
@@ -289,6 +289,7 @@ TRACE_EVENT(rcu_dyntick,
289 * "In holdoff": Nothing to do, holding off after unsuccessful attempt. 289 * "In holdoff": Nothing to do, holding off after unsuccessful attempt.
290 * "Begin holdoff": Attempt failed, don't retry until next jiffy. 290 * "Begin holdoff": Attempt failed, don't retry until next jiffy.
291 * "Dyntick with callbacks": Entering dyntick-idle despite callbacks. 291 * "Dyntick with callbacks": Entering dyntick-idle despite callbacks.
292 * "Dyntick with lazy callbacks": Entering dyntick-idle w/lazy callbacks.
292 * "More callbacks": Still more callbacks, try again to clear them out. 293 * "More callbacks": Still more callbacks, try again to clear them out.
293 * "Callbacks drained": All callbacks processed, off to dyntick idle! 294 * "Callbacks drained": All callbacks processed, off to dyntick idle!
294 * "Timer": Timer fired to cause CPU to continue processing callbacks. 295 * "Timer": Timer fired to cause CPU to continue processing callbacks.
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index 2411000d9869..5449f02c4820 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -2165,15 +2165,17 @@ static void rcu_prepare_for_idle(int cpu)
2165 !rcu_pending(cpu) && 2165 !rcu_pending(cpu) &&
2166 !local_softirq_pending()) { 2166 !local_softirq_pending()) {
2167 /* Can we go dyntick-idle despite still having callbacks? */ 2167 /* Can we go dyntick-idle despite still having callbacks? */
2168 trace_rcu_prep_idle("Dyntick with callbacks");
2169 per_cpu(rcu_dyntick_drain, cpu) = 0; 2168 per_cpu(rcu_dyntick_drain, cpu) = 0;
2170 per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; 2169 per_cpu(rcu_dyntick_holdoff, cpu) = jiffies;
2171 if (rcu_cpu_has_nonlazy_callbacks(cpu)) 2170 if (rcu_cpu_has_nonlazy_callbacks(cpu)) {
2171 trace_rcu_prep_idle("Dyntick with callbacks");
2172 per_cpu(rcu_idle_gp_timer_expires, cpu) = 2172 per_cpu(rcu_idle_gp_timer_expires, cpu) =
2173 jiffies + RCU_IDLE_GP_DELAY; 2173 jiffies + RCU_IDLE_GP_DELAY;
2174 else 2174 } else {
2175 per_cpu(rcu_idle_gp_timer_expires, cpu) = 2175 per_cpu(rcu_idle_gp_timer_expires, cpu) =
2176 jiffies + RCU_IDLE_LAZY_GP_DELAY; 2176 jiffies + RCU_IDLE_LAZY_GP_DELAY;
2177 trace_rcu_prep_idle("Dyntick with lazy callbacks");
2178 }
2177 tp = &per_cpu(rcu_idle_gp_timer, cpu); 2179 tp = &per_cpu(rcu_idle_gp_timer, cpu);
2178 mod_timer_pinned(tp, per_cpu(rcu_idle_gp_timer_expires, cpu)); 2180 mod_timer_pinned(tp, per_cpu(rcu_idle_gp_timer_expires, cpu));
2179 per_cpu(rcu_nonlazy_posted_snap, cpu) = 2181 per_cpu(rcu_nonlazy_posted_snap, cpu) =