perf evsel: Introduce constructor for cycles event
[cascardo/linux.git] / tools / perf / util / evsel.c
index 8c54df6..4c2b31d 100644 (file)
@@ -253,6 +253,34 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
        return evsel;
 }
 
+struct perf_evsel *perf_evsel__new_cycles(void)
+{
+       struct perf_event_attr attr = {
+               .type   = PERF_TYPE_HARDWARE,
+               .config = PERF_COUNT_HW_CPU_CYCLES,
+       };
+       struct perf_evsel *evsel;
+
+       event_attr_init(&attr);
+
+       perf_event_attr__set_max_precise_ip(&attr);
+
+       evsel = perf_evsel__new(&attr);
+       if (evsel == NULL)
+               goto out;
+
+       /* use asprintf() because free(evsel) assumes name is allocated */
+       if (asprintf(&evsel->name, "cycles%.*s",
+                    attr.precise_ip ? attr.precise_ip + 1 : 0, ":ppp") < 0)
+               goto error_free;
+out:
+       return evsel;
+error_free:
+       perf_evsel__delete(evsel);
+       evsel = NULL;
+       goto out;
+}
+
 /*
  * Returns pointer with encoded error via <linux/err.h> interface.
  */