From: Adrian Hunter <adrian.hun...@intel.com>

Add a function to determine whether an event can be
selected.

This function is needed to allow a tool to automatically
select additional events, but only if they are available.

Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
---
 tools/perf/util/evlist.h |  2 ++
 tools/perf/util/record.c | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 649d6ea..8a04aae 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -193,4 +193,6 @@ static inline void perf_mmap__write_tail(struct perf_mmap 
*md,
        pc->data_tail = tail;
 }
 
+bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char 
*str);
+
 #endif /* __PERF_EVLIST_H */
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index c8845b1..e510453 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -177,3 +177,40 @@ int perf_record_opts__config(struct perf_record_opts *opts)
 {
        return perf_record_opts__config_freq(opts);
 }
+
+bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str)
+{
+       struct perf_evlist *temp_evlist;
+       struct perf_evsel *evsel;
+       int err, fd, cpu;
+       bool ret = false;
+
+       temp_evlist = perf_evlist__new();
+       if (!temp_evlist)
+               return false;
+
+       err = parse_events(temp_evlist, str);
+       if (err)
+               goto out_delete;
+
+       evsel = perf_evlist__last(temp_evlist);
+
+       if (!evlist || cpu_map__empty(evlist->cpus)) {
+               struct cpu_map *cpus = cpu_map__new(NULL);
+
+               cpu =  cpus ? cpus->map[0] : 0;
+               cpu_map__delete(cpus);
+       } else {
+               cpu = evlist->cpus->map[0];
+       }
+
+       fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
+       if (fd >= 0) {
+               close(fd);
+               ret = true;
+       }
+
+out_delete:
+       perf_evlist__delete(temp_evlist);
+       return ret;
+}
-- 
1.8.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to