diff options
-rw-r--r-- | tools/perf/util/evsel.h | 1 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 1 | ||||
-rw-r--r-- | tools/perf/util/pmu.c | 27 | ||||
-rw-r--r-- | tools/perf/util/pmu.h | 2 |
4 files changed, 31 insertions, 0 deletions
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 5c93bed8e8d9..792b0ea8a8b8 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -91,6 +91,7 @@ struct perf_evsel { | |||
91 | bool immediate; | 91 | bool immediate; |
92 | bool system_wide; | 92 | bool system_wide; |
93 | bool tracking; | 93 | bool tracking; |
94 | bool per_pkg; | ||
94 | /* parse modifier helper */ | 95 | /* parse modifier helper */ |
95 | int exclude_GH; | 96 | int exclude_GH; |
96 | int nr_members; | 97 | int nr_members; |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index c659a3ca1283..5a373483f0e4 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -681,6 +681,7 @@ int parse_events_add_pmu(struct list_head *list, int *idx, | |||
681 | if (evsel) { | 681 | if (evsel) { |
682 | evsel->unit = info.unit; | 682 | evsel->unit = info.unit; |
683 | evsel->scale = info.scale; | 683 | evsel->scale = info.scale; |
684 | evsel->per_pkg = info.per_pkg; | ||
684 | } | 685 | } |
685 | 686 | ||
686 | return evsel ? 0 : -ENOMEM; | 687 | return evsel ? 0 : -ENOMEM; |
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 881b75490533..f003b5a9e059 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c | |||
@@ -163,6 +163,24 @@ error: | |||
163 | return -1; | 163 | return -1; |
164 | } | 164 | } |
165 | 165 | ||
166 | static int | ||
167 | perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char *dir, char *name) | ||
168 | { | ||
169 | char path[PATH_MAX]; | ||
170 | int fd; | ||
171 | |||
172 | snprintf(path, PATH_MAX, "%s/%s.per-pkg", dir, name); | ||
173 | |||
174 | fd = open(path, O_RDONLY); | ||
175 | if (fd == -1) | ||
176 | return -1; | ||
177 | |||
178 | close(fd); | ||
179 | |||
180 | alias->per_pkg = true; | ||
181 | return 0; | ||
182 | } | ||
183 | |||
166 | static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FILE *file) | 184 | static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FILE *file) |
167 | { | 185 | { |
168 | struct perf_pmu_alias *alias; | 186 | struct perf_pmu_alias *alias; |
@@ -181,6 +199,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI | |||
181 | INIT_LIST_HEAD(&alias->terms); | 199 | INIT_LIST_HEAD(&alias->terms); |
182 | alias->scale = 1.0; | 200 | alias->scale = 1.0; |
183 | alias->unit[0] = '\0'; | 201 | alias->unit[0] = '\0'; |
202 | alias->per_pkg = false; | ||
184 | 203 | ||
185 | ret = parse_events_terms(&alias->terms, buf); | 204 | ret = parse_events_terms(&alias->terms, buf); |
186 | if (ret) { | 205 | if (ret) { |
@@ -194,6 +213,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI | |||
194 | */ | 213 | */ |
195 | perf_pmu__parse_unit(alias, dir, name); | 214 | perf_pmu__parse_unit(alias, dir, name); |
196 | perf_pmu__parse_scale(alias, dir, name); | 215 | perf_pmu__parse_scale(alias, dir, name); |
216 | perf_pmu__parse_per_pkg(alias, dir, name); | ||
197 | 217 | ||
198 | list_add_tail(&alias->list, list); | 218 | list_add_tail(&alias->list, list); |
199 | 219 | ||
@@ -209,6 +229,8 @@ static inline bool pmu_alias_info_file(char *name) | |||
209 | return true; | 229 | return true; |
210 | if (len > 6 && !strcmp(name + len - 6, ".scale")) | 230 | if (len > 6 && !strcmp(name + len - 6, ".scale")) |
211 | return true; | 231 | return true; |
232 | if (len > 8 && !strcmp(name + len - 8, ".per-pkg")) | ||
233 | return true; | ||
212 | 234 | ||
213 | return false; | 235 | return false; |
214 | } | 236 | } |
@@ -649,6 +671,8 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, | |||
649 | struct perf_pmu_alias *alias; | 671 | struct perf_pmu_alias *alias; |
650 | int ret; | 672 | int ret; |
651 | 673 | ||
674 | info->per_pkg = false; | ||
675 | |||
652 | /* | 676 | /* |
653 | * Mark unit and scale as not set | 677 | * Mark unit and scale as not set |
654 | * (different from default values, see below) | 678 | * (different from default values, see below) |
@@ -668,6 +692,9 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, | |||
668 | if (ret) | 692 | if (ret) |
669 | return ret; | 693 | return ret; |
670 | 694 | ||
695 | if (alias->per_pkg) | ||
696 | info->per_pkg = true; | ||
697 | |||
671 | list_del(&term->list); | 698 | list_del(&term->list); |
672 | free(term); | 699 | free(term); |
673 | } | 700 | } |
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 8092de78e818..c3a74e0e17a2 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h | |||
@@ -29,6 +29,7 @@ struct perf_pmu { | |||
29 | struct perf_pmu_info { | 29 | struct perf_pmu_info { |
30 | const char *unit; | 30 | const char *unit; |
31 | double scale; | 31 | double scale; |
32 | bool per_pkg; | ||
32 | }; | 33 | }; |
33 | 34 | ||
34 | #define UNIT_MAX_LEN 31 /* max length for event unit name */ | 35 | #define UNIT_MAX_LEN 31 /* max length for event unit name */ |
@@ -39,6 +40,7 @@ struct perf_pmu_alias { | |||
39 | struct list_head list; /* ELEM */ | 40 | struct list_head list; /* ELEM */ |
40 | char unit[UNIT_MAX_LEN+1]; | 41 | char unit[UNIT_MAX_LEN+1]; |
41 | double scale; | 42 | double scale; |
43 | bool per_pkg; | ||
42 | }; | 44 | }; |
43 | 45 | ||
44 | struct perf_pmu *perf_pmu__find(const char *name); | 46 | struct perf_pmu *perf_pmu__find(const char *name); |