|
@@ -310,7 +310,7 @@ static struct perf_evsel *
|
|
__add_event(struct list_head *list, int *idx,
|
|
__add_event(struct list_head *list, int *idx,
|
|
struct perf_event_attr *attr,
|
|
struct perf_event_attr *attr,
|
|
char *name, struct cpu_map *cpus,
|
|
char *name, struct cpu_map *cpus,
|
|
- struct list_head *config_terms)
|
|
|
|
|
|
+ struct list_head *config_terms, bool auto_merge_stats)
|
|
{
|
|
{
|
|
struct perf_evsel *evsel;
|
|
struct perf_evsel *evsel;
|
|
|
|
|
|
@@ -324,6 +324,7 @@ __add_event(struct list_head *list, int *idx,
|
|
evsel->cpus = cpu_map__get(cpus);
|
|
evsel->cpus = cpu_map__get(cpus);
|
|
evsel->own_cpus = cpu_map__get(cpus);
|
|
evsel->own_cpus = cpu_map__get(cpus);
|
|
evsel->system_wide = !!cpus;
|
|
evsel->system_wide = !!cpus;
|
|
|
|
+ evsel->auto_merge_stats = auto_merge_stats;
|
|
|
|
|
|
if (name)
|
|
if (name)
|
|
evsel->name = strdup(name);
|
|
evsel->name = strdup(name);
|
|
@@ -339,7 +340,7 @@ static int add_event(struct list_head *list, int *idx,
|
|
struct perf_event_attr *attr, char *name,
|
|
struct perf_event_attr *attr, char *name,
|
|
struct list_head *config_terms)
|
|
struct list_head *config_terms)
|
|
{
|
|
{
|
|
- return __add_event(list, idx, attr, name, NULL, config_terms) ? 0 : -ENOMEM;
|
|
|
|
|
|
+ return __add_event(list, idx, attr, name, NULL, config_terms, false) ? 0 : -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
static int parse_aliases(char *str, const char *names[][PERF_EVSEL__MAX_ALIASES], int size)
|
|
static int parse_aliases(char *str, const char *names[][PERF_EVSEL__MAX_ALIASES], int size)
|
|
@@ -1209,9 +1210,9 @@ 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);
|
|
}
|
|
}
|
|
|
|
|
|
-int parse_events_add_pmu(struct parse_events_state *parse_state,
|
|
|
|
|
|
+static 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)
|
|
{
|
|
{
|
|
struct perf_event_attr attr;
|
|
struct perf_event_attr attr;
|
|
struct perf_pmu_info info;
|
|
struct perf_pmu_info info;
|
|
@@ -1232,7 +1233,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
|
|
|
|
|
|
if (!head_config) {
|
|
if (!head_config) {
|
|
attr.type = pmu->type;
|
|
attr.type = pmu->type;
|
|
- evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu->cpus, NULL);
|
|
|
|
|
|
+ evsel = __add_event(list, &parse_state->idx, &attr, NULL, pmu->cpus, NULL, auto_merge_stats);
|
|
return evsel ? 0 : -ENOMEM;
|
|
return evsel ? 0 : -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1254,7 +1255,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
|
|
|
|
|
|
evsel = __add_event(list, &parse_state->idx, &attr,
|
|
evsel = __add_event(list, &parse_state->idx, &attr,
|
|
get_config_name(head_config), pmu->cpus,
|
|
get_config_name(head_config), pmu->cpus,
|
|
- &config_terms);
|
|
|
|
|
|
+ &config_terms, auto_merge_stats);
|
|
if (evsel) {
|
|
if (evsel) {
|
|
evsel->unit = info.unit;
|
|
evsel->unit = info.unit;
|
|
evsel->scale = info.scale;
|
|
evsel->scale = info.scale;
|
|
@@ -1267,6 +1268,13 @@ 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)
|
|
{
|
|
{
|
|
@@ -1296,8 +1304,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,
|
|
|
|
- pmu->name, head)) {
|
|
|
|
|
|
+ if (!__parse_events_add_pmu(parse_state, list,
|
|
|
|
+ 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++;
|