The handler called printf(), reset the disposition to SIG_DFL and killed itself, so the process died without stopping the forwarding lcores or closing the devices.
Set the existing per-lcore stopped flag instead, and mark it volatile since it is now written from signal context. SIGINT no longer terminates the application; it stops forwarding and returns to the ntb> prompt, where quit does the teardown. Signed-off-by: Stephen Hemminger <[email protected]> Acked-by: Bruce Richardson <[email protected]> --- examples/ntb/ntb_fwd.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c index 33f3c1ef17..bbacce97db 100644 --- a/examples/ntb/ntb_fwd.c +++ b/examples/ntb/ntb_fwd.c @@ -41,7 +41,7 @@ struct ntb_fwd_stream { struct ntb_fwd_lcore_conf { uint16_t stream_id; uint16_t nb_stream; - uint8_t stopped; + volatile uint8_t stopped; }; enum ntb_fwd_mode { @@ -947,12 +947,16 @@ prompt(void) } static void -signal_handler(int signum) +signal_handler(__rte_unused int signum) { - if (signum == SIGINT || signum == SIGTERM) { - printf("\nSignal %d received, preparing to exit...\n", signum); - signal(signum, SIG_DFL); - kill(getpid(), signum); + struct ntb_fwd_lcore_conf *conf; + uint32_t lcore_id; + + RTE_LCORE_FOREACH_WORKER(lcore_id) { + conf = &fwd_lcore_conf[lcore_id]; + + if (conf->nb_stream) + conf->stopped = 1; } } -- 2.53.0

