[RFC] lib/igt_kmod: remove devcoredump before a PCI module unload
Lucas De Marchi
lucas.demarchi at intel.com
Thu Feb 1 23:14:58 UTC 2024
On Tue, Jan 30, 2024 at 05:37:02PM -0500, Rodrigo Vivi wrote:
>devcoredump holds a module reference, blocking the module removal.
>
>It is intentional from the devcoredump perspective to keep the
>log available even after the unbind/unprobe. However it blocks
>our module removal here.
>
>Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
>Cc: José Roberto de Souza <jose.souza at intel.com>
>Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
>---
> lib/igt_kmod.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
>diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
>index 250ab2107..da44a7bca 100644
>--- a/lib/igt_kmod.c
>+++ b/lib/igt_kmod.c
>@@ -323,6 +323,58 @@ static int igt_kmod_unload_r(struct kmod_module *kmod, unsigned int flags)
> return err;
> }
>
>+#define MAX_PATH 256
just use PATH_MAX? it's more than this and should be sufficient for
these sysfs paths
>+
>+static void _igt_remove_devcoredump(const char *driver)
>+{
>+ char sysfspath[MAX_PATH];
>+ DIR *dir;
>+ char devcoredump[MAX_PATH];
>+ FILE *data;
>+ struct dirent *entry;
>+
>+ snprintf(sysfspath, sizeof(sysfspath),
>+ "/sys/module/%s/drivers/pci:%s/", driver, driver);
"/sys/bus/pci/drivers/%s", driver
I´d also save the return value so you can 1) check if it was truncated,
2) do something like `char *entry = sysfspath + len`,
so you don't have to keep printing the prefix below.
>+
>+ /* Not a PCI module */
>+ if(access(sysfspath, F_OK) == -1)
>+ return;
coding style
>+
>+ dir = opendir(sysfspath);
>+ igt_assert(dir);
>+
>+ while ((entry = readdir(dir)) != NULL) {
>+ if (entry->d_type == DT_LNK && strcmp(entry->d_name, ".") != 0
>+ && strcmp(entry->d_name, "..") != 0) {
invert the comparison and do a "continue;" ? It would drop the indent a
little bit.
>+
>+#pragma GCC diagnostic push
>+#pragma GCC diagnostic ignored "-Wformat-truncation"
>+ snprintf(devcoredump, sizeof(devcoredump),
>+ "%s/%s/devcoredump", sysfspath, entry->d_name);
>+#pragma GCC diagnostic pop
instead of ignoring the truncation, simply check the return? As per
above you could do:
ret = snprintf(entry, sizeof(sysfspath) - prefixlen,
"/%s/devcoredump", entry->d_name);
then check ret < sizeof(sysfspath) - prefixlen
if you follow this, then you should use sysfspath everywhere below
rather than devcoredump.
>+
>+ igt_info("%s\n", devcoredump);
>+
>+ if (access(devcoredump, F_OK) != -1) {
>+ igt_info("Removing devcoredump before module unload: %s\n",
>+ devcoredump);
>+
>+ strcat(devcoredump, "/data");
could we just do that above and check if we have a devcoredump/data?
I'd reword the commit message to say "drop" instead of remove. The
reason I came here to review was that you had
"igt_kmod: remove devcoredump ..." and I thought you were talking about a
**module** called devcoredump.
>+ data = fopen(devcoredump, "w");
>+ igt_assert(data);
>+
>+ /*
>+ * Write anything to devcoredump/data to
>+ * force its deletion
>+ */
>+ fprintf(data, "1\n");
>+ fclose(data);
>+ }
>+ }
>+ }
>+ closedir(dir);
>+}
>+
> /**
> * igt_kmod_unload:
> * @mod_name: Module name.
>@@ -341,6 +393,8 @@ igt_kmod_unload(const char *mod_name, unsigned int flags)
> struct kmod_module *kmod;
> int err;
>
>+ _igt_remove_devcoredump(mod_name);
what's the _ for? Also as I said above please s/remove/drop/
However I wonder if we shouldn't **dump** and make it available as
output, just like we save the dmesg.
Lucas De Marchi
More information about the igt-dev
mailing list