Implement event filtering command line options for xentrace.
PATCH 13/15 Implement event filtering command line options for xentrace.
Implement event filtering command line options for xentrace.
Signed-off-by Edwin Zhai <[email protected]>
Signed-off-by Arun Sharma <[email protected]>
tools/xentrace/xentrace.c +95 -0
@@ -45,6 +45,8 @@char *outfile;struct timespec poll_sleep;unsigned long new_data_thresh; +u32 evt_mask; +u32 cpu_mask; } settings_t;settings_t opts;
@@ -160,6 +162,41 @@return tbufs_mapped; } +/** +* set_mask - set the cpu/event mask in HV +* @mask: the new mask +* @type: the new mask type,0-event mask, 1-cpu mask +* +*/ +void set_mask (u32 mask,int type) +{ +int ret; +dom0_op_t op;/* dom0 op we'll build */ +int xc_handle =xc_interface_open ();/* for accessing control interface */ + + op.cmd =DOM0_TBUFCONTROL ; + op.interface_version =DOM0_INTERFACE_VERSION ; +if (type ==1 ) {/* cpu mask */ + op.u.tbufcontrol.op =DOM0_TBUF_SET_CPU_MASK ; + op.u.tbufcontrol.cpu_mask = mask; +fprintf (stderr,"change cpumask to 0x%x\n" , mask); + }else if (type ==0 ) {/* event mask */ + op.u.tbufcontrol.op =DOM0_TBUF_SET_EVT_MASK ; + op.u.tbufcontrol.evt_mask = mask; +fprintf (stderr,"change evtmask to 0x%x\n" , mask); + } + + ret =do_dom0_op (xc_handle, &op); + +xc_interface_close (xc_handle); + +if ( ret !=0 ) + { +PERROR ("Failure to get trace buffer pointer from Xen and set the new mask" ); +exit (EXIT_FAILURE ); + } + +}/** * init_bufs_ptrs - initialises an array of pointers to the trace buffers
@@ -341,6 +378,31 @@* Various declarations / definitions GNU argp needs to do its work *****************************************************************************/ +int parse_evtmask (char *arg,struct argp_state *state) +{ +settings_t *setup = (settings_t *)state->input; +char *inval; + +/* search filtering class */ +if (strcmp (arg,"gen" ) ==0 ){ + setup->evt_mask |=TRC_GEN ; + }else if (strcmp (arg,"sched" ) ==0 ){ + setup->evt_mask |=TRC_SCHED ; + }else if (strcmp (arg,"dom0op" ) ==0 ){ + setup->evt_mask |=TRC_DOM0OP ; + }else if (strcmp (arg,"vmx" ) ==0 ){ + setup->evt_mask |=TRC_VMX ; + }else if (strcmp (arg,"all" ) ==0 ){ + setup->evt_mask |=TRC_ALL ; + }else { + setup->evt_mask =strtol (arg, &inval,0 ); +if ( inval == arg ) +argp_usage (state); + } + +return 0 ; + +}/* command parser for GNU argp - see GNU docs for more info */ error_t cmd_parser (int key,char *arg,struct argp_state *state)
@@ -366,6 +428,21 @@argp_usage (state); }break ; + +case 'c' :/* set new cpu mask for filtering*/ + { +char *inval; + setup->cpu_mask =strtol (arg, &inval,0 ); +if ( inval == arg ) +argp_usage (state); + } +break ; + +case 'e' :/* set new event mask for filtering*/ + { +parse_evtmask (arg, state); + } +break ;case ARGP_KEY_ARG : {
@@ -397,6 +474,14 @@ .doc ="Set sleep time, p, in milliseconds between polling the trace buffer " "for new data (default " xstr(POLL_SLEEP_MILLIS) ")." }, + + { .name = "cpu-mask", .key='c', .arg="c", + .doc = + "set cpu-mask " }, + + { .name = "evt-mask", .key='e', .arg="e", + .doc = + "set evt-mask " }, {0} };
@@ -430,8 +515,18 @@ opts.outfile =0 ; opts.poll_sleep =millis_to_timespec (POLL_SLEEP_MILLIS ); opts.new_data_thresh =NEW_DATA_THRESH ; + opts.evt_mask =0 ; + opts.cpu_mask =0 ;argp_parse (&parser_def, argc, argv,0 ,0 , &opts); + +if (opts.evt_mask !=0 ) { +set_mask (opts.evt_mask,0 ); + } + +if (opts.cpu_mask !=0 ) { +set_mask (opts.evt_mask,1 ); + }if ( opts.outfile ) outfd =open (opts.outfile,O_WRONLY |O_CREAT );
xen/include/public/trace.h +22 -8
@@ -9,11 +9,21 @@#define __XEN_PUBLIC_TRACE_H__/* Trace classes */ -#define TRC_GEN 0x00010000/* General trace */ -#define TRC_SCHED 0x00020000/* Xen Scheduler trace */ -#define TRC_DOM0OP 0x00040000/* Xen DOM0 operation trace */ -#define TRC_VMX 0x00080000/* Xen VMX trace */ -#define TRC_ALL 0xffff0000 +#define TRC_CLS_SHIFT 16 +#define TRC_GEN 0x0001f000/* General trace */ +#define TRC_SCHED 0x0002f000/* Xen Scheduler trace */ +#define TRC_DOM0OP 0x0004f000/* Xen DOM0 operation trace */ +#define TRC_VMX 0x0008f000/* Xen VMX trace */ +#define TRC_ALL 0xfffff000 + +/* Trace subclasses */ +#define TRC_SUBCLS_SHIFT 12 +/* trace subclasses for VMX */ +#define TRC_VMXEXIT 0x00081000/* VMX exit trace */ +#define TRC_VMXTIMER 0x00082000/* VMX timer trace */ +#define TRC_VMXINT 0x00084000/* VMX interrupt trace */ +#define TRC_VMXIO 0x00088000/* VMX io emulation trace */ +/* Trace events per class */
@@ -31,9 +41,13 @@#define TRC_SCHED_T_TIMER_FN (TRC_SCHED + 12)#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED + 13) -#define TRC_VMX_VMEXIT (TRC_VMX + 1) -#define TRC_VMX_VECTOR (TRC_VMX + 2) -#define TRC_VMX_INT (TRC_VMX + 3) +/* trace events per subclass */ +#define TRC_VMX_VMEXIT (TRC_VMXEXIT + 1) +#define TRC_VMX_VECTOR (TRC_VMXEXIT + 2) + +#define TRC_VMX_TIMER_INTR (TRC_VMXTIMER + 1) + +#define TRC_VMX_INT (TRC_VMXINT + 1)/* This structure represents a single trace buffer record. */ struct t_rec {
xen/include/xen/trace.h +9 -0
@@ -67,6 +67,15 @@if ( (tb_event_mask & event) ==0 )return 0 ; +/* match class */ +if ( ((tb_event_mask >>TRC_CLS_SHIFT ) & (event >>TRC_CLS_SHIFT )) ==0 ) +return 0 ; + +/* then match subclass */ +if ( (((tb_event_mask >>TRC_SUBCLS_SHIFT ) &0xf ) + & ((event >>TRC_SUBCLS_SHIFT ) &0xf )) ==0 ) +return 0 ; +if ( (tb_cpu_mask & (1UL <<smp_processor_id ())) ==0 )return 0 ;