From 616e4cb70eccf13e0b3d569be7925abcd6059599 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 25 Apr 2023 15:08:14 +0200 Subject: [PATCH] accel: delay finish until all IO channels are released This ensures that there are no more outstanding operations, so we can safely free any global resources. Fixes #2987 Signed-off-by: Konrad Sztyber Change-Id: Iac423b4f2a1183278d1db20f96c1a3b1bb657f85 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17767 Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Reviewed-by: Mike Gerdts Tested-by: SPDK CI Jenkins --- lib/accel/accel.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/accel/accel.c b/lib/accel/accel.c index c19583bff..28c3b274b 100644 --- a/lib/accel/accel.c +++ b/lib/accel/accel.c @@ -2471,17 +2471,12 @@ spdk_accel_module_finish(void) } } -void -spdk_accel_finish(spdk_accel_fini_cb cb_fn, void *cb_arg) +static void +accel_io_device_unregister_cb(void *io_device) { struct spdk_accel_crypto_key *key, *key_tmp; enum accel_opcode op; - assert(cb_fn != NULL); - - g_fini_cb_fn = cb_fn; - g_fini_cb_arg = cb_arg; - spdk_spin_lock(&g_keyring_spin); TAILQ_FOREACH_SAFE(key, &g_keyring, link, key_tmp) { accel_crypto_key_destroy_unsafe(key); @@ -2496,10 +2491,20 @@ spdk_accel_finish(spdk_accel_fini_cb cb_fn, void *cb_arg) g_modules_opc[op].module = NULL; } - spdk_io_device_unregister(&spdk_accel_module_list, NULL); spdk_accel_module_finish(); } +void +spdk_accel_finish(spdk_accel_fini_cb cb_fn, void *cb_arg) +{ + assert(cb_fn != NULL); + + g_fini_cb_fn = cb_fn; + g_fini_cb_arg = cb_arg; + + spdk_io_device_unregister(&spdk_accel_module_list, accel_io_device_unregister_cb); +} + static struct spdk_accel_driver * accel_find_driver(const char *name) {