[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [PATCH] Simple instruction trace facility
This very simple patch prints sampled statistics every three seconds about what has been executing on a particular physical processor. Example output for cpu 3 on a JS21 is: (XEN) 0 44efbc: 166 (XEN) 1 42a810: 150090839 (XEN) 2 c0000000004ea660: 1 (XEN) 3 c000000000037ba0: 1 For reference, 42a810 is in Xen's idle loop, and 44efbc is in it's sleep implementation. I don't think it is for submission, hopefully we will soon have a proper high-performance trace facility accessed via an hcall and logic in the dom0 kernel that allows a userspace consumer to drain it. I have another version of this patch with per-cpu buffers and so on, but I'd rather we focus on a real tracing facility. Is anybody working on this? I am posting it here in case it is useful to other people, and because I will soon post some statistics for domUs on secondary processors gathered with it. --- exceptions.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff -r 82ddfe69c62e xen/arch/powerpc/exceptions.c --- a/xen/arch/powerpc/exceptions.c Tue Sep 12 06:48:32 2006 -0400 +++ b/xen/arch/powerpc/exceptions.c Wed Sep 13 17:50:43 2006 -0400 @@ -29,6 +29,15 @@ #undef DEBUG +#define TRACE_DOMAINS + +#ifdef TRACE_DOMAINS +#define MAX_IARS 1000 +static long iars[MAX_IARS][2]; +static long last_dump_time = 0; +static int cpu_to_trace = 3; +#endif + extern ulong ppc_do_softirq(ulong orig_msr); extern void do_timer(struct cpu_user_regs *regs); extern void do_dec(struct cpu_user_regs *regs); @@ -41,6 +50,41 @@ void do_timer(struct cpu_user_regs *regs /* Set HDEC high so it stops firing and can be reprogrammed by * set_preempt() */ mthdec(INT_MAX); + +#ifdef TRACE_DOMAINS + if (smp_processor_id() == cpu_to_trace) { + int i; + long iar = regs->pc; + + for (i = 0; iars[i][0] != 0 && i < MAX_IARS; i++) { + if (iars[i][0] == iar) { + iars[i][1]++; + i = MAX_IARS; + break; + } + } + + if (i < MAX_IARS) { + iars[i][0] = iar; + iars[i][1] = 1; + } + } + + if (smp_processor_id() == 0) { + int i; + long now = mftb(); + long dump_interval = 3 * timebase_freq; + + if (now > last_dump_time + dump_interval) { + last_dump_time = now; + + for (i = 0; iars[i][0] != 0 && i < MAX_IARS; i++) { + printk("%4d %17lx: %ld\n", i, iars[i][0], iars[i][1]); + } + } + } +#endif + raise_softirq(TIMER_SOFTIRQ); } _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |