diff options
-rw-r--r-- | tools/perf/util/evlist.c | 22 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 28 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 2 |
3 files changed, 32 insertions, 20 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 2a40b8e1def7..097b3ed77fdd 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -239,31 +239,13 @@ void perf_event_attr__set_max_precise_ip(struct perf_event_attr *attr) | |||
239 | 239 | ||
240 | int perf_evlist__add_default(struct perf_evlist *evlist) | 240 | int perf_evlist__add_default(struct perf_evlist *evlist) |
241 | { | 241 | { |
242 | struct perf_event_attr attr = { | 242 | struct perf_evsel *evsel = perf_evsel__new_cycles(); |
243 | .type = PERF_TYPE_HARDWARE, | ||
244 | .config = PERF_COUNT_HW_CPU_CYCLES, | ||
245 | }; | ||
246 | struct perf_evsel *evsel; | ||
247 | |||
248 | event_attr_init(&attr); | ||
249 | 243 | ||
250 | perf_event_attr__set_max_precise_ip(&attr); | ||
251 | |||
252 | evsel = perf_evsel__new(&attr); | ||
253 | if (evsel == NULL) | 244 | if (evsel == NULL) |
254 | goto error; | 245 | return -ENOMEM; |
255 | |||
256 | /* use asprintf() because free(evsel) assumes name is allocated */ | ||
257 | if (asprintf(&evsel->name, "cycles%.*s", | ||
258 | attr.precise_ip ? attr.precise_ip + 1 : 0, ":ppp") < 0) | ||
259 | goto error_free; | ||
260 | 246 | ||
261 | perf_evlist__add(evlist, evsel); | 247 | perf_evlist__add(evlist, evsel); |
262 | return 0; | 248 | return 0; |
263 | error_free: | ||
264 | perf_evsel__delete(evsel); | ||
265 | error: | ||
266 | return -ENOMEM; | ||
267 | } | 249 | } |
268 | 250 | ||
269 | int perf_evlist__add_dummy(struct perf_evlist *evlist) | 251 | int perf_evlist__add_dummy(struct perf_evlist *evlist) |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 8c54df61fe64..4c2b31dc4e4d 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -253,6 +253,34 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx) | |||
253 | return evsel; | 253 | return evsel; |
254 | } | 254 | } |
255 | 255 | ||
256 | struct perf_evsel *perf_evsel__new_cycles(void) | ||
257 | { | ||
258 | struct perf_event_attr attr = { | ||
259 | .type = PERF_TYPE_HARDWARE, | ||
260 | .config = PERF_COUNT_HW_CPU_CYCLES, | ||
261 | }; | ||
262 | struct perf_evsel *evsel; | ||
263 | |||
264 | event_attr_init(&attr); | ||
265 | |||
266 | perf_event_attr__set_max_precise_ip(&attr); | ||
267 | |||
268 | evsel = perf_evsel__new(&attr); | ||
269 | if (evsel == NULL) | ||
270 | goto out; | ||
271 | |||
272 | /* use asprintf() because free(evsel) assumes name is allocated */ | ||
273 | if (asprintf(&evsel->name, "cycles%.*s", | ||
274 | attr.precise_ip ? attr.precise_ip + 1 : 0, ":ppp") < 0) | ||
275 | goto error_free; | ||
276 | out: | ||
277 | return evsel; | ||
278 | error_free: | ||
279 | perf_evsel__delete(evsel); | ||
280 | evsel = NULL; | ||
281 | goto out; | ||
282 | } | ||
283 | |||
256 | /* | 284 | /* |
257 | * Returns pointer with encoded error via <linux/err.h> interface. | 285 | * Returns pointer with encoded error via <linux/err.h> interface. |
258 | */ | 286 | */ |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 8a4a6c9f1480..4d44129e050b 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -175,6 +175,8 @@ static inline struct perf_evsel *perf_evsel__newtp(const char *sys, const char * | |||
175 | return perf_evsel__newtp_idx(sys, name, 0); | 175 | return perf_evsel__newtp_idx(sys, name, 0); |
176 | } | 176 | } |
177 | 177 | ||
178 | struct perf_evsel *perf_evsel__new_cycles(void); | ||
179 | |||
178 | struct event_format *event_format__new(const char *sys, const char *name); | 180 | struct event_format *event_format__new(const char *sys, const char *name); |
179 | 181 | ||
180 | void perf_evsel__init(struct perf_evsel *evsel, | 182 | void perf_evsel__init(struct perf_evsel *evsel, |