perf evsel: Introduce constructor for cycles event
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 28 Jul 2016 21:33:20 +0000 (18:33 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 28 Jul 2016 21:33:20 +0000 (18:33 -0300)
That is the default used when no events is specified in tools, separate
it so that simpler tools that need no evlist can use it directly.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-67mwuthscwroz88x9pswcqyv@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evlist.c
tools/perf/util/evsel.c
tools/perf/util/evsel.h

index 2a40b8e1def70655277ac0458ad0becc1bbd8877..097b3ed77fddcffe39f7530d75ff5b665f9314a7 100644 (file)
@@ -239,31 +239,13 @@ void perf_event_attr__set_max_precise_ip(struct perf_event_attr *attr)
 
 int perf_evlist__add_default(struct perf_evlist *evlist)
 {
-       struct perf_event_attr attr = {
-               .type = PERF_TYPE_HARDWARE,
-               .config = PERF_COUNT_HW_CPU_CYCLES,
-       };
-       struct perf_evsel *evsel;
-
-       event_attr_init(&attr);
+       struct perf_evsel *evsel = perf_evsel__new_cycles();
 
-       perf_event_attr__set_max_precise_ip(&attr);
-
-       evsel = perf_evsel__new(&attr);
        if (evsel == NULL)
-               goto error;
-
-       /* 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;
+               return -ENOMEM;
 
        perf_evlist__add(evlist, evsel);
        return 0;
-error_free:
-       perf_evsel__delete(evsel);
-error:
-       return -ENOMEM;
 }
 
 int perf_evlist__add_dummy(struct perf_evlist *evlist)
index 8c54df61fe642d0245c72f88a3d6a300af8f5d26..4c2b31dc4e4d67643b2cd7af4b628d5cb5cb43fb 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.
  */
index 8a4a6c9f14808032904314cf398ddcda2d2dc127..4d44129e050b0fef0ddc43ef2fd9c9c446349f0a 100644 (file)
@@ -175,6 +175,8 @@ static inline struct perf_evsel *perf_evsel__newtp(const char *sys, const char *
        return perf_evsel__newtp_idx(sys, name, 0);
 }
 
+struct perf_evsel *perf_evsel__new_cycles(void);
+
 struct event_format *event_format__new(const char *sys, const char *name);
 
 void perf_evsel__init(struct perf_evsel *evsel,