diff options
author | Jiri Olsa <jolsa@kernel.org> | 2019-09-03 05:19:56 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-09-25 08:51:48 -0400 |
commit | d5a99483dece17dbde01968a7ffc03b7f575dc11 (patch) | |
tree | cf5fa8010b6088a8a3182f2d41eda07483d1871c | |
parent | b0031c22819ab606a0cb648c0f0a7d80db3c3a89 (diff) |
libperf: Add perf_evlist__id_add_fd() function
Add the perf_evlist__id_add_fd() function to libperf as an internal
function.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lore.kernel.org/lkml/20190913132355.21634-32-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/lib/evlist.c | 44 | ||||
-rw-r--r-- | tools/perf/lib/include/internal/evlist.h | 4 | ||||
-rw-r--r-- | tools/perf/util/evlist.c | 43 | ||||
-rw-r--r-- | tools/perf/util/evlist.h | 4 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 2 |
5 files changed, 50 insertions, 47 deletions
diff --git a/tools/perf/lib/evlist.c b/tools/perf/lib/evlist.c index a29ee8a746d9..3a16dd0c044f 100644 --- a/tools/perf/lib/evlist.c +++ b/tools/perf/lib/evlist.c | |||
@@ -4,11 +4,14 @@ | |||
4 | #include <linux/bitops.h> | 4 | #include <linux/bitops.h> |
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | #include <linux/hash.h> | 6 | #include <linux/hash.h> |
7 | #include <sys/ioctl.h> | ||
7 | #include <internal/evlist.h> | 8 | #include <internal/evlist.h> |
8 | #include <internal/evsel.h> | 9 | #include <internal/evsel.h> |
9 | #include <internal/xyarray.h> | 10 | #include <internal/xyarray.h> |
10 | #include <linux/zalloc.h> | 11 | #include <linux/zalloc.h> |
11 | #include <stdlib.h> | 12 | #include <stdlib.h> |
13 | #include <errno.h> | ||
14 | #include <unistd.h> | ||
12 | #include <perf/cpumap.h> | 15 | #include <perf/cpumap.h> |
13 | #include <perf/threadmap.h> | 16 | #include <perf/threadmap.h> |
14 | 17 | ||
@@ -194,3 +197,44 @@ void perf_evlist__id_add(struct perf_evlist *evlist, | |||
194 | perf_evlist__id_hash(evlist, evsel, cpu, thread, id); | 197 | perf_evlist__id_hash(evlist, evsel, cpu, thread, id); |
195 | evsel->id[evsel->ids++] = id; | 198 | evsel->id[evsel->ids++] = id; |
196 | } | 199 | } |
200 | |||
201 | int perf_evlist__id_add_fd(struct perf_evlist *evlist, | ||
202 | struct perf_evsel *evsel, | ||
203 | int cpu, int thread, int fd) | ||
204 | { | ||
205 | u64 read_data[4] = { 0, }; | ||
206 | int id_idx = 1; /* The first entry is the counter value */ | ||
207 | u64 id; | ||
208 | int ret; | ||
209 | |||
210 | ret = ioctl(fd, PERF_EVENT_IOC_ID, &id); | ||
211 | if (!ret) | ||
212 | goto add; | ||
213 | |||
214 | if (errno != ENOTTY) | ||
215 | return -1; | ||
216 | |||
217 | /* Legacy way to get event id.. All hail to old kernels! */ | ||
218 | |||
219 | /* | ||
220 | * This way does not work with group format read, so bail | ||
221 | * out in that case. | ||
222 | */ | ||
223 | if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP) | ||
224 | return -1; | ||
225 | |||
226 | if (!(evsel->attr.read_format & PERF_FORMAT_ID) || | ||
227 | read(fd, &read_data, sizeof(read_data)) == -1) | ||
228 | return -1; | ||
229 | |||
230 | if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) | ||
231 | ++id_idx; | ||
232 | if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) | ||
233 | ++id_idx; | ||
234 | |||
235 | id = read_data[id_idx]; | ||
236 | |||
237 | add: | ||
238 | perf_evlist__id_add(evlist, evsel, cpu, thread, id); | ||
239 | return 0; | ||
240 | } | ||
diff --git a/tools/perf/lib/include/internal/evlist.h b/tools/perf/lib/include/internal/evlist.h index 649406f717bc..7d64185cfabd 100644 --- a/tools/perf/lib/include/internal/evlist.h +++ b/tools/perf/lib/include/internal/evlist.h | |||
@@ -72,4 +72,8 @@ void perf_evlist__id_add(struct perf_evlist *evlist, | |||
72 | struct perf_evsel *evsel, | 72 | struct perf_evsel *evsel, |
73 | int cpu, int thread, u64 id); | 73 | int cpu, int thread, u64 id); |
74 | 74 | ||
75 | int perf_evlist__id_add_fd(struct perf_evlist *evlist, | ||
76 | struct perf_evsel *evsel, | ||
77 | int cpu, int thread, int fd); | ||
78 | |||
75 | #endif /* __LIBPERF_INTERNAL_EVLIST_H */ | 79 | #endif /* __LIBPERF_INTERNAL_EVLIST_H */ |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index f2863b4c61d7..a37eccf65eae 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -461,47 +461,6 @@ int perf_evlist__poll(struct evlist *evlist, int timeout) | |||
461 | return fdarray__poll(&evlist->core.pollfd, timeout); | 461 | return fdarray__poll(&evlist->core.pollfd, timeout); |
462 | } | 462 | } |
463 | 463 | ||
464 | int perf_evlist__id_add_fd(struct evlist *evlist, | ||
465 | struct evsel *evsel, | ||
466 | int cpu, int thread, int fd) | ||
467 | { | ||
468 | u64 read_data[4] = { 0, }; | ||
469 | int id_idx = 1; /* The first entry is the counter value */ | ||
470 | u64 id; | ||
471 | int ret; | ||
472 | |||
473 | ret = ioctl(fd, PERF_EVENT_IOC_ID, &id); | ||
474 | if (!ret) | ||
475 | goto add; | ||
476 | |||
477 | if (errno != ENOTTY) | ||
478 | return -1; | ||
479 | |||
480 | /* Legacy way to get event id.. All hail to old kernels! */ | ||
481 | |||
482 | /* | ||
483 | * This way does not work with group format read, so bail | ||
484 | * out in that case. | ||
485 | */ | ||
486 | if (perf_evlist__read_format(&evlist->core) & PERF_FORMAT_GROUP) | ||
487 | return -1; | ||
488 | |||
489 | if (!(evsel->core.attr.read_format & PERF_FORMAT_ID) || | ||
490 | read(fd, &read_data, sizeof(read_data)) == -1) | ||
491 | return -1; | ||
492 | |||
493 | if (evsel->core.attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) | ||
494 | ++id_idx; | ||
495 | if (evsel->core.attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) | ||
496 | ++id_idx; | ||
497 | |||
498 | id = read_data[id_idx]; | ||
499 | |||
500 | add: | ||
501 | perf_evlist__id_add(&evlist->core, &evsel->core, cpu, thread, id); | ||
502 | return 0; | ||
503 | } | ||
504 | |||
505 | static void perf_evlist__set_sid_idx(struct evlist *evlist, | 464 | static void perf_evlist__set_sid_idx(struct evlist *evlist, |
506 | struct evsel *evsel, int idx, int cpu, | 465 | struct evsel *evsel, int idx, int cpu, |
507 | int thread) | 466 | int thread) |
@@ -776,7 +735,7 @@ static int evlist__mmap_per_evsel(struct evlist *evlist, int idx, | |||
776 | } | 735 | } |
777 | 736 | ||
778 | if (evsel->core.attr.read_format & PERF_FORMAT_ID) { | 737 | if (evsel->core.attr.read_format & PERF_FORMAT_ID) { |
779 | if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread, | 738 | if (perf_evlist__id_add_fd(&evlist->core, &evsel->core, cpu, thread, |
780 | fd) < 0) | 739 | fd) < 0) |
781 | return -1; | 740 | return -1; |
782 | perf_evlist__set_sid_idx(evlist, evsel, idx, cpu, | 741 | perf_evlist__set_sid_idx(evlist, evsel, idx, cpu, |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index eb35b4b1d86f..80b3361613e5 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
@@ -141,10 +141,6 @@ struct evsel * | |||
141 | perf_evlist__find_tracepoint_by_name(struct evlist *evlist, | 141 | perf_evlist__find_tracepoint_by_name(struct evlist *evlist, |
142 | const char *name); | 142 | const char *name); |
143 | 143 | ||
144 | int perf_evlist__id_add_fd(struct evlist *evlist, | ||
145 | struct evsel *evsel, | ||
146 | int cpu, int thread, int fd); | ||
147 | |||
148 | int perf_evlist__add_pollfd(struct evlist *evlist, int fd); | 144 | int perf_evlist__add_pollfd(struct evlist *evlist, int fd); |
149 | int perf_evlist__alloc_pollfd(struct evlist *evlist); | 145 | int perf_evlist__alloc_pollfd(struct evlist *evlist); |
150 | int perf_evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask); | 146 | int perf_evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask); |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index a4a492f11849..9c284d2adcea 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -2662,7 +2662,7 @@ static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist) | |||
2662 | thread++) { | 2662 | thread++) { |
2663 | int fd = FD(evsel, cpu, thread); | 2663 | int fd = FD(evsel, cpu, thread); |
2664 | 2664 | ||
2665 | if (perf_evlist__id_add_fd(evlist, evsel, | 2665 | if (perf_evlist__id_add_fd(&evlist->core, &evsel->core, |
2666 | cpu, thread, fd) < 0) | 2666 | cpu, thread, fd) < 0) |
2667 | return -1; | 2667 | return -1; |
2668 | } | 2668 | } |