--- kernel/ipipe/tracer.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) Index: linux-2.6.16.16/kernel/ipipe/tracer.c =================================================================== --- linux-2.6.16.16.orig/kernel/ipipe/tracer.c +++ linux-2.6.16.16/kernel/ipipe/tracer.c @@ -52,7 +52,15 @@ #define IPIPE_TFLG_HWIRQ_OFF 0x0100 #define IPIPE_TFLG_FREEZING 0x0200 +#define IPIPE_TFLG_CURRDOM_SHIFT 10 /* bits 10..11: current domain */ +#define IPIPE_TFLG_CURRDOM_MASK 0x0C00 #define IPIPE_TFLG_DOMSTATE_SHIFT 12 /* bits 12..15: domain stalled? */ +#define IPIPE_TFLG_DOMSTATE_BITS 3 + +#define IPIPE_TFLG_DOMAIN_STALLED(point, n) \ + (point->flags & (1 << (n + IPIPE_TFLG_DOMSTATE_SHIFT))) +#define IPIPE_TFLG_CURRENT_DOMAIN(point) \ + ((point->flags & IPIPE_TFLG_CURRDOM_MASK) >> IPIPE_TFLG_CURRDOM_SHIFT) struct ipipe_trace_point{ @@ -137,17 +145,20 @@ static void __ipipe_print_symname(struct static notrace void __ipipe_store_domain_states(struct ipipe_trace_point *point, int cpu_id) { - int i = IPIPE_TFLG_DOMSTATE_SHIFT; struct list_head *pos; + int i = 0; list_for_each_prev(pos, &__ipipe_pipeline) { struct ipipe_domain *ipd = list_entry(pos, struct ipipe_domain, p_link); if (test_bit(IPIPE_STALL_FLAG, &ipd->cpudata[cpu_id].status)) - point->flags |= (1 << i); + point->flags |= 1 << (i + IPIPE_TFLG_DOMSTATE_SHIFT); + + if (ipd == ipipe_percpu_domain[cpu_id]) + point->flags |= i << IPIPE_TFLG_CURRDOM_SHIFT; - if (++i > IPIPE_TFLG_DOMSTATE_SHIFT+3) + if (++i > IPIPE_TFLG_DOMSTATE_BITS) break; } } @@ -720,11 +731,15 @@ __ipipe_print_pathmark(struct seq_file * seq_printf(m, "%c%c", mark, (point->flags & IPIPE_TFLG_HWIRQ_OFF) ? '|' : ' '); - if (verbose_trace) - for (i = IPIPE_TFLG_DOMSTATE_SHIFT + 3; - i >= IPIPE_TFLG_DOMSTATE_SHIFT; i--) - seq_printf(m, "%c", - (point->flags & (1 << i)) ? '*' : ' '); + if (!verbose_trace) + return; + + for (i = IPIPE_TFLG_DOMSTATE_BITS; i >= 0; i--) + seq_printf(m, "%c", + (IPIPE_TFLG_CURRENT_DOMAIN(point) == i) ? + (IPIPE_TFLG_DOMAIN_STALLED(point, i) ? + '#' : '+') : + (IPIPE_TFLG_DOMAIN_STALLED(point, i) ? '*' : ' ')); } static void @@ -836,7 +851,8 @@ static void __ipipe_print_headline(struc " Type User Val. Time Delay Function " "(Parent)\n", name[3], name[2], name[1], name[0], - name[0] ? " ('*': domain stalled)" : "", + name[0] ? " ('*': domain stalled, '+': current, " + "'#': current+stalled)" : "", IPIPE_DELAY_NOTE/1000, IPIPE_DELAY_WARN/1000); } else seq_printf(m,