|
@@ -462,9 +462,9 @@ int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd, int idx)
|
|
|
+static int __perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd, int idx, short revent)
|
|
|
{
|
|
|
- int pos = fdarray__add(&evlist->pollfd, fd, POLLIN | POLLERR | POLLHUP);
|
|
|
+ int pos = fdarray__add(&evlist->pollfd, fd, revent | POLLERR | POLLHUP);
|
|
|
/*
|
|
|
* Save the idx so that when we filter out fds POLLHUP'ed we can
|
|
|
* close the associated evlist->mmap[] entry.
|
|
@@ -480,7 +480,7 @@ static int __perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd, int idx
|
|
|
|
|
|
int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
|
|
|
{
|
|
|
- return __perf_evlist__add_pollfd(evlist, fd, -1);
|
|
|
+ return __perf_evlist__add_pollfd(evlist, fd, -1, POLLIN);
|
|
|
}
|
|
|
|
|
|
static void perf_evlist__munmap_filtered(struct fdarray *fda, int fd)
|
|
@@ -983,15 +983,28 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int idx,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static bool
|
|
|
+perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused,
|
|
|
+ struct perf_evsel *evsel)
|
|
|
+{
|
|
|
+ if (evsel->overwrite)
|
|
|
+ return false;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
|
|
|
struct mmap_params *mp, int cpu,
|
|
|
int thread, int *output)
|
|
|
{
|
|
|
struct perf_evsel *evsel;
|
|
|
+ int revent;
|
|
|
|
|
|
evlist__for_each(evlist, evsel) {
|
|
|
int fd;
|
|
|
|
|
|
+ if (evsel->overwrite != (evlist->overwrite && evlist->backward))
|
|
|
+ continue;
|
|
|
+
|
|
|
if (evsel->system_wide && thread)
|
|
|
continue;
|
|
|
|
|
@@ -1008,6 +1021,8 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
|
|
|
perf_evlist__mmap_get(evlist, idx);
|
|
|
}
|
|
|
|
|
|
+ revent = perf_evlist__should_poll(evlist, evsel) ? POLLIN : 0;
|
|
|
+
|
|
|
/*
|
|
|
* The system_wide flag causes a selected event to be opened
|
|
|
* always without a pid. Consequently it will never get a
|
|
@@ -1016,7 +1031,7 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
|
|
|
* Therefore don't add it for polling.
|
|
|
*/
|
|
|
if (!evsel->system_wide &&
|
|
|
- __perf_evlist__add_pollfd(evlist, fd, idx) < 0) {
|
|
|
+ __perf_evlist__add_pollfd(evlist, fd, idx, revent) < 0) {
|
|
|
perf_evlist__mmap_put(evlist, idx);
|
|
|
return -1;
|
|
|
}
|