summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2019-09-03 05:19:56 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2019-09-25 08:51:48 -0400
commitd5a99483dece17dbde01968a7ffc03b7f575dc11 (patch)
treecf5fa8010b6088a8a3182f2d41eda07483d1871c
parentb0031c22819ab606a0cb648c0f0a7d80db3c3a89 (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.c44
-rw-r--r--tools/perf/lib/include/internal/evlist.h4
-rw-r--r--tools/perf/util/evlist.c43
-rw-r--r--tools/perf/util/evlist.h4
-rw-r--r--tools/perf/util/evsel.c2
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
201int 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
237add:
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
75int 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
464int 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
505static void perf_evlist__set_sid_idx(struct evlist *evlist, 464static 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 *
141perf_evlist__find_tracepoint_by_name(struct evlist *evlist, 141perf_evlist__find_tracepoint_by_name(struct evlist *evlist,
142 const char *name); 142 const char *name);
143 143
144int perf_evlist__id_add_fd(struct evlist *evlist,
145 struct evsel *evsel,
146 int cpu, int thread, int fd);
147
148int perf_evlist__add_pollfd(struct evlist *evlist, int fd); 144int perf_evlist__add_pollfd(struct evlist *evlist, int fd);
149int perf_evlist__alloc_pollfd(struct evlist *evlist); 145int perf_evlist__alloc_pollfd(struct evlist *evlist);
150int perf_evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask); 146int 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 }