vhost: add completion callback to lib init

Prepare vhost lib init to be asynchronous. We'll need
it for setting up the upcoming poll groups.

Change-Id: I3c66b3f17f8635d4b705dd988393431193938971
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452205
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Darek Stojaczyk 2019-04-25 18:11:24 +02:00 committed by Ben Walker
parent 92d6eaa95c
commit a5599094da
3 changed files with 32 additions and 18 deletions

View File

@ -49,8 +49,13 @@ extern "C" {
#endif #endif
/** /**
* Callback funcion for spdk_vhost_fini(). * Callback for spdk_vhost_init().
*
* \param rc 0 on success, negative errno on failure
*/ */
typedef void (*spdk_vhost_init_cb)(int rc);
/** Callback for spdk_vhost_fini(). */
typedef void (*spdk_vhost_fini_cb)(void); typedef void (*spdk_vhost_fini_cb)(void);
/** /**
@ -67,14 +72,14 @@ int spdk_vhost_set_socket_path(const char *basename);
/** /**
* Init vhost environment. * Init vhost environment.
* *
* \return 0 on success, -1 on failure. * \param init_cb Function to be called when the initialization is complete.
*/ */
int spdk_vhost_init(void); void spdk_vhost_init(spdk_vhost_init_cb init_cb);
/** /**
* Clean up the environment of vhost after finishing the vhost application. * Clean up the environment of vhost.
* *
* \param fini_cb Called when the cleanup operation completes. * \param fini_cb Function to be called when the cleanup is complete.
*/ */
void spdk_vhost_fini(spdk_vhost_fini_cb fini_cb); void spdk_vhost_fini(spdk_vhost_fini_cb fini_cb);

View File

@ -37,14 +37,16 @@
#include "spdk_internal/event.h" #include "spdk_internal/event.h"
static void
spdk_vhost_subsystem_init_done(int rc)
{
spdk_subsystem_init_next(rc);
}
static void static void
spdk_vhost_subsystem_init(void) spdk_vhost_subsystem_init(void)
{ {
int rc = 0; spdk_vhost_init(spdk_vhost_subsystem_init_done);
rc = spdk_vhost_init();
spdk_subsystem_init_next(rc);
} }
static void static void

View File

@ -1433,8 +1433,8 @@ spdk_vhost_unlock(void)
pthread_mutex_unlock(&g_spdk_vhost_mutex); pthread_mutex_unlock(&g_spdk_vhost_mutex);
} }
int void
spdk_vhost_init(void) spdk_vhost_init(spdk_vhost_init_cb init_cb)
{ {
uint32_t last_core; uint32_t last_core;
size_t len; size_t len;
@ -1443,7 +1443,8 @@ spdk_vhost_init(void)
if (dev_dirname[0] == '\0') { if (dev_dirname[0] == '\0') {
if (getcwd(dev_dirname, sizeof(dev_dirname) - 1) == NULL) { if (getcwd(dev_dirname, sizeof(dev_dirname) - 1) == NULL) {
SPDK_ERRLOG("getcwd failed (%d): %s\n", errno, spdk_strerror(errno)); SPDK_ERRLOG("getcwd failed (%d): %s\n", errno, spdk_strerror(errno));
return -1; ret = -1;
goto out;
} }
len = strlen(dev_dirname); len = strlen(dev_dirname);
@ -1458,30 +1459,36 @@ spdk_vhost_init(void)
if (!g_num_ctrlrs) { if (!g_num_ctrlrs) {
SPDK_ERRLOG("Could not allocate array size=%u for g_num_ctrlrs\n", SPDK_ERRLOG("Could not allocate array size=%u for g_num_ctrlrs\n",
last_core + 1); last_core + 1);
return -1; ret = -1;
goto out;
} }
ret = spdk_vhost_scsi_controller_construct(); ret = spdk_vhost_scsi_controller_construct();
if (ret != 0) { if (ret != 0) {
SPDK_ERRLOG("Cannot construct vhost controllers\n"); SPDK_ERRLOG("Cannot construct vhost controllers\n");
return -1; ret = -1;
goto out;
} }
ret = spdk_vhost_blk_controller_construct(); ret = spdk_vhost_blk_controller_construct();
if (ret != 0) { if (ret != 0) {
SPDK_ERRLOG("Cannot construct vhost block controllers\n"); SPDK_ERRLOG("Cannot construct vhost block controllers\n");
return -1; ret = -1;
goto out;
} }
#ifdef SPDK_CONFIG_VHOST_INTERNAL_LIB #ifdef SPDK_CONFIG_VHOST_INTERNAL_LIB
ret = spdk_vhost_nvme_controller_construct(); ret = spdk_vhost_nvme_controller_construct();
if (ret != 0) { if (ret != 0) {
SPDK_ERRLOG("Cannot construct vhost NVMe controllers\n"); SPDK_ERRLOG("Cannot construct vhost NVMe controllers\n");
return -1; ret = -1;
goto out;
} }
#endif #endif
return 0; ret = 0;
out:
init_cb(ret);
} }
static void static void