Messages in this thread Patch in this message | | | From | Igor Lubashev <> | Subject | [PATCH 2/3] perf kvm: Allow running without stdin | Date | Tue, 22 Oct 2019 21:54:52 -0400 |
| |
Allow perf kvm --stdio to run without access to stdin. This lets perf kvm to run in a batch mode until interrupted.
The following now works as expected:
$ perf kvm top --stdio < /dev/null
Signed-off-by: Igor Lubashev <ilubashe@akamai.com> --- tools/perf/builtin-kvm.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 858da896b518..5217aa3596c7 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -930,18 +930,20 @@ static int fd_set_nonblock(int fd) static int perf_kvm__handle_stdin(void) { - int c; - - c = getc(stdin); - if (c == 'q') + switch (getc(stdin)) { + case 'q': + done = 1; return 1; - - return 0; + case EOF: + return 0; + default: + return 1; + } } static int kvm_events_live_report(struct perf_kvm_stat *kvm) { - int nr_stdin, ret, err = -EINVAL; + int nr_stdin = -1, ret, err = -EINVAL; struct termios save; /* live flag must be set first */ @@ -972,13 +974,16 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm) if (evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0) goto out; - nr_stdin = evlist__add_pollfd(kvm->evlist, fileno(stdin)); - if (nr_stdin < 0) - goto out; - if (fd_set_nonblock(fileno(stdin)) != 0) goto out; + /* add stdin, if it is connected */ + if (getc(stdin) != EOF) { + nr_stdin = evlist__add_pollfd(kvm->evlist, fileno(stdin)); + if (nr_stdin < 0) + goto out; + } + /* everything is good - enable the events and process */ evlist__enable(kvm->evlist); @@ -994,8 +999,10 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm) if (err) goto out; - if (fda->entries[nr_stdin].revents & POLLIN) - done = perf_kvm__handle_stdin(); + if (nr_stdin >= 0 && fda->entries[nr_stdin].revents & POLLIN) { + if (!perf_kvm__handle_stdin()) + fda->entries[nr_stdin].events = 0; + } if (!rc && !done) err = fdarray__poll(fda, 100); -- 2.7.4
| |