Commit f71447e8 authored by Jim Harris's avatar Jim Harris
Browse files

bdev: remove differentiation between bdev and vbdev modules



We still will sort the bdev_module list so that modules
with an examine() callback are initialized first.  This ensures
they have a chance to initialize before later modules start
registering physical block devices.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I792cfb41b0abe030fe2486a2c872cbf329735932

Reviewed-on: https://review.gerrithub.io/369486


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 7fefd60f
Loading
Loading
Loading
Loading
+14 −28
Original line number Diff line number Diff line
@@ -50,12 +50,8 @@
 * To implement a backend block device driver, a number of functions
 * dictated by struct spdk_bdev_fn_table must be provided.
 *
 * The module should register itself using SPDK_BDEV_MODULE_REGISTER or
 * SPDK_VBDEV_MODULE_REGISTER to define the parameters for the module.
 *
 * Use SPDK_BDEV_MODULE_REGISTER for all block backends that are real disks.
 * Any virtual backends such as RAID, partitioning, etc. should use
 * SPDK_VBDEV_MODULE_REGISTER.
 * The module should register itself using SPDK_BDEV_MODULE_REGISTER to
 * define the parameters for the module.
 *
 * <hr>
 *
@@ -223,7 +219,11 @@ struct spdk_bdev {

	bool bdev_opened_for_write;

	struct spdk_bdev_module_if *vbdev_claim_module;
	/**
	 * Pointer to the module that has claimed this bdev for purposes of creating virtual
	 *  bdevs on top of it.  Set to NULL if the bdev has not been claimed.
	 */
	struct spdk_bdev_module_if *claim_module;

	/** List of open descriptors for this block device. */
	TAILQ_HEAD(, spdk_bdev_desc) open_descs;
@@ -382,11 +382,11 @@ void spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs,
			 int base_bdev_count);
void spdk_vbdev_unregister(struct spdk_bdev *vbdev);

void spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module);
void spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module);

int spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
int spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
				struct spdk_bdev_module_if *module);
void spdk_vbdev_module_release_bdev(struct spdk_bdev *bdev);
void spdk_bdev_module_release_bdev(struct spdk_bdev *bdev);

void spdk_bdev_poller_start(struct spdk_bdev_poller **ppoller,
			    spdk_bdev_poller_fn fn,
@@ -428,7 +428,6 @@ void spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io,
			      int *sc, int *sk, int *asc, int *ascq);

void spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module);
void spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module);

static inline struct spdk_bdev_io *
spdk_bdev_io_from_ctx(void *ctx)
@@ -437,20 +436,7 @@ spdk_bdev_io_from_ctx(void *ctx)
	       ((uintptr_t)ctx - offsetof(struct spdk_bdev_io, driver_ctx));
}

#define SPDK_BDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn)		\
	static struct spdk_bdev_module_if _name ## _if = {					\
	.name		= #_name,								\
	.module_init 	= init_fn,								\
	.module_fini	= fini_fn,								\
	.config_text	= config_fn,								\
	.get_ctx_size	= ctx_size_fn,                                				\
	};  											\
	__attribute__((constructor)) static void _name ## _init(void)  				\
	{                                                           				\
	    spdk_bdev_module_list_add(&_name ## _if);                  				\
	}

#define SPDK_VBDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn, examine_fn)\
#define SPDK_BDEV_MODULE_REGISTER(_name, init_fn, fini_fn, config_fn, ctx_size_fn, examine_fn)\
	static struct spdk_bdev_module_if _name ## _if = {					\
	.name		= #_name,								\
	.module_init 	= init_fn,								\
@@ -461,14 +447,14 @@ spdk_bdev_io_from_ctx(void *ctx)
	};  											\
	__attribute__((constructor)) static void _name ## _init(void) 				\
	{                                                           				\
	    spdk_vbdev_module_list_add(&_name ## _if);                  			\
	    spdk_bdev_module_list_add(&_name ## _if);                  				\
	}

#define SPDK_GET_BDEV_MODULE(name) &name ## _if

/*
 * Modules are not required to use this macro.  It allows modules to reference the module with
 * SPDK_GET_BDEV_MODULE() before it is defined by SPDK_BDEV_MODULE_REGISTER or its VBDEV variant.
 * SPDK_GET_BDEV_MODULE() before it is defined by SPDK_BDEV_MODULE_REGISTER.
 */
#define SPDK_DECLARE_BDEV_MODULE(name)								\
	static struct spdk_bdev_module_if name ## _if;
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ bdev_aio_get_ctx_size(void)
	return sizeof(struct bdev_aio_task);
}

SPDK_BDEV_MODULE_REGISTER(aio, bdev_aio_initialize, NULL, NULL, bdev_aio_get_ctx_size)
SPDK_BDEV_MODULE_REGISTER(aio, bdev_aio_initialize, NULL, NULL, bdev_aio_get_ctx_size, NULL)

static int
bdev_aio_open(struct file_disk *disk)
+32 −69
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ struct spdk_bdev_mgr {
	struct spdk_mempool *buf_large_pool;

	TAILQ_HEAD(, spdk_bdev_module_if) bdev_modules;
	TAILQ_HEAD(, spdk_bdev_module_if) vbdev_modules;

	TAILQ_HEAD(, spdk_bdev) bdevs;

@@ -81,7 +80,6 @@ struct spdk_bdev_mgr {

static struct spdk_bdev_mgr g_bdev_mgr = {
	.bdev_modules = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.bdev_modules),
	.vbdev_modules = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.vbdev_modules),
	.bdevs = TAILQ_HEAD_INITIALIZER(g_bdev_mgr.bdevs),
	.start_poller_fn = NULL,
	.stop_poller_fn = NULL,
@@ -311,12 +309,6 @@ spdk_bdev_module_get_max_ctx_size(void)
		}
	}

	TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
		if (bdev_module->get_ctx_size && bdev_module->get_ctx_size() > max_bdev_module_size) {
			max_bdev_module_size = bdev_module->get_ctx_size();
		}
	}

	return max_bdev_module_size;
}

@@ -330,11 +322,6 @@ spdk_bdev_config_text(FILE *fp)
			bdev_module->config_text(fp);
		}
	}
	TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
		if (bdev_module->config_text) {
			bdev_module->config_text(fp);
		}
	}
}

static int
@@ -383,11 +370,11 @@ spdk_bdev_module_init_complete(int rc)
	}

	/*
	 * Check all vbdev modules for an examinations in progress.  If any
	 * Check all bdev modules for an examinations in progress.  If any
	 * exist, return immediately since we cannot finish bdev subsystem
	 * initialization until all are completed.
	 */
	TAILQ_FOREACH(m, &g_bdev_mgr.vbdev_modules, tailq) {
	TAILQ_FOREACH(m, &g_bdev_mgr.bdev_modules, tailq) {
		if (m->examine_in_progress > 0) {
			return;
		}
@@ -412,22 +399,6 @@ spdk_bdev_modules_init(void)
	return 0;
}

static int
spdk_vbdev_modules_init(void)
{
	struct spdk_bdev_module_if *module;
	int rc;

	TAILQ_FOREACH(module, &g_bdev_mgr.vbdev_modules, tailq) {
		rc = module->module_init();
		if (rc != 0) {
			return rc;
		}
	}

	return 0;
}

void
spdk_bdev_poller_start(struct spdk_bdev_poller **ppoller,
		       spdk_bdev_poller_fn fn,
@@ -510,12 +481,6 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg,
				spdk_bdev_mgmt_channel_destroy,
				sizeof(struct spdk_bdev_mgmt_channel));

	rc = spdk_vbdev_modules_init();
	if (rc != 0) {
		spdk_bdev_module_init_complete(rc);
		return;
	}

	rc = spdk_bdev_modules_init();
	spdk_bdev_module_init_complete(rc);
}
@@ -525,12 +490,6 @@ spdk_bdev_finish(void)
{
	struct spdk_bdev_module_if *bdev_module;

	TAILQ_FOREACH(bdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
		if (bdev_module->module_fini) {
			bdev_module->module_fini();
		}
	}

	TAILQ_FOREACH(bdev_module, &g_bdev_mgr.bdev_modules, tailq) {
		if (bdev_module->module_fini) {
			bdev_module->module_fini();
@@ -1378,7 +1337,7 @@ spdk_bdev_io_get_nvme_status(const struct spdk_bdev_io *bdev_io, int *sct, int *
static void
_spdk_bdev_register(struct spdk_bdev *bdev)
{
	struct spdk_bdev_module_if *vbdev_module;
	struct spdk_bdev_module_if *module;

	assert(bdev->module != NULL);

@@ -1402,9 +1361,11 @@ _spdk_bdev_register(struct spdk_bdev *bdev)
	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "Inserting bdev %s into list\n", bdev->name);
	TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, link);

	TAILQ_FOREACH(vbdev_module, &g_bdev_mgr.vbdev_modules, tailq) {
		vbdev_module->examine_in_progress++;
		vbdev_module->examine(bdev);
	TAILQ_FOREACH(module, &g_bdev_mgr.bdev_modules, tailq) {
		if (module->examine) {
			module->examine_in_progress++;
			module->examine(bdev);
		}
	}
}

@@ -1478,7 +1439,7 @@ spdk_vbdev_unregister(struct spdk_bdev *vbdev)
}

void
spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
spdk_bdev_module_examine_done(struct spdk_bdev_module_if *module)
{
	struct spdk_bdev_module_if *m;

@@ -1486,11 +1447,11 @@ spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
	module->examine_in_progress--;

	/*
	 * Check all vbdev modules for an examinations in progress.  If any
	 * Check all bdev modules for an examinations in progress.  If any
	 * exist, return immediately since we cannot finish bdev subsystem
	 * initialization until all are completed.
	 */
	TAILQ_FOREACH(m, &g_bdev_mgr.vbdev_modules, tailq) {
	TAILQ_FOREACH(m, &g_bdev_mgr.bdev_modules, tailq) {
		if (m->examine_in_progress > 0) {
			return;
		}
@@ -1499,8 +1460,8 @@ spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
	if (g_bdev_mgr.module_init_complete && !g_bdev_mgr.init_complete) {
		/*
		 * Modules already finished initialization - now that all
		 * the vbdevs have finished their asynchronous I/O processing,
		 * the entire bdev layer can be marked as complete.
		 * the bdev moduless have finished their asynchronous I/O
		 * processing, the entire bdev layer can be marked as complete.
		 */
		spdk_bdev_init_complete(0);
	}
@@ -1519,7 +1480,7 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_

	pthread_mutex_lock(&bdev->mutex);

	if (write && (bdev->bdev_opened_for_write || bdev->vbdev_claim_module)) {
	if (write && (bdev->bdev_opened_for_write || bdev->claim_module)) {
		SPDK_ERRLOG("failed, %s already opened for write or claimed\n", bdev->name);
		free(desc);
		pthread_mutex_unlock(&bdev->mutex);
@@ -1570,12 +1531,12 @@ spdk_bdev_close(struct spdk_bdev_desc *desc)
}

int
spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
			    struct spdk_bdev_module_if *module)
{
	if (bdev->vbdev_claim_module != NULL) {
	if (bdev->claim_module != NULL) {
		SPDK_ERRLOG("bdev %s already claimed by module %s\n", bdev->name,
			    bdev->vbdev_claim_module->name);
			    bdev->claim_module->name);
		return -EPERM;
	}

@@ -1588,15 +1549,15 @@ spdk_vbdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc
		desc->write = true;
	}

	bdev->vbdev_claim_module = module;
	bdev->claim_module = module;
	return 0;
}

void
spdk_vbdev_module_release_bdev(struct spdk_bdev *bdev)
spdk_bdev_module_release_bdev(struct spdk_bdev *bdev)
{
	assert(bdev->vbdev_claim_module != NULL);
	bdev->vbdev_claim_module = NULL;
	assert(bdev->claim_module != NULL);
	bdev->claim_module = NULL;
}

void
@@ -1635,12 +1596,14 @@ spdk_bdev_io_get_iovec(struct spdk_bdev_io *bdev_io, struct iovec **iovp, int *i
void
spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module)
{
	/*
	 * Modules with examine callbacks must be initialized first, so they are
	 *  ready to handle examine callbacks from later modules that will
	 *  register physical bdevs.
	 */
	if (bdev_module->examine != NULL) {
		TAILQ_INSERT_HEAD(&g_bdev_mgr.bdev_modules, bdev_module, tailq);
	} else {
		TAILQ_INSERT_TAIL(&g_bdev_mgr.bdev_modules, bdev_module, tailq);
	}

void
spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module)
{
	assert(vbdev_module->examine != NULL);
	TAILQ_INSERT_TAIL(&g_bdev_mgr.vbdev_modules, vbdev_module, tailq);
}
+5 −5
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ spdk_vbdev_error_create(struct spdk_bdev *base_bdev)
		goto cleanup;
	}

	rc = spdk_vbdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(error));
	rc = spdk_bdev_module_claim_bdev(base_bdev, NULL, SPDK_GET_BDEV_MODULE(error));
	if (rc) {
		SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(base_bdev));
		goto cleanup;
@@ -305,7 +305,7 @@ vbdev_error_examine(struct spdk_bdev *bdev)

	sp = spdk_conf_find_section(NULL, "BdevError");
	if (sp == NULL) {
		spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
		spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
		return;
	}

@@ -330,7 +330,7 @@ vbdev_error_examine(struct spdk_bdev *bdev)
		}
	}

	spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
	spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
}

static void
@@ -343,5 +343,5 @@ vbdev_error_fini(void)
	}
}

SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
SPDK_BDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
			  vbdev_error_examine)
+7 −7
Original line number Diff line number Diff line
@@ -445,7 +445,7 @@ spdk_gpt_bdev_complete(struct spdk_bdev_io *bdev_io, bool status, void *arg)
		goto end;
	}

	rc = spdk_vbdev_module_claim_bdev(bdev, NULL, SPDK_GET_BDEV_MODULE(gpt));
	rc = spdk_bdev_module_claim_bdev(bdev, NULL, SPDK_GET_BDEV_MODULE(gpt));
	if (rc) {
		SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(bdev));
		goto end;
@@ -463,13 +463,13 @@ end:
	 * Notify the generic bdev layer that the actions related to the original examine
	 *  callback are now completed.
	 */
	spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
	spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));

	if (gpt_bdev->ref == 0) {
		/* If no gpt_partition_disk instances were created, free the base context */
		spdk_gpt_bdev_free(gpt_bdev);
		if (claimed) {
			spdk_vbdev_module_release_bdev(bdev);
			spdk_bdev_module_release_bdev(bdev);
		}
	}
}
@@ -526,13 +526,13 @@ vbdev_gpt_examine(struct spdk_bdev *bdev)
	int rc;

	if (g_gpt_disabled) {
		spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
		spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
		return;
	}

	rc = vbdev_gpt_read_gpt(bdev);
	if (rc) {
		spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
		spdk_bdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
		SPDK_ERRLOG("Failed to read info from bdev %s\n", spdk_bdev_get_name(bdev));
	}
}
@@ -547,6 +547,6 @@ vbdev_gpt_get_ctx_size(void)
	return sizeof(struct spdk_io_channel *);
}

SPDK_VBDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, vbdev_gpt_fini, NULL,
SPDK_BDEV_MODULE_REGISTER(gpt, vbdev_gpt_init, vbdev_gpt_fini, NULL,
			  vbdev_gpt_get_ctx_size, vbdev_gpt_examine)
SPDK_LOG_REGISTER_TRACE_FLAG("vbdev_gpt", SPDK_TRACE_VBDEV_GPT)
Loading