aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/evlist.c22
-rw-r--r--tools/perf/util/evsel.c28
-rw-r--r--tools/perf/util/evsel.h2
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
240int perf_evlist__add_default(struct perf_evlist *evlist) 240int 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;
263error_free:
264 perf_evsel__delete(evsel);
265error:
266 return -ENOMEM;
267} 249}
268 250
269int perf_evlist__add_dummy(struct perf_evlist *evlist) 251int 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
256struct 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;
276out:
277 return evsel;
278error_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
178struct perf_evsel *perf_evsel__new_cycles(void);
179
178struct event_format *event_format__new(const char *sys, const char *name); 180struct event_format *event_format__new(const char *sys, const char *name);
179 181
180void perf_evsel__init(struct perf_evsel *evsel, 182void perf_evsel__init(struct perf_evsel *evsel,