[PATCH i-g-t] lib/igt_kmod: Rewrite xe unload logic
Cavitt, Jonathan
jonathan.cavitt at intel.com
Fri Sep 13 22:47:47 UTC 2024
-----Original Message-----
From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Lucas De Marchi
Sent: Friday, September 13, 2024 3:14 PM
To: igt-dev at lists.freedesktop.org
Cc: Vivi, Rodrigo <rodrigo.vivi at intel.com>; Bommu, Krishnaiah <krishnaiah.bommu at intel.com>; Ceraolo Spurio, Daniele <daniele.ceraolospurio at intel.com>; De Marchi, Lucas <lucas.demarchi at intel.com>
Subject: [PATCH i-g-t] lib/igt_kmod: Rewrite xe unload logic
>
> Stop trying to unload possibly-dependent modules. Loading a module and
> probing a module are 2 different things, although the Linux kernel will
> by default probe devices when a module is loaded (for pci, configurable
> in /sys/bus/pci/drivers_autoprobe).
>
> For the unloading part we can simplify: instead of trying to unload
> the modules directly (which may complain that module is already in use)
> we just unplug the HW first. For each possible device bound.
>
> This will be come part of libkmod in future, but we don't need to wait:
s/be come/become
> we can implement it in igt too as it's straightforward.
>
> For now this only switches the unload path for xe, but if it works well,
> we can switch others in future too.
>
> Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/2362
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
Some minor nits below, but otherwise:
Reviewed-by: Jonathan Cavitt <jonathan.cavitt at intel.com>
> ---
>
> This works for me for the test above that was failing, but not thouroughly
> tested with the rest of the tests that may trigger module load/unload.
> Tested on BMG and DG2. YMMV :)
>
> lib/igt_kmod.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> lib/igt_kmod.h | 5 +----
> 2 files changed, 48 insertions(+), 4 deletions(-)
>
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index 464c0dcf4..1868fdbf7 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -697,6 +697,53 @@ igt_intel_driver_unload(const char *driver)
> return 0;
> }
>
> +static int unbind_xe(void)
Nit: It might be better to rename this function to something like xe_unbind
or xe_unbind_helper instead.
> +{
> + struct dirent *de;
> + DIR *dir;
> +
> + dir = opendir("/sys/module/xe/drivers/pci:xe/");
> +
> + /* Module may be loaded, but without any device bound */
> + if (!dir)
> + return 0;
> +
> + while ((de = readdir(dir))) {
> + int devfd;
> + bool ret;
> +
> + if (de->d_type != DT_LNK || !isdigit(de->d_name[0]))
> + continue;
> +
> + devfd = openat(dirfd(dir), de->d_name, O_RDONLY | O_CLOEXEC);
> + igt_assert(devfd >= 0);
> +
> + ret = igt_sysfs_set(devfd, "power/control", "auto");
> + igt_assert(ret);
> +
> + ret = igt_sysfs_set(devfd, "driver/unbind", de->d_name);
> + igt_assert(ret);
> +
> + close(devfd);
> + errno = 0;
> + }
> +
> + igt_assert_eq(errno, 0);
> +
> + return 0;
> +}
> +
> +int igt_xe_driver_unload(void)
> +{
> + unbind_xe();
> +
> + igt_kmod_unload("xe");
> + if (igt_kmod_is_loaded("xe"))
> + return IGT_EXIT_FAILURE;
Nit: This is a pretty significant departure from the current implementation
that uses igt_intel_driver_unload. Specifically, it seems to carry a lot less
"baggage", which I think is a good thing. But we should also be careful
nothing important went missing from the old implementation, just in case.
-Jonathan Cavitt
> +
> + return IGT_EXIT_SUCCESS;
> +}
> +
> /**
> * igt_amdgpu_driver_load:
> * @opts: options to pass to amdgpu driver
> diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
> index efb46da12..ee1719a8f 100644
> --- a/lib/igt_kmod.h
> +++ b/lib/igt_kmod.h
> @@ -63,10 +63,7 @@ static inline int igt_xe_driver_load(const char *opts)
> }
>
>
> -static inline int igt_xe_driver_unload(void)
> -{
> - return igt_intel_driver_unload("xe");
> -}
> +int igt_xe_driver_unload(void);
>
> int igt_amdgpu_driver_load(const char *opts);
> int igt_amdgpu_driver_unload(void);
> --
> 2.43.0
>
>
More information about the igt-dev
mailing list