diff options
author | Paul E. McKenney <paul.mckenney@linaro.org> | 2011-04-22 21:08:51 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2011-05-06 02:16:57 -0400 |
commit | 5ece5bab3ed8594ce2c85c6c6e6b82109db36ca7 (patch) | |
tree | c9ef8faa5dbb9e7c82893657e5aa2c1040987f96 /kernel/rcutree_trace.c | |
parent | 15ba0ba860871cf74b48b1bb47c26c91a66126f3 (diff) |
rcu: Add forward-progress diagnostic for per-CPU kthreads
Increment a per-CPU counter on each pass through rcu_cpu_kthread()'s
service loop, and add it to the rcudata trace output.
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Diffstat (limited to 'kernel/rcutree_trace.c')
-rw-r--r-- | kernel/rcutree_trace.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c index 564b8fef2a7e..9678cc3650f5 100644 --- a/kernel/rcutree_trace.c +++ b/kernel/rcutree_trace.c | |||
@@ -48,6 +48,7 @@ | |||
48 | 48 | ||
49 | DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); | 49 | DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); |
50 | DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_cpu); | 50 | DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_cpu); |
51 | DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); | ||
51 | DECLARE_PER_CPU(char, rcu_cpu_has_work); | 52 | DECLARE_PER_CPU(char, rcu_cpu_has_work); |
52 | 53 | ||
53 | static char convert_kthread_status(unsigned int kthread_status) | 54 | static char convert_kthread_status(unsigned int kthread_status) |
@@ -75,7 +76,7 @@ static void print_one_rcu_data(struct seq_file *m, struct rcu_data *rdp) | |||
75 | rdp->dynticks_fqs); | 76 | rdp->dynticks_fqs); |
76 | #endif /* #ifdef CONFIG_NO_HZ */ | 77 | #endif /* #ifdef CONFIG_NO_HZ */ |
77 | seq_printf(m, " of=%lu ri=%lu", rdp->offline_fqs, rdp->resched_ipi); | 78 | seq_printf(m, " of=%lu ri=%lu", rdp->offline_fqs, rdp->resched_ipi); |
78 | seq_printf(m, " ql=%ld qs=%c%c%c%c kt=%d/%c/%d b=%ld", | 79 | seq_printf(m, " ql=%ld qs=%c%c%c%c kt=%d/%c/%d ktl=%x b=%ld", |
79 | rdp->qlen, | 80 | rdp->qlen, |
80 | ".N"[rdp->nxttail[RCU_NEXT_READY_TAIL] != | 81 | ".N"[rdp->nxttail[RCU_NEXT_READY_TAIL] != |
81 | rdp->nxttail[RCU_NEXT_TAIL]], | 82 | rdp->nxttail[RCU_NEXT_TAIL]], |
@@ -88,6 +89,7 @@ static void print_one_rcu_data(struct seq_file *m, struct rcu_data *rdp) | |||
88 | convert_kthread_status(per_cpu(rcu_cpu_kthread_status, | 89 | convert_kthread_status(per_cpu(rcu_cpu_kthread_status, |
89 | rdp->cpu)), | 90 | rdp->cpu)), |
90 | per_cpu(rcu_cpu_kthread_cpu, rdp->cpu), | 91 | per_cpu(rcu_cpu_kthread_cpu, rdp->cpu), |
92 | per_cpu(rcu_cpu_kthread_loops, rdp->cpu) & 0xffff, | ||
91 | rdp->blimit); | 93 | rdp->blimit); |
92 | seq_printf(m, " ci=%lu co=%lu ca=%lu\n", | 94 | seq_printf(m, " ci=%lu co=%lu ca=%lu\n", |
93 | rdp->n_cbs_invoked, rdp->n_cbs_orphaned, rdp->n_cbs_adopted); | 95 | rdp->n_cbs_invoked, rdp->n_cbs_orphaned, rdp->n_cbs_adopted); |