[PATCH i-g-t] lib/igt_kmod: Unload/Reload the mei Modules Before Unloading/Reloading the i915/xe Driver

Lucas De Marchi lucas.demarchi at intel.com
Thu Aug 15 15:20:54 UTC 2024


On Thu, Aug 15, 2024 at 06:34:23PM GMT, Bommu Krishnaiah wrote:
>To ensure stability and proper module management, this update introduces
>changes to the handling of MEI modules when loading or unloading
>the Intel i915 or Xe drivers.
>
>Key Changes:
>- Unload Order: The `mei_gsc_proxy` module is now unloaded before `mei_gsc`,
>preventing potential failures during the unloading process.
>- Platform-Specific Handling: On platforms where the MEI hardware is integrated
>with the graphics device (e.g., DG2/BMG), the MEI modules depend on the i915/Xe driver.
>Conversely, on newer platforms like CLS, where MEI hardware is separate,
>this dependency does not exist. This update ensures that MEI modules are
>unloaded/reloaded in the correct order based on platform-specific dependencies.
>
>These changes address the need for a more robust handling of MEI modules across
>different hardware platforms, ensuring that the i915/Xe driver can be
>cleanly unloaded and reloaded without issues.
>
>Signed-off-by: Bommu Krishnaiah <krishnaiah.bommu at intel.com>
>Cc: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>---
> lib/igt_kmod.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
>diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
>index 464c0dcf4..6ee2b7afe 100644
>--- a/lib/igt_kmod.c
>+++ b/lib/igt_kmod.c
>@@ -480,9 +480,29 @@ igt_intel_driver_load(const char *opts, const char *driver)
> {
> 	int ret;
>
>+	const char *mei[] = {
>+		/* mei_gsc uses an i915 aux dev and the other mei mods depend on it */
>+		"mei_pxp",
>+		"mei_hdcp",
>+		"mei_gsc_proxy",
>+		"mei_gsc",
>+		NULL,

all this manual approach we have for module unloading should be gone
IMO. Replace that with 1) unbind the driver; 2) unload the module.
There's no need afaict to keep tracking what the module uses.

as for loading, why exactly do we have to do the kernels/depmod
manually?  If we have to do anything manually like that, it means
real users won't have that and we are actually missing the proper
integration. I typed something on the different types of
dependencies (harddep, softdep, weakdep):
https://politreco.com/2024/08/linux-module-dependencies/

Lucas De Marchi

>+	};
>+
> 	if (opts)
> 		igt_info("Reloading %s with %s\n\n", driver, opts);
>
>+	for (const char **m = mei; *m; m++) {
>+		if (igt_kmod_is_loaded(*m))
>+			continue;
>+
>+		ret = igt_kmod_load(*m, NULL);
>+		if (ret) {
>+			igt_debug("Could not load %s\n", *m);
>+			return ret;
>+		}
>+	}
>+
> 	ret = igt_kmod_load(driver, opts);
> 	if (ret) {
> 		igt_debug("Could not load %s\n", driver);
>@@ -620,9 +640,14 @@ int __igt_intel_driver_unload(char **who, const char *driver)
> 	const char *aux[] = {
> 		/* gen5: ips uses symbol_get() so only a soft module dependency */
> 		"intel_ips",
>+		NULL,
>+	};
>+
>+	const char *mei[] = {
> 		/* mei_gsc uses an i915 aux dev and the other mei mods depend on it */
> 		"mei_pxp",
> 		"mei_hdcp",
>+		"mei_gsc_proxy",
> 		"mei_gsc",
> 		NULL,
> 	};
>@@ -647,6 +672,19 @@ int __igt_intel_driver_unload(char **who, const char *driver)
> 		}
> 	}
>
>+	for (const char **m = mei; *m; m++) {
>+		if (!igt_kmod_is_loaded(*m))
>+			continue;
>+
>+		ret = igt_kmod_unload(*m);
>+		if (ret) {
>+			if (who)
>+				*who = strdup_realloc(*who, *m);
>+
>+			return ret;
>+		}
>+	}
>+
> 	if (igt_kmod_is_loaded(driver)) {
> 		ret = igt_kmod_unload(driver);
> 		if (ret) {
>-- 
>2.25.1
>


More information about the igt-dev mailing list