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

bdev: track number of outstanding examinations



Add a new spdk_vbdev_module_examine_done() API which
vbdev modules can use to notify the generic bdev layer
once a base bdev examination is complete.

This is especially required for asynchronous vbdevs
like GPT which must issue I/O to the base bdev.

As part of this patch, add examine callbacks
for both split and error, which for now only call
this new functions.  Later patches will move code from
the init callback to the examine callback for these
modules.  examine callbacks are now required for all
vbdev modules.

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

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


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarZiye Yang <optimistyzy@gmail.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 7abb7cb8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -119,6 +119,12 @@ struct spdk_bdev_module_if {
	 */
	void (*examine)(struct spdk_bdev *bdev);

	/**
	 * Count of bdev examinations in progress.  Used by generic bdev layer and must
	 * not be modified by bdev modules.
	 */
	uint32_t examine_in_progress;

	TAILQ_ENTRY(spdk_bdev_module_if) tailq;
};

@@ -377,6 +383,8 @@ 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_poller_start(struct spdk_bdev_poller **ppoller,
			    spdk_bdev_poller_fn fn,
			    void *arg,
+10 −4
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ struct spdk_bdev_mgr {
#ifdef SPDK_CONFIG_VTUNE
	__itt_domain	*domain;
#endif

};

static struct spdk_bdev_mgr g_bdev_mgr = {
@@ -1384,11 +1383,10 @@ _spdk_bdev_register(struct spdk_bdev *bdev)
	TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, link);

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

void
spdk_bdev_register(struct spdk_bdev *bdev)
@@ -1459,6 +1457,13 @@ spdk_vbdev_unregister(struct spdk_bdev *vbdev)
	spdk_bdev_unregister(vbdev);
}

void
spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module)
{
	assert(module->examine_in_progress > 0);
	module->examine_in_progress--;
}

static bool
__is_bdev_opened_for_write(struct spdk_bdev *bdev)
{
@@ -1595,5 +1600,6 @@ 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)
{
	assert(vbdev_module->examine != NULL);
	TAILQ_INSERT_TAIL(&g_bdev_mgr.vbdev_modules, vbdev_module, tailq);
}
+8 −1
Original line number Diff line number Diff line
@@ -333,4 +333,11 @@ vbdev_error_fini(void)
	}
}

SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL, NULL)
static void
vbdev_error_examine(struct spdk_bdev *bdev)
{
	spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error));
}

SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL,
			   vbdev_error_examine)
+7 −0
Original line number Diff line number Diff line
@@ -522,6 +522,13 @@ vbdev_gpt_fini(void)
static void
vbdev_gpt_examine(struct spdk_bdev *bdev)
{
	/*
	 * TODO: this will get fixed in a later patch which refactors
	 * the GPT init/register code.  For now, nothing is operating
	 * on the examination counts so just immediately indicate
	 * that the examination is done.
	 */
	spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt));
	if (g_gpt_disabled) {
		return;
	}
+7 −1
Original line number Diff line number Diff line
@@ -425,6 +425,12 @@ vbdev_split_get_ctx_size(void)
	return sizeof(struct spdk_io_channel *);
}

static void
vbdev_split_examine(struct spdk_bdev *bdev)
{
	spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(split));
}

SPDK_VBDEV_MODULE_REGISTER(split, vbdev_split_init, vbdev_split_fini, NULL,
			   vbdev_split_get_ctx_size, NULL)
			   vbdev_split_get_ctx_size, vbdev_split_examine)
SPDK_LOG_REGISTER_TRACE_FLAG("vbdev_split", SPDK_TRACE_VBDEV_SPLIT)
Loading