Commit 3fb4bc71 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

vhost: move app fini to the vhost subsystem



We already have a vhost subsystem and have to do
its fini anyway, so let's remove application fini.
Technically, any SPDK app can use vhost library
and create vhost devices, so we need to delete them
on shutdown in all cases - in module fini.

Change-Id: I013b45b4e73fd19288b9c10bc995dc24894ecf35
Signed-off-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/396573


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatar <shuhei.matsumoto.xt@hitachi.com>
parent 0c9878d5
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -105,8 +105,6 @@ main(int argc, char *argv[])
		save_pid(g_pid_path);
	}

	opts.shutdown_cb = spdk_vhost_shutdown_cb;

	/* Blocks until the application is exiting */
	rc = spdk_app_start(&opts, spdk_vhost_startup, (void *)g_socket_path, NULL);

+3 −1
Original line number Diff line number Diff line
@@ -47,8 +47,10 @@
extern "C" {
#endif

typedef void (*spdk_vhost_fini_cb)(void);

int spdk_vhost_init(void);
void spdk_vhost_fini(void);
void spdk_vhost_fini(spdk_vhost_fini_cb fini_cb);

/**
 * Init vhost application.  This is called once by SPDK app layer.
+7 −2
Original line number Diff line number Diff line
@@ -48,11 +48,16 @@ spdk_vhost_subsystem_init(void)
}

static void
spdk_vhost_subsystem_fini(void)
spdk_vhost_subsystem_fini_done(void)
{
	spdk_vhost_fini();
	spdk_subsystem_fini_next();
}

static void
spdk_vhost_subsystem_fini(void)
{
	spdk_vhost_fini(spdk_vhost_subsystem_fini_done);
}

SPDK_SUBSYSTEM_REGISTER(vhost, spdk_vhost_subsystem_init, spdk_vhost_subsystem_fini, NULL)
SPDK_SUBSYSTEM_DEPEND(vhost, scsi)
+33 −29
Original line number Diff line number Diff line
@@ -1125,6 +1125,12 @@ out:
	return rc;
}

static void
spdk_vhost_kill_cb(void)
{
	spdk_app_stop(0);
}

void
spdk_vhost_startup(void *arg1, void *arg2)
{
@@ -1159,13 +1165,7 @@ spdk_vhost_startup(void *arg1, void *arg2)
	return;

out:
	spdk_vhost_shutdown_cb();
}

static void
session_app_stop(void *arg1, void *arg2)
{
	spdk_app_stop(0);
	spdk_vhost_fini(spdk_vhost_kill_cb);
}

static void *
@@ -1188,26 +1188,6 @@ session_shutdown(void *arg)
	return NULL;
}

/*
 * When we receive a INT signal. Execute shutdown in separate thread to avoid deadlock.
 */
void
spdk_vhost_shutdown_cb(void)
{
	pthread_t tid;
	int rc;
	struct spdk_event *vhost_app_stop;

	vhost_app_stop = spdk_event_allocate(spdk_env_get_current_core(), session_app_stop, NULL, NULL);

	rc = pthread_create(&tid, NULL, &session_shutdown, vhost_app_stop);
	if (rc < 0) {
		SPDK_ERRLOG("Failed to start session shutdown thread (%d): %s\n", rc, spdk_strerror(rc));
		abort();
	}
	pthread_detach(tid);
}

void
spdk_vhost_dump_config_json(struct spdk_vhost_dev *vdev,
			    struct spdk_json_write_ctx *w)
@@ -1357,10 +1337,34 @@ spdk_vhost_init(void)
	return 0;
}

void
spdk_vhost_fini(void)
static void
_spdk_vhost_fini(void *arg1, void *arg2)
{
	spdk_vhost_fini_cb fini_cb = arg1;

	free(g_num_ctrlrs);
	fini_cb();
}

void
spdk_vhost_fini(spdk_vhost_fini_cb fini_cb)
{
	pthread_t tid;
	int rc;
	struct spdk_event *fini_ev;

	fini_ev = spdk_event_allocate(spdk_env_get_current_core(), _spdk_vhost_fini, fini_cb, NULL);

	/* rte_vhost API for removing sockets is not asynchronous. Since it may call SPDK
	 * ops for stopping a device or removing a connection, we need to call it from
	 * a separate thread to avoid deadlock.
	 */
	rc = pthread_create(&tid, NULL, &session_shutdown, fini_ev);
	if (rc < 0) {
		SPDK_ERRLOG("Failed to start session shutdown thread (%d): %s\n", rc, spdk_strerror(rc));
		abort();
	}
	pthread_detach(tid);
}

SPDK_LOG_REGISTER_COMPONENT("vhost_ring", SPDK_LOG_VHOST_RING)