From e075a3dc7aadb76bc88e45d703b2d3630e4357d2 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Mon, 10 Jul 2017 16:02:27 -0700 Subject: [PATCH] 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: Jim Harris Change-Id: I49f2d012d1675b878bcd23afff427c740c6502c7 Reviewed-on: https://review.gerrithub.io/368831 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ziye Yang Reviewed-by: Ben Walker --- include/spdk_internal/bdev.h | 8 ++++++++ lib/bdev/bdev.c | 14 ++++++++++---- lib/bdev/error/vbdev_error.c | 9 ++++++++- lib/bdev/gpt/vbdev_gpt.c | 7 +++++++ lib/bdev/split/vbdev_split.c | 8 +++++++- test/unit/lib/bdev/bdev.c/bdev_ut.c | 10 +++++++++- 6 files changed, 49 insertions(+), 7 deletions(-) diff --git a/include/spdk_internal/bdev.h b/include/spdk_internal/bdev.h index c5c7cedfe..19eb63614 100644 --- a/include/spdk_internal/bdev.h +++ b/include/spdk_internal/bdev.h @@ -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, diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index d3e41a619..317c80d8b 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -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,9 +1383,8 @@ _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(bdev); - } + vbdev_module->examine_in_progress++; + vbdev_module->examine(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); } diff --git a/lib/bdev/error/vbdev_error.c b/lib/bdev/error/vbdev_error.c index 91a82b066..7ca12947d 100644 --- a/lib/bdev/error/vbdev_error.c +++ b/lib/bdev/error/vbdev_error.c @@ -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) diff --git a/lib/bdev/gpt/vbdev_gpt.c b/lib/bdev/gpt/vbdev_gpt.c index 27470499b..ddc44efb9 100644 --- a/lib/bdev/gpt/vbdev_gpt.c +++ b/lib/bdev/gpt/vbdev_gpt.c @@ -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; } diff --git a/lib/bdev/split/vbdev_split.c b/lib/bdev/split/vbdev_split.c index b2e927c5a..07024d841 100644 --- a/lib/bdev/split/vbdev_split.c +++ b/lib/bdev/split/vbdev_split.c @@ -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) diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index 9b1bc5b40..adf1c7420 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -36,6 +36,8 @@ #include "lib/test_env.c" #include "bdev.c" +SPDK_DECLARE_BDEV_MODULE(vbdev_ut); + void * spdk_io_channel_get_ctx(struct spdk_io_channel *ch) { @@ -109,8 +111,14 @@ static struct spdk_bdev_fn_table fn_table = { .destruct = stub_destruct, }; +static void +vbdev_ut_examine(struct spdk_bdev *bdev) +{ + spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(vbdev_ut)); +} + SPDK_BDEV_MODULE_REGISTER(bdev_ut, NULL, NULL, NULL, NULL) -SPDK_VBDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, NULL) +SPDK_VBDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, vbdev_ut_examine) static struct spdk_bdev * allocate_bdev(char *name)