nvmf_example: add the signal handler

Add the same handler for SIGINT and SIGTERM so that
the working thread can exit.

Change-Id: If1ce617ddd778e92bed6f95089c48caf841e256f
Signed-off-by: JinYu <jin.yu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468661
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: GangCao <gang.cao@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
JinYu 2019-09-18 02:42:52 +08:00 committed by Tomasz Zawadzki
parent 9db5eca6a8
commit c871ee40e6
2 changed files with 76 additions and 4 deletions

View File

@ -67,6 +67,7 @@ static struct spdk_thread *g_init_thread = NULL;
static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
static bool g_reactors_exit = false; static bool g_reactors_exit = false;
static enum nvmf_target_state g_target_state; static enum nvmf_target_state g_target_state;
static bool g_intr_received = false;
static void nvmf_target_advance_state(void); static void nvmf_target_advance_state(void);
@ -312,9 +313,6 @@ nvmf_subsystem_init_done(int rc, void *cb_arg)
fprintf(stdout, "bdev subsystem init successfully\n"); fprintf(stdout, "bdev subsystem init successfully\n");
spdk_rpc_initialize(g_rpc_addr); spdk_rpc_initialize(g_rpc_addr);
spdk_rpc_set_state(SPDK_RPC_RUNTIME); spdk_rpc_set_state(SPDK_RPC_RUNTIME);
g_target_state = NVMF_FINI_SUBSYSTEM;
nvmf_target_advance_state();
} }
static void static void
@ -344,6 +342,73 @@ nvmf_target_app_start(void *arg)
nvmf_target_advance_state(); nvmf_target_advance_state();
} }
static void
_nvmf_shutdown_cb(void *ctx)
{
/* Still in initialization state, defer shutdown operation */
if (g_target_state < NVMF_INIT_SUBSYSTEM) {
spdk_thread_send_msg(spdk_get_thread(), _nvmf_shutdown_cb, NULL);
return;
} else if (g_target_state >= NVMF_FINI_SUBSYSTEM) {
/* Already in Shutdown status, ignore the signal */
return;
}
g_target_state = NVMF_FINI_SUBSYSTEM;
nvmf_target_advance_state();
}
static void
nvmf_shutdown_cb(int signo)
{
if (!g_intr_received) {
g_intr_received = true;
spdk_thread_send_msg(g_init_thread, _nvmf_shutdown_cb, NULL);
}
}
static int
nvmf_setup_signal_handlers(void)
{
struct sigaction sigact;
sigset_t sigmask;
int signals[] = {SIGINT, SIGTERM};
int num_signals = sizeof(signals) / sizeof(int);
int rc, i;
rc = sigemptyset(&sigmask);
if (rc) {
fprintf(stderr, "errno:%d--failed to empty signal set\n", errno);
return rc;
}
memset(&sigact, 0, sizeof(sigact));
rc = sigemptyset(&sigact.sa_mask);
if (rc) {
fprintf(stderr, "errno:%d--failed to empty signal set\n", errno);
return rc;
}
/* Install the same handler for SIGINT and SIGTERM */
sigact.sa_handler = nvmf_shutdown_cb;
for (i = 0; i < num_signals; i++) {
rc = sigaction(signals[i], &sigact, NULL);
if (rc < 0) {
fprintf(stderr, "errno:%d--sigaction() failed\n", errno);
return rc;
}
rc = sigaddset(&sigmask, signals[i]);
if (rc) {
fprintf(stderr, "errno:%d--failed to add set\n", errno);
return rc;
}
}
pthread_sigmask(SIG_UNBLOCK, &sigmask, NULL);
return 0;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int rc; int rc;
@ -374,6 +439,10 @@ int main(int argc, char **argv)
lw_thread = TAILQ_FIRST(&g_master_reactor->threads); lw_thread = TAILQ_FIRST(&g_master_reactor->threads);
g_init_thread = spdk_thread_get_from_ctx(lw_thread); g_init_thread = spdk_thread_get_from_ctx(lw_thread);
assert(g_init_thread != NULL); assert(g_init_thread != NULL);
rc = nvmf_setup_signal_handlers();
assert(rc == 0);
spdk_thread_send_msg(g_init_thread, nvmf_target_app_start, NULL); spdk_thread_send_msg(g_init_thread, nvmf_target_app_start, NULL);
nvmf_reactor_run(g_master_reactor); nvmf_reactor_run(g_master_reactor);

View File

@ -21,8 +21,10 @@ NVMF_EXAMPLE="$(build_nvmf_example_args)"
function nvmfexamplestart() function nvmfexamplestart()
{ {
timing_enter start_nvmf_example timing_enter start_nvmf_example
$NVMF_EXAMPLE $1 $NVMF_EXAMPLE $1 &
nvmfpid=$! nvmfpid=$!
trap 'process_shm --id $NVMF_APP_SHM_ID; nvmftestfini; exit 1' SIGINT SIGTERM EXIT
waitforfile /var/tmp/spdk.sock
timing_exit start_nvmf_example timing_exit start_nvmf_example
} }
@ -30,5 +32,6 @@ timing_enter nvmf_example_test
nvmftestinit nvmftestinit
nvmfexamplestart "-m 0xF" nvmfexamplestart "-m 0xF"
trap - SIGINT SIGTERM EXIT
nvmftestfini nvmftestfini
timing_exit nvmf_example_test timing_exit nvmf_example_test