]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
Added the test case of using multiple softdep for a module
authorGongjun Song <gongjun.song@intel.com>
Fri, 7 Mar 2025 15:03:18 +0000 (23:03 +0800)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Fri, 28 Mar 2025 15:59:48 +0000 (10:59 -0500)
We defined two modules mod-softdep-a and mod-softdep-b. The softdep
statements are split into two separate modprobe configure files.

The unit test case is supposed to fail, since the libkmod will take
only the first softdep statement based on the current implementation.

Co-developed-by: Dan He <dan.h.he@intel.com>
Signed-off-by: Dan He <dan.h.he@intel.com>
Co-developed-by: Gongjun Song <gongjun.song@intel.com>
Signed-off-by: Gongjun Song <gongjun.song@intel.com>
Signed-off-by: Yuchi Chen <yuchi.chen@intel.com>
Signed-off-by: Wenjie Wang <wenjie2.wang@intel.com>
Signed-off-by: Qingqing Li <qingqing.li@intel.com>
Link: https://github.com/kmod-project/kmod/pull/311
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
18 files changed:
scripts/setup-rootfs.sh
testsuite/meson.build
testsuite/module-playground/Kbuild
testsuite/module-playground/mod-softdep-a.c [new file with mode: 0644]
testsuite/module-playground/mod-softdep-b.c [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep.conf [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep2.conf [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias.bin [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.alias.bin [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.bin [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep.bin [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.devname [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.softdep [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols [new file with mode: 0644]
testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols.bin [new file with mode: 0644]
testsuite/test-multi-softdep.c [new file with mode: 0644]

index cbf94bc94ef3c34acdee28507d0cfde384a5ccdc..4bfbcf330fff1c680abe497c2f5d2b09b0526c55 100755 (executable)
@@ -115,6 +115,11 @@ map=(
     ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-b.ko"]="mod-loop-b.ko"
     ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko"
     ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-weakdep.ko"]="mod-weakdep.ko"
+    ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-a.ko"]="mod-foo-a.ko"
+    ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-b.ko"]="mod-foo-b.ko"
+    ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-c.ko"]="mod-foo-c.ko"
+    ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-a.ko"]="mod-softdep-a.ko"
+    ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-b.ko"]="mod-softdep-b.ko"
 )
 
 gzip_array=(
index a8b9a43827c07eba6e78c4a8d5de5c661e61498d..6bc9186f60e4664b08284f113a9c93a8b65d2081 100644 (file)
@@ -90,6 +90,7 @@ _testsuite = [
   'test-loaded',
   'test-modinfo',
   'test-modprobe',
+  'test-multi-softdep',
   'test-new-module',
   'test-remove',
   'test-strbuf',
index 5be441b1e4999444083ef6db66c2e453ae350b36..b4f0f11e741c5c8f9b03a31dbbb01e252b031b86 100644 (file)
@@ -36,6 +36,9 @@ obj-m += mod-fake-cciss.o
 
 obj-m += mod-weakdep.o
 
+obj-m += mod-softdep-a.o
+obj-m += mod-softdep-b.o
+
 else
 # only build ARCH-specific module
 ifeq ($(ARCH),)
diff --git a/testsuite/module-playground/mod-softdep-a.c b/testsuite/module-playground/mod-softdep-a.c
new file mode 100644 (file)
index 0000000..90cb90a
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+
+#ifndef MODULE_SOFTDEP
+#define MODULE_SOFTDEP(_softdep) MODULE_INFO(softdep, _softdep)
+#endif
+
+static int __init softdep_init(void)
+{
+       return 0;
+}
+module_init(softdep_init);
+
+MODULE_AUTHOR("Dan He <dan.h.he@intel.com>");
+MODULE_LICENSE("LGPL");
+MODULE_SOFTDEP("pre: mod-foo-a mod-foo-b post: mod-foo-c");
diff --git a/testsuite/module-playground/mod-softdep-b.c b/testsuite/module-playground/mod-softdep-b.c
new file mode 100644 (file)
index 0000000..b9fb74d
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+
+#ifndef MODULE_SOFTDEP
+#define MODULE_SOFTDEP(_softdep) MODULE_INFO(softdep, _softdep)
+#endif
+
+static int __init softdep_init(void)
+{
+       return 0;
+}
+module_init(softdep_init);
+
+MODULE_AUTHOR("Dan He <dan.h.he@intel.com>");
+MODULE_LICENSE("LGPL");
+MODULE_SOFTDEP("pre: mod-foo-a post: mod-foo-b mod-foo-c");
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep.conf b/testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep.conf
new file mode 100644 (file)
index 0000000..dc66870
--- /dev/null
@@ -0,0 +1,4 @@
+softdep        mod-softdep-a   pre: mod-foo-a
+softdep        mod-softdep-a   pre: mod-foo-b
+softdep        mod-softdep-a   post: mod-foo-c
+softdep        mod-softdep-b   pre: mod-foo-a
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep2.conf b/testsuite/rootfs-pristine/test-multi-softdep/etc/modprobe.d/dumb-softdep2.conf
new file mode 100644 (file)
index 0000000..a3ea7ea
--- /dev/null
@@ -0,0 +1 @@
+softdep        mod-softdep-b   post: mod-foo-b mod-foo-c
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias
new file mode 100644 (file)
index 0000000..ba76e18
--- /dev/null
@@ -0,0 +1 @@
+# Aliases extracted from modules themselves.
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias.bin
new file mode 100644 (file)
index 0000000..7075435
Binary files /dev/null and b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.alias.bin differ
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.alias.bin b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.alias.bin
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.builtin.bin
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep
new file mode 100644 (file)
index 0000000..4c5ea09
--- /dev/null
@@ -0,0 +1,5 @@
+kernel/mod-foo-b.ko:
+kernel/mod-foo-c.ko:
+kernel/mod-foo-a.ko:
+kernel/mod-softdep-b.ko:
+kernel/mod-softdep-a.ko:
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep.bin
new file mode 100644 (file)
index 0000000..6a1c8f4
Binary files /dev/null and b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.dep.bin differ
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.devname
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.softdep
new file mode 100644 (file)
index 0000000..5554ccc
--- /dev/null
@@ -0,0 +1 @@
+# Soft dependencies extracted from modules themselves.
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols
new file mode 100644 (file)
index 0000000..ddb6ab6
--- /dev/null
@@ -0,0 +1,4 @@
+# Aliases for symbols, used by symbol_request().
+alias symbol:print_fooA mod_foo_a
+alias symbol:print_fooC mod_foo_c
+alias symbol:print_fooB mod_foo_b
diff --git a/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols.bin
new file mode 100644 (file)
index 0000000..1add6e5
Binary files /dev/null and b/testsuite/rootfs-pristine/test-multi-softdep/lib/modules/4.4.4/modules.symbols.bin differ
diff --git a/testsuite/test-multi-softdep.c b/testsuite/test-multi-softdep.c
new file mode 100644 (file)
index 0000000..6ec3b04
--- /dev/null
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <shared/util.h>
+
+#include <libkmod/libkmod.h>
+#include "testsuite.h"
+
+#define MAX_SOFTDEP_N 3
+
+static const struct {
+       const char *modname;
+       const char *pre[MAX_SOFTDEP_N];
+       const char *post[MAX_SOFTDEP_N];
+} test_modules[] = { { .modname = "mod-softdep-a",
+                      .pre = { "mod_foo_a", "mod_foo_b" },
+                      .post = { "mod_foo_c" } },
+                    { .modname = "mod-softdep-b",
+                      .pre = { "mod_foo_a" },
+                      .post = { "mod_foo_b", "mod_foo_c" } } };
+
+static int check_dependencies(const char *const *modnames,
+                             const struct kmod_list *mod_list)
+{
+       const struct kmod_list *itr;
+       bool visited[MAX_SOFTDEP_N] = {};
+       int mod_index;
+       bool all_loaded = true;
+
+       kmod_list_foreach(itr, mod_list) {
+               struct kmod_module *softdep_mod = kmod_module_get_module(itr);
+               const char *softdep_name = kmod_module_get_name(softdep_mod);
+               printf(" %s", softdep_name);
+
+               for (mod_index = 0; mod_index < MAX_SOFTDEP_N; mod_index++) {
+                       if (!modnames[mod_index])
+                               break;
+                       if (streq(softdep_name, modnames[mod_index]))
+                               visited[mod_index] = true;
+               }
+               kmod_module_unref(softdep_mod);
+       }
+       printf("\n");
+
+       for (mod_index = 0; mod_index < MAX_SOFTDEP_N; mod_index++) {
+               if (!modnames[mod_index])
+                       break;
+               if (!visited[mod_index]) {
+                       ERR("softdep %s not loaded\n", modnames[mod_index]);
+                       all_loaded = false;
+               }
+       }
+       if (all_loaded)
+               return 0;
+       else
+               return -1;
+}
+
+static int multi_softdep(const struct test *t)
+{
+       struct kmod_ctx *ctx = NULL;
+       struct kmod_module *mod = NULL;
+       struct kmod_list *pre = NULL, *post = NULL;
+
+       const char *modname;
+       size_t mod_index;
+       int err;
+
+       ctx = kmod_new(NULL, NULL);
+       if (ctx == NULL)
+               exit(EXIT_FAILURE);
+
+       for (mod_index = 0; mod_index < ARRAY_SIZE(test_modules); mod_index++) {
+               modname = test_modules[mod_index].modname;
+               printf("module %s:\n", modname);
+               err = kmod_module_new_from_name(ctx, modname, &mod);
+               if (err < 0)
+                       goto fail;
+               pre = NULL;
+               post = NULL;
+               err = kmod_module_get_softdeps(mod, &pre, &post);
+               if (err < 0) {
+                       ERR("could not get softdeps of '%s': %s\n", modname,
+                           strerror(-err));
+                       goto fail;
+               }
+
+               printf("pre: ");
+               err = check_dependencies(test_modules[mod_index].pre, pre);
+               if (err < 0)
+                       goto fail;
+               printf("post: ");
+               err = check_dependencies(test_modules[mod_index].post, post);
+               if (err < 0)
+                       goto fail;
+
+               kmod_module_unref_list(pre);
+               kmod_module_unref_list(post);
+               kmod_module_unref(mod);
+       }
+       kmod_unref(ctx);
+       return EXIT_SUCCESS;
+
+fail:
+       kmod_module_unref_list(pre);
+       kmod_module_unref_list(post);
+       kmod_module_unref(mod);
+       kmod_unref(ctx);
+       return EXIT_FAILURE;
+}
+
+/*
+ * FIXME: This test indicates a bug in kmod. Once fixed, the expected_fail should be removed.
+ * See https://github.com/kmod-project/kmod/issues/33 for more details.
+ */
+DEFINE_TEST(multi_softdep, .description = "check if multiple softdep is supported",
+           .config = {
+               [TC_UNAME_R] = "4.4.4",
+               [TC_ROOTFS] = TESTSUITE_ROOTFS "test-multi-softdep/",
+           }, .expected_fail=true);
+
+TESTSUITE_MAIN();