lkml.org 
[lkml]   [2013]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf evlist: Add can_select_event() method
    Commit-ID:  c09ec622629eeb4b7877646a42852e7156363425
    Gitweb: http://git.kernel.org/tip/c09ec622629eeb4b7877646a42852e7156363425
    Author: Adrian Hunter <adrian.hunter@intel.com>
    AuthorDate: Wed, 11 Dec 2013 14:36:29 +0200
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Fri, 13 Dec 2013 10:30:20 -0300

    perf evlist: Add can_select_event() method

    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.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Namhyung Kim <namhyung@gmail.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/r/1386765443-26966-18-git-send-email-alexander.shishkin@linux.intel.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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;
    +}

    \
     
     \ /
      Last update: 2013-12-16 19:41    [W:8.901 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site