Merge tag 'sound-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[linux-2.6-microblaze.git] / lib / kunit / test.c
index a5053a0..b73d5bb 100644 (file)
@@ -10,7 +10,9 @@
 #include <kunit/test.h>
 #include <kunit/test-bug.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/moduleparam.h>
+#include <linux/panic.h>
 #include <linux/sched/debug.h>
 #include <linux/sched.h>
 
@@ -501,6 +503,9 @@ int kunit_run_tests(struct kunit_suite *suite)
        struct kunit_result_stats suite_stats = { 0 };
        struct kunit_result_stats total_stats = { 0 };
 
+       /* Taint the kernel so we know we've run tests. */
+       add_taint(TAINT_TEST, LOCKDEP_STILL_OK);
+
        if (suite->suite_init) {
                suite->suite_init_err = suite->suite_init(suite);
                if (suite->suite_init_err) {
@@ -581,11 +586,11 @@ static void kunit_init_suite(struct kunit_suite *suite)
        suite->suite_init_err = 0;
 }
 
-int __kunit_test_suites_init(struct kunit_suite * const * const suites)
+int __kunit_test_suites_init(struct kunit_suite * const * const suites, int num_suites)
 {
        unsigned int i;
 
-       for (i = 0; suites[i] != NULL; i++) {
+       for (i = 0; i < num_suites; i++) {
                kunit_init_suite(suites[i]);
                kunit_run_tests(suites[i]);
        }
@@ -598,17 +603,54 @@ static void kunit_exit_suite(struct kunit_suite *suite)
        kunit_debugfs_destroy_suite(suite);
 }
 
-void __kunit_test_suites_exit(struct kunit_suite **suites)
+void __kunit_test_suites_exit(struct kunit_suite **suites, int num_suites)
 {
        unsigned int i;
 
-       for (i = 0; suites[i] != NULL; i++)
+       for (i = 0; i < num_suites; i++)
                kunit_exit_suite(suites[i]);
 
        kunit_suite_counter = 1;
 }
 EXPORT_SYMBOL_GPL(__kunit_test_suites_exit);
 
+#ifdef CONFIG_MODULES
+static void kunit_module_init(struct module *mod)
+{
+       __kunit_test_suites_init(mod->kunit_suites, mod->num_kunit_suites);
+}
+
+static void kunit_module_exit(struct module *mod)
+{
+       __kunit_test_suites_exit(mod->kunit_suites, mod->num_kunit_suites);
+}
+
+static int kunit_module_notify(struct notifier_block *nb, unsigned long val,
+                              void *data)
+{
+       struct module *mod = data;
+
+       switch (val) {
+       case MODULE_STATE_LIVE:
+               kunit_module_init(mod);
+               break;
+       case MODULE_STATE_GOING:
+               kunit_module_exit(mod);
+               break;
+       case MODULE_STATE_COMING:
+       case MODULE_STATE_UNFORMED:
+               break;
+       }
+
+       return 0;
+}
+
+static struct notifier_block kunit_mod_nb = {
+       .notifier_call = kunit_module_notify,
+       .priority = 0,
+};
+#endif
+
 struct kunit_kmalloc_array_params {
        size_t n;
        size_t size;
@@ -703,13 +745,19 @@ EXPORT_SYMBOL_GPL(kunit_cleanup);
 static int __init kunit_init(void)
 {
        kunit_debugfs_init();
-
+#ifdef CONFIG_MODULES
+       return register_module_notifier(&kunit_mod_nb);
+#else
        return 0;
+#endif
 }
 late_initcall(kunit_init);
 
 static void __exit kunit_exit(void)
 {
+#ifdef CONFIG_MODULES
+       unregister_module_notifier(&kunit_mod_nb);
+#endif
        kunit_debugfs_cleanup();
 }
 module_exit(kunit_exit);