On Thu, 24 Dec 2015 21:37:10 -0500 Zhihong Wang <zhihong.wang at intel.com> wrote:
> Handle SIGINT and SIGTERM in testpmd. > > Signed-off-by: Zhihong Wang <zhihong.wang at intel.com> > --- > app/test-pmd/cmdline.c | 19 +++++++++++++------ > app/test-pmd/testpmd.c | 38 ++++++++++++++++++++++++++++++++------ > app/test-pmd/testpmd.h | 1 + > 3 files changed, 46 insertions(+), 12 deletions(-) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index 73298c9..4ff1739 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -90,6 +90,8 @@ > > #include "testpmd.h" > > +static struct cmdline *testpmd_cl; > + > static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t > queue); > > #ifdef RTE_NIC_BYPASS > @@ -9778,17 +9780,22 @@ cmdline_parse_ctx_t main_ctx[] = { > void > prompt(void) > { > - struct cmdline *cl; > - > /* initialize non-constant commands */ > cmd_set_fwd_mode_init(); > > - cl = cmdline_stdin_new(main_ctx, "testpmd> "); > - if (cl == NULL) { > + testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> "); > + if (testpmd_cl == NULL) { > return; > } Style nit: don't need {} around single statement. > - cmdline_interact(cl); > - cmdline_stdin_exit(cl); > + cmdline_interact(testpmd_cl); > + cmdline_stdin_exit(testpmd_cl); > +} > + > +void > +prompt_exit(void) > +{ > + if (testpmd_cl != NULL) > + cmdline_quit(testpmd_cl); > } > > static void > diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c > index 98ae46d..cb38d56 100644 > --- a/app/test-pmd/testpmd.c > +++ b/app/test-pmd/testpmd.c > @@ -1570,13 +1570,16 @@ pmd_test_exit(void) > if (test_done == 0) > stop_packet_forwarding(); > > - FOREACH_PORT(pt_id, ports) { > - printf("Stopping port %d...", pt_id); > - fflush(stdout); > - rte_eth_dev_close(pt_id); > - printf("done\n"); > + if (ports != NULL) { > + FOREACH_PORT(pt_id, ports) { > + printf("Stopping port %d...", pt_id); > + fflush(stdout); > + rte_eth_dev_stop(pt_id); > + rte_eth_dev_close(pt_id); > + printf(" Done\n"); > + } > } > - printf("bye...\n"); > + printf("Bye...\n"); > } > > typedef void (*cmd_func_t)(void); > @@ -1984,12 +1987,34 @@ init_port(void) > ports[pid].enabled = 1; > } > > +static void > +force_quit(void) > +{ > + pmd_test_exit(); > + prompt_exit(); > +} > + > +static void > +sigint_handler(__rte_unused int signum) > +{ > + if (signum == SIGINT || signum == SIGTERM) { signmum is used, so don't want __rte_unused > + printf("\nSignal %d received, preparing to exit...\n", > + signum); > + force_quit(); > + signal(signum, SIG_DFL); > + kill(getpid(), signum); > + } > +} > + > int > main(int argc, char** argv) > { > int diag; > uint8_t port_id; > > + signal(SIGINT, sigint_handler); > + signal(SIGTERM, sigint_handler); > + > diag = rte_eal_init(argc, argv); > if (diag < 0) > rte_panic("Cannot init EAL\n"); > @@ -2041,6 +2066,7 @@ main(int argc, char** argv) > start_packet_forwarding(0); > printf("Press enter to exit\n"); > rc = read(0, &c, 1); > + pmd_test_exit(); > if (rc < 0) > return 1; > } > diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h > index ee7de98..7ffc17b 100644 > --- a/app/test-pmd/testpmd.h > +++ b/app/test-pmd/testpmd.h > @@ -462,6 +462,7 @@ unsigned int parse_item_list(char* str, const char* > item_name, > unsigned int *parsed_items, int check_unique_values); > void launch_args_parse(int argc, char** argv); > void prompt(void); > +void prompt_exit(void); > void nic_stats_display(portid_t port_id); > void nic_stats_clear(portid_t port_id); > void nic_xstats_display(portid_t port_id);