lkml.org 
[lkml]   [2016]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 50/55] perf tools: Add API to pause a channel
    Date
    perf_evlist__channel_toggle_paused() is introduced to pause/resume a
    channel in an evlist. Utilize PERF_EVENT_IOC_PAUSE_OUTPUT ioctl.
    Following commits use perf_evlist__channel_toggle_paused() to ensure
    overwrite ring buffer is turned off before reading.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Signed-off-by: He Kuang <hekuang@huawei.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    ---
    tools/perf/util/evlist.c | 28 ++++++++++++++++++++++++++++
    tools/perf/util/evlist.h | 2 ++
    2 files changed, 30 insertions(+)

    diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
    index bd2393a..06c79c8 100644
    --- a/tools/perf/util/evlist.c
    +++ b/tools/perf/util/evlist.c
    @@ -706,6 +706,34 @@ int perf_evlist__channel_idx(struct perf_evlist *evlist,
    return 0;
    }

    +int perf_evlist__channel_toggle_paused(struct perf_evlist *evlist,
    + int channel, bool pause)
    +{
    + int i;
    +
    + if (channel >= perf_evlist__channel_nr(evlist))
    + return -E2BIG;
    + if (!evlist->mmap)
    + return -EFAULT;
    + for (i = 0; i < evlist->nr_mmaps; i++) {
    + int n = channel * evlist->nr_mmaps + i;
    + int fd = evlist->mmap[n].fd;
    + int err;
    +
    + if (fd < 0)
    + continue;
    + err = ioctl(fd, PERF_EVENT_IOC_PAUSE_OUTPUT,
    + pause ? 1 : 0);
    + if (err) {
    + err = (errno == 0 ? -EINVAL : -errno);
    + pr_err("Unable to pause output on %d: %s\n",
    + fd, strerror(-err));
    + return err;
    + }
    + }
    + return 0;
    +}
    +
    union perf_event *perf_evlist__mmap_read_ex(struct perf_evlist *evlist,
    int channel, int idx)
    {
    diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
    index bc6d787..c1831a9 100644
    --- a/tools/perf/util/evlist.h
    +++ b/tools/perf/util/evlist.h
    @@ -180,6 +180,8 @@ perf_evlist__get_mmap(struct perf_evlist *evlist,
    return &evlist->mmap[idx];
    }

    +int perf_evlist__channel_toggle_paused(struct perf_evlist *evlist,
    + int channel, bool pause);
    int perf_evlist__open(struct perf_evlist *evlist);
    void perf_evlist__close(struct perf_evlist *evlist);

    --
    1.8.3.4
    \
     
     \ /
      Last update: 2016-02-19 13:21    [W:4.549 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site