Commit-ID:  6dcf45ef9877863fb68c065e5ade3cdb6217c504
Gitweb:     http://git.kernel.org/tip/6dcf45ef9877863fb68c065e5ade3cdb6217c504
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Wed, 13 Aug 2014 11:33:59 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Thu, 25 Sep 2014 16:46:56 -0300

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]>
---
 tools/perf/builtin-record.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index a8c2e9d..320b198 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;
                }
 
                /*
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to