aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2014-08-13 10:33:59 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-09-25 15:46:56 -0400
commit6dcf45ef9877863fb68c065e5ade3cdb6217c504 (patch)
tree4077d5eff9288bf8f4e9d2c481ffb166e93b5e62 /tools
parente4b356b56cfe77b800a9bc2e6efefa6a069b8a78 (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 <jolsa@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-8dg8o21t2ntzly2bfh53p3sg@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/builtin-record.c7
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)
308 struct record_opts *opts = &rec->opts; 308 struct record_opts *opts = &rec->opts;
309 struct perf_data_file *file = &rec->file; 309 struct perf_data_file *file = &rec->file;
310 struct perf_session *session; 310 struct perf_session *session;
311 bool disabled = false; 311 bool disabled = false, draining = false;
312 312
313 rec->progname = argv[0]; 313 rec->progname = argv[0];
314 314
@@ -457,7 +457,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
457 } 457 }
458 458
459 if (hits == rec->samples) { 459 if (hits == rec->samples) {
460 if (done) 460 if (done || draining)
461 break; 461 break;
462 err = perf_evlist__poll(rec->evlist, -1); 462 err = perf_evlist__poll(rec->evlist, -1);
463 /* 463 /*
@@ -467,6 +467,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
467 if (err > 0 || (err < 0 && errno == EINTR)) 467 if (err > 0 || (err < 0 && errno == EINTR))
468 err = 0; 468 err = 0;
469 waking++; 469 waking++;
470
471 if (perf_evlist__filter_pollfd(rec->evlist, POLLERR | POLLHUP) == 0)
472 draining = true;
470 } 473 }
471 474
472 /* 475 /*