Messages in this thread | | | From | "Lubashev, Igor" <> | Subject | RE: [PATCH 2/3] perf kvm: Allow running without stdin | Date | Wed, 23 Oct 2019 16:06:53 +0000 |
| |
> On Wed, Oct 23, 2019 at 6:43 AM Jiri Olsa <jolsa@redhat.com> wrote: > > On Tue, Oct 22, 2019 at 09:54:52PM -0400, Igor Lubashev wrote: > > 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()) > > can this return 0 ? if stdin is EOF then nr_stdin stays -1 > > > + fda->entries[nr_stdin].events = 0; > > why do you need to set events to 0 in here?
Otherwise poll() would wakeup continually, since an EOF stdin is already ready for POLLIN.
- Igor
> thanks, > jirka
| |