Commit 3e7394af authored by Mike Gerdts's avatar Mike Gerdts Committed by Tomasz Zawadzki
Browse files

bdev: remove bdev_register_examine_thread deprecation



Starting in SPDK 23.01, calling spdk_bdev_register() and
spdk_bdev_examine() from a thread other than the app thread was
deprecated. This commit removes the deprecation and as such calling
these functions from a thread other than the app thread is an error.

As a side effect of this commit, all bdev module examine_config() and
examine_disk() callbacks will be called on the app thread.

Change-Id: Idaae06608101e2a513d9312ac5544ffe94effe4a
Signed-off-by: default avatarMike Gerdts <mgerdts@nvidia.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15826


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent f246b2d5
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -58,20 +58,6 @@ and will be removed in SPDK 23.05.
Deprecated `spdk_nvme_ctrlr_prepare_for_reset` API, which will be removed in SPDK 22.01.
For PCIe transport, `spdk_nvme_ctrlr_disconnect` should be used before freeing I/O qpairs.

### bdev

#### `bdev_register_examine_thread`

Deprecated calling `spdk_bdev_register()` and `spdk_bdev_examine()` from a thread other than the
app thread. See `spdk_thread_get_app_thread()`. Starting in SPDK 23.05, calling
`spdk_bdev_register()` or `spdk_bdev_examine()` from a thread other than the app thread will return
an error.

With the removal of this deprecation, calls to vbdev modules' `examine_disk()` and
`examine_config()` callbacks will happen only on the app thread. This means that vbdev module
maintainers will not need to make any changes to examine callbacks that call `spdk_bdev_register()`
on the same thread as the examine callback uses.

### gpt

#### `old_gpt_guid`
+9 −6
Original line number Diff line number Diff line
@@ -73,9 +73,6 @@ int __itt_init_ittlib(const char *, __itt_group_id);
static void log_already_claimed(enum spdk_log_level level, const int line, const char *func,
				const char *detail, struct spdk_bdev *bdev);

SPDK_LOG_DEPRECATION_REGISTER(bdev_register_examine_thread,
			      "bdev register and examine on non-app thread", "SPDK 23.05", 0);

SPDK_LOG_DEPRECATION_REGISTER(vtune_support, "Intel(R) VTune integration", "SPDK 23.05", 0);

static const char *qos_rpc_type[] = {"rw_ios_per_sec",
@@ -770,9 +767,12 @@ spdk_bdev_examine(const char *name)
{
	struct spdk_bdev *bdev;
	struct spdk_bdev_examine_item *item;
	struct spdk_thread *thread = spdk_get_thread();

	if (spdk_unlikely(spdk_thread_get_app_thread() != spdk_get_thread())) {
		SPDK_LOG_DEPRECATED(bdev_register_examine_thread);
	if (spdk_unlikely(spdk_thread_get_app_thread() != thread)) {
		SPDK_ERRLOG("Cannot examine bdev %s on thread %p (%s)\n", name, thread,
			    thread ? spdk_thread_get_name(thread) : "null");
		return -EINVAL;
	}

	if (g_bdev_opts.bdev_auto_examine) {
@@ -7370,10 +7370,13 @@ int
spdk_bdev_register(struct spdk_bdev *bdev)
{
	struct spdk_bdev_desc *desc;
	struct spdk_thread *thread = spdk_get_thread();
	int rc;

	if (spdk_unlikely(spdk_thread_get_app_thread() != spdk_get_thread())) {
		SPDK_LOG_DEPRECATED(bdev_register_examine_thread);
		SPDK_ERRLOG("Cannot examine bdev %s on thread %p (%s)\n", bdev->name, thread,
			    thread ? spdk_thread_get_name(thread) : "null");
		return -EINVAL;
	}

	rc = bdev_register(bdev);
+25 −39
Original line number Diff line number Diff line
@@ -2354,19 +2354,6 @@ bdev_init_wt_cb(void *done, int rc)
}


static uint64_t
get_wrong_thread_hits(void)
{
	static uint64_t previous = 0;
	uint64_t ret, current;

	current = spdk_deprecation_get_hits(_deprecated_bdev_register_examine_thread);
	ret = current - previous;
	previous = current;

	return ret;
}

static int
wrong_thread_setup(void)
{
@@ -2380,18 +2367,13 @@ wrong_thread_setup(void)

	set_thread(1);

	/* Ignore return, just setting the base for the next time it is called. */
	get_wrong_thread_hits();

	return 0;
}

static int
wrong_thread_teardown(void)
{
	int rc;

	rc = get_wrong_thread_hits();
	int rc = 0;

	set_thread(0);

@@ -2412,12 +2394,20 @@ wrong_thread_teardown(void)
	return rc;
}

static void
_bdev_unregistered_wt(void *ctx, int rc)
{
	struct spdk_thread **threadp = ctx;

	*threadp = spdk_get_thread();
}

static void
spdk_bdev_register_wt(void)
{
	struct spdk_bdev bdev = { 0 };
	int rc;
	bool done;
	struct spdk_thread *unreg_thread;

	bdev.name = "wt_bdev";
	bdev.fn_table = &fn_table;
@@ -2427,26 +2417,29 @@ spdk_bdev_register_wt(void)

	/* Can register only on app thread */
	rc = spdk_bdev_register(&bdev);
	CU_ASSERT(rc == 0);
	CU_ASSERT(get_wrong_thread_hits() == 1);
	CU_ASSERT(rc == -EINVAL);

	/* Can unregister on any thread */
	done = false;
	spdk_bdev_unregister(&bdev, _bdev_unregistered, &done);
	set_thread(0);
	rc = spdk_bdev_register(&bdev);
	CU_ASSERT(rc == 0);
	set_thread(1);
	unreg_thread = NULL;
	spdk_bdev_unregister(&bdev, _bdev_unregistered_wt, &unreg_thread);
	poll_threads();
	CU_ASSERT(get_wrong_thread_hits() == 0);
	CU_ASSERT(done);
	CU_ASSERT(unreg_thread == spdk_get_thread());

	/* Can unregister by name on any thread */
	set_thread(0);
	rc = spdk_bdev_register(&bdev);
	CU_ASSERT(rc == 0);
	CU_ASSERT(get_wrong_thread_hits() == 1);
	done = false;
	rc = spdk_bdev_unregister_by_name(bdev.name, bdev.module, _bdev_unregistered, &done);
	set_thread(1);
	unreg_thread = NULL;
	rc = spdk_bdev_unregister_by_name(bdev.name, bdev.module, _bdev_unregistered_wt,
					  &unreg_thread);
	CU_ASSERT(rc == 0);
	poll_threads();
	CU_ASSERT(get_wrong_thread_hits() == 0);
	CU_ASSERT(done);
	CU_ASSERT(unreg_thread == spdk_get_thread());
}

static void
@@ -2473,12 +2466,9 @@ spdk_bdev_examine_wt(void)

	/* Can examine only on the app thread */
	rc = spdk_bdev_examine("ut_bdev_wt");
	CU_ASSERT(rc == 0);
	poll_threads();
	CU_ASSERT(get_wrong_thread_hits() == 1);
	CU_ASSERT(rc == -EINVAL);
	unregister_bdev(&g_bdev);
	CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL);
	CU_ASSERT(get_wrong_thread_hits() == 0);

	/* Can wait for examine on app thread, callback called on app thread. */
	set_thread(0);
@@ -2488,11 +2478,9 @@ spdk_bdev_examine_wt(void)
	rc = spdk_bdev_wait_for_examine(wait_for_examine_cb, &thread);
	CU_ASSERT(rc == 0);
	poll_threads();
	CU_ASSERT(get_wrong_thread_hits() == 0);
	CU_ASSERT(thread == spdk_get_thread());
	unregister_bdev(&g_bdev);
	CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL);
	CU_ASSERT(get_wrong_thread_hits() == 0);

	/* Can wait for examine on non-app thread, callback called on same thread. */
	set_thread(0);
@@ -2502,11 +2490,9 @@ spdk_bdev_examine_wt(void)
	rc = spdk_bdev_wait_for_examine(wait_for_examine_cb, &thread);
	CU_ASSERT(rc == 0);
	poll_threads();
	CU_ASSERT(get_wrong_thread_hits() == 0);
	CU_ASSERT(thread == spdk_get_thread());
	unregister_bdev(&g_bdev);
	CU_ASSERT(spdk_bdev_get_by_name("ut_bdev_wt") == NULL);
	CU_ASSERT(get_wrong_thread_hits() == 0);

	unregister_bdev(&g_bdev);
	g_bdev_opts.bdev_auto_examine = save_auto_examine;