From 4dd2a0d3c5837652d47948daaadcdf2c59509aeb Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Tue, 13 Sep 2022 12:34:53 +0200 Subject: [PATCH] module/raid: enforce some operations on the app thread All operations which affect the state of the raid bdev should be performed on this thread. Remove the thread pointer from struct raid_base_bdev_info because it is no longer necessary. Change-Id: I59678de7dff5c5388cb75449019ae765bdac1fbc Signed-off-by: Artur Paszkiewicz Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14509 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Krzysztof Karas --- module/bdev/raid/bdev_raid.c | 53 +++++++++++++----------------------- module/bdev/raid/bdev_raid.h | 3 -- 2 files changed, 19 insertions(+), 37 deletions(-) diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index 4c6da968d..721b08912 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -11,7 +11,6 @@ #include "spdk/string.h" #include "spdk/util.h" #include "spdk/json.h" -#include "spdk/string.h" static bool g_shutdown_started = false; @@ -170,6 +169,7 @@ raid_bdev_cleanup(struct raid_bdev *raid_bdev) SPDK_DEBUGLOG(bdev_raid, "raid_bdev_cleanup, %p name %s, state %s\n", raid_bdev, raid_bdev->bdev.name, raid_bdev_state_to_str(raid_bdev->state)); assert(raid_bdev->state != RAID_BDEV_STATE_ONLINE); + assert(spdk_get_thread() == spdk_thread_get_app_thread()); RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { assert(base_info->bdev == NULL); @@ -195,22 +195,6 @@ raid_bdev_cleanup_and_free(struct raid_bdev *raid_bdev) raid_bdev_free(raid_bdev); } -/* - * brief: - * wrapper for the bdev close operation - * params: - * base_info - raid base bdev info - * returns: - */ -static void -_raid_bdev_free_base_bdev_resource(void *ctx) -{ - struct spdk_bdev_desc *desc = ctx; - - spdk_bdev_close(desc); -} - - /* * brief: * free resource of base bdev for raid bdev @@ -225,6 +209,8 @@ static void raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev, struct raid_base_bdev_info *base_info) { + assert(spdk_get_thread() == spdk_thread_get_app_thread()); + free(base_info->name); base_info->name = NULL; @@ -234,11 +220,7 @@ raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev, assert(base_info->desc); spdk_bdev_module_release_bdev(base_info->bdev); - if (base_info->thread && base_info->thread != spdk_get_thread()) { - spdk_thread_send_msg(base_info->thread, _raid_bdev_free_base_bdev_resource, base_info->desc); - } else { - spdk_bdev_close(base_info->desc); - } + spdk_bdev_close(base_info->desc); base_info->desc = NULL; base_info->bdev = NULL; @@ -270,16 +252,8 @@ raid_bdev_module_stop_done(struct raid_bdev *raid_bdev) } } -/* - * brief: - * raid_bdev_destruct is the destruct function table pointer for raid bdev - * params: - * ctxt - pointer to raid_bdev - * returns: - * 1 - success (deferred completion) - */ -static int -raid_bdev_destruct(void *ctxt) +static void +_raid_bdev_destruct(void *ctxt) { struct raid_bdev *raid_bdev = ctxt; struct raid_base_bdev_info *base_info; @@ -302,11 +276,17 @@ raid_bdev_destruct(void *ctxt) if (raid_bdev->module->stop != NULL) { if (raid_bdev->module->stop(raid_bdev) == false) { - return 1; + return; } } raid_bdev_module_stop_done(raid_bdev); +} + +static int +raid_bdev_destruct(void *ctx) +{ + spdk_thread_exec_msg(spdk_thread_get_app_thread(), _raid_bdev_destruct, ctx); return 1; } @@ -610,6 +590,7 @@ raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ct struct raid_base_bdev_info *base_info; assert(raid_bdev != NULL); + assert(spdk_get_thread() == spdk_thread_get_app_thread()); spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb); spdk_json_write_named_string(w, "state", raid_bdev_state_to_str(raid_bdev->state)); @@ -668,6 +649,8 @@ raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx * struct raid_bdev *raid_bdev = bdev->ctxt; struct raid_base_bdev_info *base_info; + assert(spdk_get_thread() == spdk_thread_get_app_thread()); + spdk_json_write_object_begin(w); spdk_json_write_named_string(w, "method", "bdev_raid_create"); @@ -1171,6 +1154,8 @@ raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev) return; } + assert(spdk_get_thread() == spdk_thread_get_app_thread()); + assert(base_info->desc); base_info->remove_scheduled = true; @@ -1271,6 +1256,7 @@ raid_bdev_configure_base_bdev(struct raid_bdev *raid_bdev, struct raid_base_bdev struct spdk_bdev *bdev; int rc; + assert(spdk_get_thread() == spdk_thread_get_app_thread()); assert(base_info->name != NULL); assert(base_info->bdev == NULL); @@ -1295,7 +1281,6 @@ raid_bdev_configure_base_bdev(struct raid_bdev *raid_bdev, struct raid_base_bdev assert(raid_bdev->state != RAID_BDEV_STATE_ONLINE); - base_info->thread = spdk_get_thread(); base_info->bdev = bdev; base_info->desc = desc; raid_bdev->num_base_bdevs_discovered++; diff --git a/module/bdev/raid/bdev_raid.h b/module/bdev/raid/bdev_raid.h index e765f7205..879601dcf 100644 --- a/module/bdev/raid/bdev_raid.h +++ b/module/bdev/raid/bdev_raid.h @@ -60,9 +60,6 @@ struct raid_base_bdev_info { * descriptor will be closed */ bool remove_scheduled; - - /* thread where base device is opened */ - struct spdk_thread *thread; }; /*