diff options
author | Wang Nan <wangnan0@huawei.com> | 2016-05-23 03:13:38 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-05-23 17:22:00 -0400 |
commit | 65aea2338765da1a58cc26eeb84d72308492ecb5 (patch) | |
tree | 90998c4711d3349fbe05bc15ac60ece597c92f3c | |
parent | 12f3ca4fc8e27aa602c9c3c717d755b1e8f7fd47 (diff) |
perf evlist: Add API to pause/resume
perf_evlist__toggle_{pause,resume}() are introduced to pause/resume
events in an evlist. Utilize PERF_EVENT_IOC_PAUSE_OUTPUT ioctl.
Following commits use them to ensure overwrite ring buffer is paused
before reading.
Signed-off-by: Wang Nan <wangnan0@huawei.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
Link: http://lkml.kernel.org/r/1463987628-163563-2-git-send-email-wangnan0@huawei.com
Signed-off-by: He Kuang <hekuang@huawei.com>
[ Return -1, like all other ioctl() usage in evlist.c, rename 'pause'
arg to avoid breaking the build on ubuntu 12.04 and other old systems ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/evlist.c | 27 | ||||
-rw-r--r-- | tools/perf/util/evlist.h | 2 |
2 files changed, 29 insertions, 0 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1a370db02a8c..904523a2be90 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -679,6 +679,33 @@ static struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist, | |||
679 | return NULL; | 679 | return NULL; |
680 | } | 680 | } |
681 | 681 | ||
682 | static int perf_evlist__set_paused(struct perf_evlist *evlist, bool value) | ||
683 | { | ||
684 | int i; | ||
685 | |||
686 | for (i = 0; i < evlist->nr_mmaps; i++) { | ||
687 | int fd = evlist->mmap[i].fd; | ||
688 | int err; | ||
689 | |||
690 | if (fd < 0) | ||
691 | continue; | ||
692 | err = ioctl(fd, PERF_EVENT_IOC_PAUSE_OUTPUT, value ? 1 : 0); | ||
693 | if (err) | ||
694 | return err; | ||
695 | } | ||
696 | return 0; | ||
697 | } | ||
698 | |||
699 | int perf_evlist__pause(struct perf_evlist *evlist) | ||
700 | { | ||
701 | return perf_evlist__set_paused(evlist, true); | ||
702 | } | ||
703 | |||
704 | int perf_evlist__resume(struct perf_evlist *evlist) | ||
705 | { | ||
706 | return perf_evlist__set_paused(evlist, false); | ||
707 | } | ||
708 | |||
682 | /* When check_messup is true, 'end' must points to a good entry */ | 709 | /* When check_messup is true, 'end' must points to a good entry */ |
683 | static union perf_event * | 710 | static union perf_event * |
684 | perf_mmap__read(struct perf_mmap *md, bool check_messup, u64 start, | 711 | perf_mmap__read(struct perf_mmap *md, bool check_messup, u64 start, |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 0d165b1d8f77..97090b70976d 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
@@ -136,6 +136,8 @@ void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx); | |||
136 | 136 | ||
137 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx); | 137 | void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx); |
138 | 138 | ||
139 | int perf_evlist__pause(struct perf_evlist *evlist); | ||
140 | int perf_evlist__resume(struct perf_evlist *evlist); | ||
139 | int perf_evlist__open(struct perf_evlist *evlist); | 141 | int perf_evlist__open(struct perf_evlist *evlist); |
140 | void perf_evlist__close(struct perf_evlist *evlist); | 142 | void perf_evlist__close(struct perf_evlist *evlist); |
141 | 143 | ||