diff -r 7a73e3aeb224 tools/xentrace/formats --- a/tools/xentrace/formats Mon May 04 22:52:18 2009 +0100 +++ b/tools/xentrace/formats Mon May 11 04:30:06 2009 -0400 @@ -3,6 +3,7 @@ 0x0001f001 CPU%(cpu)d %(tsc)d (+%(relt 0x0001f001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) lost_records 0x%(1)08x 0x0001f002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) wrap_buffer 0x%(1)08x 0x0001f003 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_change 0x%(1)08x +0x0001f004 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) trace_irq [ vector = %(1)d, count = %(2)d, tot_cycles = 0x%(3)08x, max_cycles = 0x%(4)08x ] 0x00021011 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) running_to_runnable [ dom:vcpu = 0x%(1)08x ] 0x00021021 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) running_to_blocked [ dom:vcpu = 0x%(1)08x ] diff -r 7a73e3aeb224 tools/xentrace/xentrace_format --- a/tools/xentrace/xentrace_format Mon May 04 22:52:18 2009 +0100 +++ b/tools/xentrace/xentrace_format Mon May 11 04:30:06 2009 -0400 @@ -110,6 +110,10 @@ D7REC = "IIIIIII" last_tsc = [0] +TRC_TRACE_IRQ = 0x1f004 +NR_VECTORS = 256 +irq_measure = [{'count':0, 'tot_cycles':0, 'max_cycles':0}] * NR_VECTORS + i=0 while not interrupted: @@ -179,6 +183,19 @@ while not interrupted: if event == 0x1f003: cpu = d1 + if event == TRC_TRACE_IRQ: + # IN - d1:vector, d2:tsc_in, d3:tsc_out + # OUT - d1:vector, d2:count, d3:tot_cycles, d4:max_cycles + tsc_diff = d3 - d2 + if tsc_diff < 0: + break + irq_measure[d1]['count'] += 1 + irq_measure[d1]['tot_cycles'] += tsc_diff + if irq_measure[d1]['max_cycles'] < tsc_diff: + irq_measure[d1]['max_cycles'] = tsc_diff + d2 = irq_measure[d1]['count'] + d3 = irq_measure[d1]['tot_cycles'] + d4 = irq_measure[d1]['max_cycles'] #tsc = (tscH<<32) | tscL diff -r 7a73e3aeb224 xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Mon May 04 22:52:18 2009 +0100 +++ b/xen/arch/x86/irq.c Mon May 11 04:30:06 2009 -0400 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -109,11 +110,20 @@ int assign_irq_vector(int irq) return vector; } +static inline void trace_irq(unsigned int vector, + unsigned long tsc_in, unsigned long tsc_out) +{ + if(tb_init_done) + TRACE_3D(TRC_TRACE_IRQ, vector, tsc_in, tsc_out); + return; +} + asmlinkage void do_IRQ(struct cpu_user_regs *regs) { unsigned int vector = regs->entry_vector; irq_desc_t *desc = &irq_desc[vector]; struct irqaction *action; + __volatile__ unsigned long tsc_in; perfc_incr(irqs); @@ -123,7 +133,10 @@ asmlinkage void do_IRQ(struct cpu_user_r if ( likely(desc->status & IRQ_GUEST) ) { irq_enter(); + if(tb_init_done) + tsc_in = (unsigned long)get_cycles(); __do_IRQ_guest(vector); + trace_irq(vector, tsc_in, get_cycles()); irq_exit(); spin_unlock(&desc->lock); return; @@ -147,7 +160,10 @@ asmlinkage void do_IRQ(struct cpu_user_r desc->status &= ~IRQ_PENDING; irq_enter(); spin_unlock_irq(&desc->lock); + if(tb_init_done) + tsc_in = (unsigned long)get_cycles(); action->handler(vector_to_irq(vector), action->dev_id, regs); + trace_irq(vector, tsc_in, get_cycles()); spin_lock_irq(&desc->lock); irq_exit(); } diff -r 7a73e3aeb224 xen/include/public/trace.h --- a/xen/include/public/trace.h Mon May 04 22:52:18 2009 +0100 +++ b/xen/include/public/trace.h Mon May 11 04:30:06 2009 -0400 @@ -59,6 +59,7 @@ #define TRC_LOST_RECORDS (TRC_GEN + 1) #define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2) #define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3) +#define TRC_TRACE_IRQ (TRC_GEN + 4) #define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1) #define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2)