[igt-dev] [PATCH i-g-t 1/2] lib/igt_kmod: Wait for a kmod to finish its probe before unloding it.
Dixit, Ashutosh
ashutosh.dixit at intel.com
Fri Apr 1 02:03:11 UTC 2022
On Wed, 30 Mar 2022 11:32:58 -0700, Daniele Ceraolo Spurio wrote:
>
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index cf7a3b22..d2ac8a56 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;
One idea would be to check for KMOD_MODULE_LIVE here which will basically
invert the logic in the loop but will be a more exact check? But anyway
it's equivalent so no need to change I guess.
> static int modprobe(struct kmod_module *kmod, const char *options)
> {
> unsigned int flags;
> @@ -289,6 +295,16 @@ igt_kmod_unload(const char *mod_name, unsigned int flags)
> goto out;
> }
>
> + if (igt_kmod_is_loading(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);
> + goto out;
> + }
> + }
> +
> err = igt_kmod_unload_r(kmod, flags);
I think it's better to add this code to igt_kmod_unload_r() (instead of
igt_kmod_unload()) since that calls itself recursively to remove dependent
modules?
Also it seems strange that we should explicitly have to wait for module
state to become LIVE and kmod_module_remove_module() (which in turn calls
the delete_module syscall) doesn't handle this itself? But 'man
delete_module' specifically mentions this:
ERRORS
EBUSY The module is not "live" (i.e., it is still being initialized or
is already marked for removal) ...
So a patch like this seems to be needed somewhere (in IGT or in
libkmod). So adding it to IGT for now is fine.
More information about the igt-dev
mailing list