diff options
| author | Wang Nan <wangnan0@huawei.com> | 2016-02-19 11:44:00 +0000 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-02-19 19:12:50 -0300 | 
| commit | 10bf358a1b79fa1311eb05ee31f2cefdcad01741 (patch) | |
| tree | 8a93457385c3ca321e136ebc6254980942a49752 | |
| parent | 1d55e8ef340dad1ccd5aaf53071de41fc3d8dba4 (diff) | |
perf tools: Enable config raw and numeric events
This patch allows setting config terms for raw and numeric events.
For example:
  # perf stat -e cycles/name=cyc/ ls
  ...
  1821108      cyc
  ...
  # perf stat -e r6530160/name=event/ ls
  ...
  1103195      event
  ...
  # perf record -e cycles -e 4:0x6530160/name=evtx,call-graph=fp/ -a sleep 1
  ...
  # perf report --stdio
  ...
  # Samples: 124  of event 'cycles'
  46.61%     0.00%  swapper        [kernel.vmlinux]            [k] cpu_startup_entry
  41.26%     0.00%  swapper        [kernel.vmlinux]            [k] start_secondary
  ...
  # Samples: 91  of event 'evtx'
  ...
  93.76%     0.00%  swapper      [kernel.vmlinux]            [k] cpu_startup_entry
          |
          ---cpu_startup_entry
             |
             |--66.63%--call_cpuidle
             |          cpuidle_enter
             |          |
  ...
3 test cases are introduced to test config terms for symbol, raw and
numeric events.
Committer note:
Further testing shows that we can retrieve the event name using 'perf
evlist -v' and looking at the 'config' perf_event_attr field, i.e.:
  # perf record -e cycles -e 4:0x6530160/name=evtx,call-graph=fp/ -a sleep 1
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 1.724 MB perf.data (2076 samples) ]
  # perf evlist
  cycles
  evtx
  # perf evlist -v
  cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD|IDENTIFIER, read_format: ID, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
evtx: type: 4, size: 112, config: 0x6530160, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CALLCHAIN|CPU|PERIOD|IDENTIFIER, read_format: ID, disabled: 1, inherit: 1, freq: 1, sample_id_all: 1, exclude_guest: 1
  #
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Cody P Schafer <dev@codyps.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jeremie Galarneau <jeremie.galarneau@efficios.com>
Cc: Kirill Smelkov <kirr@nexedi.com>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1455882283-79592-13-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/tests/parse-events.c | 40 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.y | 10 | 
3 files changed, 48 insertions, 5 deletions
| diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 6648274f4601..15e2d055321e 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -1271,6 +1271,31 @@ static int test__checkevent_precise_max_modifier(struct perf_evlist *evlist)  	return 0;  } +static int test__checkevent_config_symbol(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel = perf_evlist__first(evlist); + +	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "insn") == 0); +	return 0; +} + +static int test__checkevent_config_raw(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel = perf_evlist__first(evlist); + +	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "rawpmu") == 0); +	return 0; +} + +static int test__checkevent_config_num(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel = perf_evlist__first(evlist); + +	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "numpmu") == 0); +	return 0; +} + +  static int count_tracepoints(void)  {  	struct dirent *events_ent; @@ -1579,6 +1604,21 @@ static struct evlist_test test__events[] = {  		.check = test__checkevent_precise_max_modifier,  		.id    = 47,  	}, +	{ +		.name  = "instructions/name=insn/", +		.check = test__checkevent_config_symbol, +		.id    = 48, +	}, +	{ +		.name  = "r1234/name=rawpmu/", +		.check = test__checkevent_config_raw, +		.id    = 49, +	}, +	{ +		.name  = "4:0x6530160/name=numpmu/", +		.check = test__checkevent_config_num, +		.id    = 50, +	},  };  static struct evlist_test test__events_pmu[] = { diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 3243e95eb1c7..75576e130e16 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1043,7 +1043,8 @@ int parse_events_add_numeric(struct parse_events_evlist *data,  			return -ENOMEM;  	} -	return add_event(list, &data->idx, &attr, NULL, &config_terms); +	return add_event(list, &data->idx, &attr, +			 get_config_name(head_config), &config_terms);  }  int parse_events_add_pmu(struct parse_events_evlist *data, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index ce68746bdc89..82029f92c4d2 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -407,24 +407,26 @@ PE_NAME ':' PE_NAME  }  event_legacy_numeric: -PE_VALUE ':' PE_VALUE +PE_VALUE ':' PE_VALUE opt_event_config  {  	struct parse_events_evlist *data = _data;  	struct list_head *list;  	ALLOC_LIST(list); -	ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, NULL)); +	ABORT_ON(parse_events_add_numeric(data, list, (u32)$1, $3, $4)); +	parse_events_terms__delete($4);  	$$ = list;  }  event_legacy_raw: -PE_RAW +PE_RAW opt_event_config  {  	struct parse_events_evlist *data = _data;  	struct list_head *list;  	ALLOC_LIST(list); -	ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, NULL)); +	ABORT_ON(parse_events_add_numeric(data, list, PERF_TYPE_RAW, $1, $2)); +	parse_events_terms__delete($2);  	$$ = list;  } | 
