From 6f10a5b14f5b7f43568d109633533a8ecc057fc6 Mon Sep 17 00:00:00 2001 From: Lars Friend Date: Tue, 15 Oct 2013 01:14:53 -0400 Subject: [PATCH] Allow events with extra flags to also set unit_mask Older distributions may be running kernels that still use the /dev/opcontrol interface. On an Intel Ivy Bridge machine and similar processors may want to do something like: opcontrol --setup --no-vmlinux \ --event CPU_CLK_UNHALTED:2000000:0:0:1 \ --event uops_executed:2000000:stall_cycles:0:1 For the uops_executed event in the above example need to both set the extra and the unit_mask bits. The current code in opcontrol would never set the unit_mask bits when the extra bits were set. This change allows both to be set when required. Signed-off-by: William Cohen --- doc/ophelp.1.in | 4 ++++ utils/opcontrol | 9 +++++++-- utils/ophelp.c | 27 ++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/doc/ophelp.1.in b/doc/ophelp.1.in index 083cc85..97383bf 100644 --- a/doc/ophelp.1.in +++ b/doc/ophelp.1.in @@ -49,6 +49,10 @@ Show the default unit mask for the given event. Show the default unit mask for the given event. .br .TP +.BI "--symbolic-unit-mask / -U [event]" +Show the numerical unit and extra mask for given event. +.br +.TP .BI "--extra-mask / -E [event]" Show the extra unit mask for given event. .br diff --git a/utils/opcontrol b/utils/opcontrol index 38bb1ac..a3a6a3c 100644 --- a/utils/opcontrol +++ b/utils/opcontrol @@ -1522,9 +1522,14 @@ do_param_setup() set_ctr_param $CTR count $COUNT set_ctr_param $CTR kernel $KERNEL set_ctr_param $CTR user $USER - set_ctr_param $CTR unit_mask $UNIT_MASK - EXTRA=`$OPHELP --extra-mask $EVENT:$COUNT:$UNIT_MASK_NAMED` + # Resolve a [potentially] symbolic unit mask to a numeric + # unit mask and extra mask. + TMP_SYMBOLIC="`$OPHELP --symbolic-unit-mask $EVENT:$COUNT:$UNIT_MASK`" + UNIT_MASK_NUM=`echo $TMP_SYMBOLIC | awk '{print $1}'` + EXTRA=`echo $TMP_SYMBOLIC | awk '{print $2}'` + set_ctr_param $CTR unit_mask $UNIT_MASK_NUM + if test "$EXTRA" -ne 0 ; then # A value >= 0x40000 returned by 'ophelp --extra-mask' (EXTRA_MIN_VAL) is interpreted # as a valid extra value; otherwise we interpret as a simple unit mask value diff --git a/utils/ophelp.c b/utils/ophelp.c index 7543c6f..f77a19a 100644 --- a/utils/ophelp.c +++ b/utils/ophelp.c @@ -282,6 +282,22 @@ static void resolve_events(void) free(counter_map); } +static void resolve_symbolic_unit_mask(void) +{ + size_t count; + unsigned extra = 0; + + count = parse_events(parsed_events, num_chosen_events, chosen_events, + ignore_count ? 0 : 1); + if (count > 1) { + fprintf(stderr, "More than one event specified.\n"); + exit(EXIT_FAILURE); + } + + op_resolve_unit_mask(parsed_events, &extra); + + printf("%d %d\n", parsed_events[0].unit_mask, extra); +} static void show_unit_mask(void) { @@ -334,6 +349,7 @@ static int check_events; static int unit_mask; static int get_default_event; static int extra_mask; +static int symbolic_unit_mask; static struct poptOption options[] = { { "cpu-type", 'c', POPT_ARG_STRING, &cpu_string, 0, @@ -356,6 +372,9 @@ static struct poptOption options[] = { "list events as XML", NULL, }, { "extra-mask", 'E', POPT_ARG_NONE, &extra_mask, 0, "print extra mask for event", NULL, }, + { "symbolic-unit-mask", 'U', POPT_ARG_NONE, &symbolic_unit_mask, 0, + "resolve an event with symbolic unit mask into numeric unit " + "and extra masks", NULL, }, POPT_AUTOHELP { NULL, 0, 0, NULL, 0, NULL, NULL, }, }; @@ -457,11 +476,17 @@ int main(int argc, char const * argv[]) events = op_events(cpu_type); - if (!chosen_events && (unit_mask || check_events || extra_mask)) { + if (!chosen_events && (unit_mask || check_events || extra_mask || + symbolic_unit_mask)) { fprintf(stderr, "No events given.\n"); exit(EXIT_FAILURE); } + if (symbolic_unit_mask) { + resolve_symbolic_unit_mask(); + exit(EXIT_SUCCESS); + } + if (unit_mask) { show_unit_mask(); exit(EXIT_SUCCESS); -- 1.8.3.1