Index: linux-2.6.15.5/kernel/ipipe/core.c =================================================================== --- linux-2.6.15.5.orig/kernel/ipipe/core.c 2006-04-08 13:36:34.000000000 +0200 +++ linux-2.6.15.5/kernel/ipipe/core.c 2006-04-08 16:39:30.000000000 +0200 @@ -40,7 +40,7 @@ ipipe_spinlock_t __ipipe_pipelock = IPIPE_SPIN_LOCK_UNLOCKED; -struct list_head __ipipe_pipeline; +LIST_HEAD(__ipipe_pipeline); unsigned long __ipipe_virtual_irq_map = 0; @@ -66,8 +66,6 @@ * secondary CPUs are still lost in space. */ - INIT_LIST_HEAD(&__ipipe_pipeline); - ipd->name = "Linux"; ipd->domid = IPIPE_ROOT_ID; ipd->priority = IPIPE_ROOT_PRIO; Index: linux-2.6.15.5/kernel/ipipe/tracer.c =================================================================== --- linux-2.6.15.5.orig/kernel/ipipe/tracer.c 2006-04-08 13:37:21.000000000 +0200 +++ linux-2.6.15.5/kernel/ipipe/tracer.c 2006-04-08 16:52:07.000000000 +0200 @@ -51,6 +51,7 @@ #define IPIPE_TFLG_HWIRQ_OFF 0x0100 #define IPIPE_TFLG_FREEZING 0x0200 +#define IPIPE_TFLG_DOMSTATE_SHIFT 12 /* bits 12..15: domain stalled? */ struct ipipe_trace_point{ @@ -118,6 +119,24 @@ static void __ipipe_print_symname(struct seq_file *m, unsigned long eip); +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; + + 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); + + if (++i > IPIPE_TFLG_DOMSTATE_SHIFT+3) + break; + } +} + static notrace int __ipipe_get_free_trace_path(int old, int cpu_id) { int new_active = old; @@ -282,6 +301,8 @@ point->v = v; ipipe_read_tsc(point->timestamp); + __ipipe_store_domain_states(point, cpu_id); + /* forward to next point buffer */ next_pos = WRAP_POINT_NO(pos+1); tp->trace_pos = next_pos; @@ -617,6 +638,7 @@ { char mark = ' '; int point_no = point - print_path->point; + int i; if (print_path->end == point_no) mark = '<'; @@ -626,6 +648,12 @@ mark = ':'; 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)) ? '*' : ' '); } static void