On Thu, Oct 26, 2023 at 7:11 PM Stephen Hemminger <step...@networkplumber.org> wrote: > > Other signals may occur causing read to get interrupted. > Loop until quit flag is set by signal, a character is entered, > or end of file. This fixes bug where testpmd would exit early > because of signal used by TAP device. > > Bugzilla ID: 1305 > Fixes: 0fd1386c30c3 ("app/testpmd: cleanup cleanly from signal")
We need this fix in LTS. Cc: sta...@dpdk.org > Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > --- > app/test-pmd/testpmd.c | 26 +++++++++----------------- > 1 file changed, 9 insertions(+), 17 deletions(-) > > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index 595b77748c2a..619a59f5b891 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -11,7 +11,6 @@ > #include <fcntl.h> > #ifndef RTE_EXEC_ENV_WINDOWS > #include <sys/mman.h> > -#include <sys/select.h> > #endif > #include <sys/types.h> > #include <errno.h> > @@ -4743,25 +4742,18 @@ main(int argc, char** argv) > } > } else { > char c; > - fd_set fds; > > printf("Press enter to exit\n"); > + while (f_quit == 0) { > + /* end-of-file or any character exits loop */ > + if (read(0, &c, 1) >= 0) > + break; > > - FD_ZERO(&fds); > - FD_SET(0, &fds); > - > - /* wait for signal or enter */ > - ret = select(1, &fds, NULL, NULL, NULL); > - if (ret < 0 && errno != EINTR) > - rte_exit(EXIT_FAILURE, > - "Select failed: %s\n", > - strerror(errno)); > - > - /* if got enter then consume it */ > - if (ret == 1 && read(0, &c, 1) < 0) > - rte_exit(EXIT_FAILURE, > - "Read failed: %s\n", > - strerror(errno)); > + if (errno == EINTR) > + continue; > + rte_exit(EXIT_FAILURE, "Read failed: %s\n", > + strerror(errno)); Just a nit here. Indent seems odd, I see an extra whitespace. Otherwise the fix lgtm and resolves the issue reported in bz. Reviewed-by: David Marchand <david.march...@redhat.com> -- David Marchand