summaryrefslogtreecommitdiff
path: root/lib/igt_kmod.c
diff options
context:
space:
mode:
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>2022-04-01 11:22:28 -0700
committerAshutosh Dixit <ashutosh.dixit@intel.com>2022-04-01 16:43:28 -0700
commit63ab87b8d5fb51fd4a5d05815f6ab5c210fd2376 (patch)
tree9dd0e995449cc177811f303318f204a6a7d351ed /lib/igt_kmod.c
parentf3110b3083b4fecfa2153563990720a7b82485c1 (diff)
lib/igt_kmod: Wait for a kmod to finish its probe before unloding it.
Modprobing i915 can result in other dependent modules being loaded automatically as a follow up. This means that by the time the i915 load function returns these modules may still be going through their init, so if we try to immediately unload i915 again we will fail with an -EBUSY. To avoid this, if the module load is still in progress, wait for it to complete before unloading. v2: move the wait to igt_kmod_unload_r (Ashutosh) Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Diffstat (limited to 'lib/igt_kmod.c')
-rw-r--r--lib/igt_kmod.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index cf7a3b22..0e3ca9b3 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -143,6 +143,12 @@ out:
return ret;
}
+static bool
+igt_kmod_is_loading(struct kmod_module *kmod)
+{
+ return kmod_module_get_initstate(kmod) == KMOD_MODULE_COMING;
+}
+
static int modprobe(struct kmod_module *kmod, const char *options)
{
unsigned int flags;
@@ -261,6 +267,17 @@ static int igt_kmod_unload_r(struct kmod_module *kmod, unsigned int flags)
if (err < 0)
return err;
+ if (igt_kmod_is_loading(kmod)) {
+ const char *mod_name = kmod_module_get_name(kmod);
+ igt_debug("%s still initializing\n", mod_name);
+ err = igt_wait(!igt_kmod_is_loading(kmod), 10000, 100);
+ if (err < 0) {
+ igt_debug("%s failed to complete init within the timeout\n",
+ mod_name);
+ return err;
+ }
+ }
+
return kmod_module_remove_module(kmod, flags);
}