diff options
author | Arnaldo Carvalho de Melo <[email protected]> | 2014-08-13 11:33:59 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <[email protected]> | 2014-09-25 16:46:56 -0300 |
commit | 6dcf45ef9877863fb68c065e5ade3cdb6217c504 (patch) | |
tree | 4077d5eff9288bf8f4e9d2c481ffb166e93b5e62 | |
parent | e4b356b56cfe77b800a9bc2e6efefa6a069b8a78 (diff) |
perf record: Filter out POLLHUP'ed file descriptors
So that we don't continue polling on vanished file descriptors, i.e.
file descriptors for events monitoring threads that exited.
I.e. the following 'perf record' command now exits as expected, instead
of staying in an eternal loop:
$ sleep 5s &
$ perf record -p `pidof sleep`
Reported-by: Jiri Olsa <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Don Zickus <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
-rw-r--r-- | tools/perf/builtin-record.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a8c2e9dfb125..320b198b54dd 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -308,7 +308,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) struct record_opts *opts = &rec->opts; struct perf_data_file *file = &rec->file; struct perf_session *session; - bool disabled = false; + bool disabled = false, draining = false; rec->progname = argv[0]; @@ -457,7 +457,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) } if (hits == rec->samples) { - if (done) + if (done || draining) break; err = perf_evlist__poll(rec->evlist, -1); /* @@ -467,6 +467,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) if (err > 0 || (err < 0 && errno == EINTR)) err = 0; waking++; + + if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0) + draining = true; } /* |