Commit bead1d5a authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

lib/accel: Fix modules initialization



If some module returned an error on init, we
still try to use it. That leads to undefined
behaviour. Instead, fail accel subsystem
initialization.
Remove failed modules from the list so that
their fini() function won't be called during
accel subsystem deinitialization.

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Change-Id: I27331c45e57e1a4496be63c6b6532d667be541fb
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17735


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
parent 0f53a91e
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -2396,16 +2396,26 @@ spdk_accel_get_io_channel(void)
	return spdk_get_io_channel(&spdk_accel_module_list);
}

static void
static int
accel_module_initialize(void)
{
	struct spdk_accel_module_if *accel_module;
	struct spdk_accel_module_if *accel_module, *tmp_module;
	int rc = 0, module_rc;

	TAILQ_FOREACH(accel_module, &spdk_accel_module_list, tailq) {
		accel_module->module_init();
	TAILQ_FOREACH_SAFE(accel_module, &spdk_accel_module_list, tailq, tmp_module) {
		module_rc = accel_module->module_init();
		if (module_rc) {
			SPDK_ERRLOG("Module %s initialization failed with %d\n", accel_module->name, module_rc);
			TAILQ_REMOVE(&spdk_accel_module_list, accel_module, tailq);
			if (!rc) {
				rc = module_rc;
			}
		}
	}

	return rc;
}

static void
accel_module_init_opcode(enum accel_opcode opcode)
{
@@ -2442,7 +2452,10 @@ spdk_accel_initialize(void)
	}

	g_modules_started = true;
	accel_module_initialize();
	rc = accel_module_initialize();
	if (rc) {
		return rc;
	}

	/* Create our priority global map of opcodes to modules, we populate starting
	 * with the software module (guaranteed to be first on the list) and then