[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] trace: trace hypercalls inside a multicall
# HG changeset patch # User David Vrabel <david.vrabel@xxxxxxxxxx> # Date 1349259095 -3600 # Node ID 8bd7dbcb513db86de032ad0226a561eba9a05ab0 # Parent ffb6e90fee6b4247389203a450aa5d51a4b2bcbe trace: trace hypercalls inside a multicall Add a trace record for every hypercall inside a multicall. These use a new event ID (with a different sub-class ) so they may be filtered out if only the calls into hypervisor are of interest. Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> --- diff -r ffb6e90fee6b -r 8bd7dbcb513d tools/xentrace/formats --- a/tools/xentrace/formats Wed Oct 03 11:11:06 2012 +0100 +++ b/tools/xentrace/formats Wed Oct 03 11:11:35 2012 +0100 @@ -105,6 +105,7 @@ 0x0020110b CPU%(cpu)d %(tsc)d (+%(relt 0x0020100c CPU%(cpu)d %(tsc)d (+%(reltsc)8d) ptwr_emulation_pae [ addr = 0x%(3)08x, eip = 0x%(4)08x, npte = 0x%(2)08x%(1)08x ] 0x0020110c CPU%(cpu)d %(tsc)d (+%(reltsc)8d) ptwr_emulation_pae [ addr = 0x%(4)08x%(3)08x, rip = 0x%(6)08x%(5)08x, npte = 0x%(2)08x%(1)08x ] 0x0020100d CPU%(cpu)d %(tsc)d (+%(reltsc)8d) hypercall [ op = 0x%(1)08x ] +0x0020200e CPU%(cpu)d %(tsc)d (+%(reltsc)8d) hypercall [ op = 0x%(1)08x ] 0x0040f001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) shadow_not_shadow [ gl1e = 0x%(2)08x%(1)08x, va = 0x%(3)08x, flags = 0x%(4)08x ] 0x0040f101 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) shadow_not_shadow [ gl1e = 0x%(2)08x%(1)08x, va = 0x%(4)08x%(3)08x, flags = 0x%(5)08x ] diff -r ffb6e90fee6b -r 8bd7dbcb513d tools/xentrace/xentrace_format --- a/tools/xentrace/xentrace_format Wed Oct 03 11:11:06 2012 +0100 +++ b/tools/xentrace/xentrace_format Wed Oct 03 11:11:35 2012 +0100 @@ -112,6 +112,7 @@ last_tsc = [0] TRC_TRACE_IRQ = 0x1f004 TRC_PV_HYPERCALL_V2 = 0x20100d +TRC_PV_HYPERCALL_SUBCALL = 0x20100e NR_VECTORS = 256 irq_measure = [{'count':0, 'tot_cycles':0, 'max_cycles':0}] * NR_VECTORS @@ -199,7 +200,7 @@ while not interrupted: d3 = irq_measure[d1]['tot_cycles'] d4 = irq_measure[d1]['max_cycles'] - if event == TRC_PV_HYPERCALL_V2: + if event == TRC_PV_HYPERCALL_V2 or event == TRC_PV_HYPERCALL_SUBCALL: # Mask off the argument present bits. d1 &= 0x000fffff diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/arch/x86/trace.c --- a/xen/arch/x86/trace.c Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/arch/x86/trace.c Wed Oct 03 11:11:35 2012 +0100 @@ -30,7 +30,7 @@ void trace_hypercall(void) args[5] = regs->r9; } - __trace_hypercall(regs->eax, args); + __trace_hypercall(TRC_PV_HYPERCALL_V2, regs->eax, args); } void __trace_pv_trap(int trapnr, unsigned long eip, diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/common/compat/multicall.c --- a/xen/common/compat/multicall.c Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/common/compat/multicall.c Wed Oct 03 11:11:35 2012 +0100 @@ -5,6 +5,7 @@ #include <xen/config.h> #include <xen/types.h> #include <xen/multicall.h> +#include <xen/trace.h> #define COMPAT typedef int ret_t; @@ -25,6 +26,17 @@ DEFINE_XEN_GUEST_HANDLE(multicall_entry_ #define do_multicall(l, n) compat_multicall(_##l, n) #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t) +static void __trace_multicall_call(multicall_entry_t *call) +{ + unsigned long args[6]; + int i; + + for ( i = 0; i < ARRAY_SIZE(args); i++ ) + args[i] = call->args[i]; + + __trace_hypercall(TRC_PV_HYPERCALL_SUBCALL, call->op, args); +} + #include "../multicall.c" /* diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/common/multicall.c --- a/xen/common/multicall.c Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/common/multicall.c Wed Oct 03 11:11:35 2012 +0100 @@ -11,14 +11,28 @@ #include <xen/multicall.h> #include <xen/guest_access.h> #include <xen/perfc.h> +#include <xen/trace.h> #include <asm/current.h> #include <asm/hardirq.h> #ifndef COMPAT typedef long ret_t; #define xlat_multicall_entry(mcs) + +static void __trace_multicall_call(multicall_entry_t *call) +{ + __trace_hypercall(TRC_PV_HYPERCALL_SUBCALL, call->op, call->args); +} #endif +static void trace_multicall_call(multicall_entry_t *call) +{ + if ( !tb_init_done ) + return; + + __trace_multicall_call(call); +} + ret_t do_multicall( XEN_GUEST_HANDLE(multicall_entry_t) call_list, unsigned int nr_calls) @@ -47,6 +61,8 @@ do_multicall( break; } + trace_multicall_call(&mcs->call); + do_multicall_call(&mcs->call); #ifndef NDEBUG diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/common/trace.c --- a/xen/common/trace.c Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/common/trace.c Wed Oct 03 11:11:35 2012 +0100 @@ -816,7 +816,8 @@ unlock: tasklet_schedule(&trace_notify_dom0_tasklet); } -void __trace_hypercall(unsigned long op, const unsigned long *args) +void __trace_hypercall(uint32_t event, unsigned long op, + const unsigned long *args) { struct { uint32_t op; @@ -864,8 +865,7 @@ void __trace_hypercall(unsigned long op, break; } - __trace_var(TRC_PV_HYPERCALL_V2, 1, - sizeof(uint32_t) * (1 + (a - d.args)), &d); + __trace_var(event, 1, sizeof(uint32_t) * (1 + (a - d.args)), &d); } /* diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/include/public/trace.h --- a/xen/include/public/trace.h Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/include/public/trace.h Wed Oct 03 11:11:35 2012 +0100 @@ -94,7 +94,8 @@ #define TRC_MEM_POD_ZERO_RECLAIM (TRC_MEM + 17) #define TRC_MEM_POD_SUPERPAGE_SPLINTER (TRC_MEM + 18) -#define TRC_PV_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */ +#define TRC_PV_ENTRY 0x00201000 /* Hypervisor entry points for PV guests. */ +#define TRC_PV_SUBCALL 0x00202000 /* Sub-call in a multicall hypercall */ #define TRC_PV_HYPERCALL (TRC_PV_ENTRY + 1) #define TRC_PV_TRAP (TRC_PV_ENTRY + 3) @@ -108,6 +109,7 @@ #define TRC_PV_PTWR_EMULATION (TRC_PV_ENTRY + 11) #define TRC_PV_PTWR_EMULATION_PAE (TRC_PV_ENTRY + 12) #define TRC_PV_HYPERCALL_V2 (TRC_PV_ENTRY + 13) +#define TRC_PV_HYPERCALL_SUBCALL (TRC_PV_SUBCALL + 14) /* * TRC_PV_HYPERCALL_V2 format diff -r ffb6e90fee6b -r 8bd7dbcb513d xen/include/xen/trace.h --- a/xen/include/xen/trace.h Wed Oct 03 11:11:06 2012 +0100 +++ b/xen/include/xen/trace.h Wed Oct 03 11:11:35 2012 +0100 @@ -44,7 +44,8 @@ static inline void trace_var(u32 event, __trace_var(event, cycles, extra, extra_data); } -void __trace_hypercall(unsigned long call, const unsigned long *args); +void __trace_hypercall(uint32_t event, unsigned long op, + const unsigned long *args); /* Convenience macros for calling the trace function. */ #define TRACE_0D(_e) \ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |