On 11/16/2022 4:23 AM, Singh, Aman Deep wrote: > Hi Gregory, > > Thanks for the patch. > > On 11/9/2022 10:39 PM, Gregory Etelson wrote: >> Testpmd terminated unconditionally if it failed to start all ports. >> >> The patch allows testpmd to get into the command line, >> if the interactive mode was requested. > > I tested testpmd in interactive mode with no ports. > It did get into command line- > > $./dpdk-testpmd -n 4 -c 0x1f -- -i > testpmd: No probed ethernet devices > Interactive-mode selected > testpmd: create a new mbuf pool <mb_pool_0>: n=179456, size=2176, socket=0 > testpmd: preferred mempool ops selected: ring_mp_mc > Done > testpmd> > >> >> Fixes: 6937d2103e22 ("app/testpmd: add option to not start device") >> >> Cc: step...@networkplumber.org >> Cc: sta...@dpdk.org >> >> Signed-off-by: Gregory Etelson <getel...@nvidia.com> >> --- >> v2: add Cc >> --- >> app/test-pmd/testpmd.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c >> index 7381dfd9e5..8517f376db 100644 >> --- a/app/test-pmd/testpmd.c >> +++ b/app/test-pmd/testpmd.c >> @@ -4433,8 +4433,11 @@ main(int argc, char** argv) >> } >> } >> - if (!no_device_start && start_port(RTE_PORT_ALL) != 0) > > With no ports, start_port returns 0 so it doesn't exits. >
Hi Aman, I think patch is for the case port exists and 'start_port()' failed, in that case testpmd exits. With patch, testpmd only continues after 'start_port()' failure only if interactive mode is selected, that also looks good to me. Gregory, Only for non interactive case if 'start_port()' fails, application exit value changed to 'EXIT_SUCCESS', which is not quite right, can you please fix it? >> - rte_exit(EXIT_FAILURE, "Start ports failed\n"); >> + if (!no_device_start && start_port(RTE_PORT_ALL) != 0) { >> + fprintf(stderr, "Start ports failed\n"); >> + if (!interactive) >> + goto eal_out; >> + } >> /* set all ports to promiscuous mode by default */ >> RTE_ETH_FOREACH_DEV(port_id) { >> @@ -4526,6 +4529,7 @@ main(int argc, char** argv) >> return 1; >> } >> +eal_out: >> ret = rte_eal_cleanup(); >> if (ret != 0) >> rte_exit(EXIT_FAILURE, >