diff -r 7a73e3aeb224 tools/xentrace/formats --- a/tools/xentrace/formats Mon May 04 22:52:18 2009 +0100 +++ b/tools/xentrace/formats Sat May 09 05:09:50 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) do_guest_irq [ vector = 0x%(1)08x, count = 0x%(2)08x, 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 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 Sat May 09 05:09:50 2009 -0400 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,16 @@ boolean_param("noirqbalance", opt_noirqb boolean_param("noirqbalance", opt_noirqbalance); irq_desc_t irq_desc[NR_VECTORS]; + +typedef struct irq_desc_measure +{ + unsigned long max_cycles; + unsigned long tot_cycles; + unsigned long count; +} irq_desc_measure_t; + +irq_desc_measure_t irq_desc_measure[NR_VECTORS]; + static DEFINE_SPINLOCK(vector_lock); int vector_irq[NR_VECTORS] __read_mostly = { @@ -109,11 +120,33 @@ int assign_irq_vector(int irq) return vector; } +static inline void trace_guest_irq(unsigned int vector, + unsigned long tsc_in) +{ + if(tb_init_done) + { + irq_desc_measure_t *desc = &irq_desc_measure[vector]; + long tsc_diff = (long)((unsigned long)get_cycles() - tsc_in); + + if(unlikely(tsc_diff < 0)) + return; + + desc->tot_cycles += tsc_diff; + if(tsc_diff > desc->max_cycles) + desc->max_cycles = tsc_diff; + desc->count++; + TRACE_4D(TRC_TRACE_GUEST_IRQ, vector, + desc->count, desc->tot_cycles, desc->max_cycles); + } + 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 +156,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_guest_irq(vector, tsc_in); irq_exit(); spin_unlock(&desc->lock); return; @@ -147,7 +183,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_guest_irq(vector, tsc_in); 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 Sat May 09 05:09:50 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_GUEST_IRQ (TRC_GEN + 4) #define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1) #define TRC_SCHED_CONTINUE_RUNNING (TRC_SCHED_MIN + 2)