Commit c199c11d authored by Agustin Vega-Frias's avatar Agustin Vega-Frias Committed by Arnaldo Carvalho de Melo

perf pmu: Auto-merge PMU events created by prefix or glob match

Auto-merge for these events was disabled when auto-merging of non-alias
events was disabled in commit 63ce8449 (perf stat: Only auto-merge events
that are PMU aliases).

Non-merging of legacy events is preserved:

    $ perf stat -ag -e cache-misses,cache-misses sleep 1

     Performance counter stats for 'system wide':

                86,323      cache-misses
                86,323      cache-misses

           1.002623307 seconds time elapsed

But prefix or glob matching auto-merges the events created:

    $ perf stat -a -e l3cache/read-miss/ sleep 1

     Performance counter stats for 'system wide':

                   328      l3cache/read-miss/

           1.002627008 seconds time elapsed

    $ perf stat -a -e l3cache_0_[01]/read-miss/ sleep 1

     Performance counter stats for 'system wide':

                   172      l3cache/read-miss/

           1.002627008 seconds time elapsed

As with events created with aliases, auto-merging can be suppressed with
the --no-merge option:

    $ perf stat -a -e l3cache/read-miss/ --no-merge sleep 1

     Performance counter stats for 'system wide':

                    67      l3cache/read-miss/
                    67      l3cache/read-miss/
                    63      l3cache/read-miss/
                    60      l3cache/read-miss/

           1.002622192 seconds time elapsed
Signed-off-by: default avatarAgustin Vega-Frias <agustinv@codeaurora.org>
Acked-by: default avatarAndi Kleen <ak@linux.intel.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Timur Tabi <timur@codeaurora.org>
Cc: linux-arm-kernel@lists.infradead.org
Change-Id: I0a47eed54c05e1982ca964d743b37f50f60c508c
Link: http://lkml.kernel.org/r/1520345084-42646-4-git-send-email-agustinv@codeaurora.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8c5421c0
...@@ -267,11 +267,15 @@ taskset. ...@@ -267,11 +267,15 @@ taskset.
--no-merge:: --no-merge::
Do not merge results from same PMUs. Do not merge results from same PMUs.
When multiple events are created from a single event alias, stat will, When multiple events are created from a single event specification,
by default, aggregate the event counts and show the result in a single stat will, by default, aggregate the event counts and show the result
row. This option disables that behavior and shows the individual events in a single row. This option disables that behavior and shows
and counts. Aliases are listed immediately after the Kernel PMU events the individual events and counts.
by perf list.
Multiple events are created from a single event specification when:
1. Prefix or glob matching is used for the PMU name.
2. Aliases, which are listed immediately after the Kernel PMU events
by perf list, are used.
--smi-cost:: --smi-cost::
Measure SMI cost if msr/aperf/ and msr/smi/ events are supported. Measure SMI cost if msr/aperf/ and msr/smi/ events are supported.
......
...@@ -1217,7 +1217,7 @@ int parse_events_add_numeric(struct parse_events_state *parse_state, ...@@ -1217,7 +1217,7 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
get_config_name(head_config), &config_terms); get_config_name(head_config), &config_terms);
} }
static int __parse_events_add_pmu(struct parse_events_state *parse_state, int parse_events_add_pmu(struct parse_events_state *parse_state,
struct list_head *list, char *name, struct list_head *list, char *name,
struct list_head *head_config, bool auto_merge_stats) struct list_head *head_config, bool auto_merge_stats)
{ {
...@@ -1287,13 +1287,6 @@ static int __parse_events_add_pmu(struct parse_events_state *parse_state, ...@@ -1287,13 +1287,6 @@ static int __parse_events_add_pmu(struct parse_events_state *parse_state,
return evsel ? 0 : -ENOMEM; return evsel ? 0 : -ENOMEM;
} }
int parse_events_add_pmu(struct parse_events_state *parse_state,
struct list_head *list, char *name,
struct list_head *head_config)
{
return __parse_events_add_pmu(parse_state, list, name, head_config, false);
}
int parse_events_multi_pmu_add(struct parse_events_state *parse_state, int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
char *str, struct list_head **listp) char *str, struct list_head **listp)
{ {
...@@ -1323,8 +1316,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state, ...@@ -1323,8 +1316,8 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
return -1; return -1;
list_add_tail(&term->list, head); list_add_tail(&term->list, head);
if (!__parse_events_add_pmu(parse_state, list, if (!parse_events_add_pmu(parse_state, list,
pmu->name, head, true)) { pmu->name, head, true)) {
pr_debug("%s -> %s/%s/\n", str, pr_debug("%s -> %s/%s/\n", str,
pmu->name, alias->str); pmu->name, alias->str);
ok++; ok++;
......
...@@ -167,7 +167,7 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx, ...@@ -167,7 +167,7 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx,
void *ptr, char *type, u64 len); void *ptr, char *type, u64 len);
int parse_events_add_pmu(struct parse_events_state *parse_state, int parse_events_add_pmu(struct parse_events_state *parse_state,
struct list_head *list, char *name, struct list_head *list, char *name,
struct list_head *head_config); struct list_head *head_config, bool auto_merge_stats);
int parse_events_multi_pmu_add(struct parse_events_state *parse_state, int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
char *str, char *str,
......
...@@ -232,7 +232,7 @@ PE_NAME opt_event_config ...@@ -232,7 +232,7 @@ PE_NAME opt_event_config
YYABORT; YYABORT;
ALLOC_LIST(list); ALLOC_LIST(list);
if (parse_events_add_pmu(_parse_state, list, $1, $2)) { if (parse_events_add_pmu(_parse_state, list, $1, $2, false)) {
struct perf_pmu *pmu = NULL; struct perf_pmu *pmu = NULL;
int ok = 0; int ok = 0;
char *pattern; char *pattern;
...@@ -251,7 +251,7 @@ PE_NAME opt_event_config ...@@ -251,7 +251,7 @@ PE_NAME opt_event_config
free(pattern); free(pattern);
YYABORT; YYABORT;
} }
if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms)) if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true))
ok++; ok++;
parse_events_terms__delete(terms); parse_events_terms__delete(terms);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment