Merge branch 'for-6.3/hid-sensor' into for-linus
[linux-block.git] / lib / kunit / test.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Base unit test (KUnit) API.
4  *
5  * Copyright (C) 2019, Google LLC.
6  * Author: Brendan Higgins <brendanhiggins@google.com>
7  */
8
9 #include <kunit/resource.h>
10 #include <kunit/test.h>
11 #include <kunit/test-bug.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/moduleparam.h>
15 #include <linux/panic.h>
16 #include <linux/sched/debug.h>
17 #include <linux/sched.h>
18
19 #include "debugfs.h"
20 #include "string-stream.h"
21 #include "try-catch-impl.h"
22
23 DEFINE_STATIC_KEY_FALSE(kunit_running);
24 EXPORT_SYMBOL_GPL(kunit_running);
25
26 #if IS_BUILTIN(CONFIG_KUNIT)
27 /*
28  * Fail the current test and print an error message to the log.
29  */
30 void __kunit_fail_current_test(const char *file, int line, const char *fmt, ...)
31 {
32         va_list args;
33         int len;
34         char *buffer;
35
36         if (!current->kunit_test)
37                 return;
38
39         kunit_set_failure(current->kunit_test);
40
41         /* kunit_err() only accepts literals, so evaluate the args first. */
42         va_start(args, fmt);
43         len = vsnprintf(NULL, 0, fmt, args) + 1;
44         va_end(args);
45
46         buffer = kunit_kmalloc(current->kunit_test, len, GFP_KERNEL);
47         if (!buffer)
48                 return;
49
50         va_start(args, fmt);
51         vsnprintf(buffer, len, fmt, args);
52         va_end(args);
53
54         kunit_err(current->kunit_test, "%s:%d: %s", file, line, buffer);
55         kunit_kfree(current->kunit_test, buffer);
56 }
57 EXPORT_SYMBOL_GPL(__kunit_fail_current_test);
58 #endif
59
60 /*
61  * Enable KUnit tests to run.
62  */
63 #ifdef CONFIG_KUNIT_DEFAULT_ENABLED
64 static bool enable_param = true;
65 #else
66 static bool enable_param;
67 #endif
68 module_param_named(enable, enable_param, bool, 0);
69 MODULE_PARM_DESC(enable, "Enable KUnit tests");
70
71 /*
72  * KUnit statistic mode:
73  * 0 - disabled
74  * 1 - only when there is more than one subtest
75  * 2 - enabled
76  */
77 static int kunit_stats_enabled = 1;
78 module_param_named(stats_enabled, kunit_stats_enabled, int, 0644);
79 MODULE_PARM_DESC(stats_enabled,
80                   "Print test stats: never (0), only for multiple subtests (1), or always (2)");
81
82 struct kunit_result_stats {
83         unsigned long passed;
84         unsigned long skipped;
85         unsigned long failed;
86         unsigned long total;
87 };
88
89 static bool kunit_should_print_stats(struct kunit_result_stats stats)
90 {
91         if (kunit_stats_enabled == 0)
92                 return false;
93
94         if (kunit_stats_enabled == 2)
95                 return true;
96
97         return (stats.total > 1);
98 }
99
100 static void kunit_print_test_stats(struct kunit *test,
101                                    struct kunit_result_stats stats)
102 {
103         if (!kunit_should_print_stats(stats))
104                 return;
105
106         kunit_log(KERN_INFO, test,
107                   KUNIT_SUBTEST_INDENT
108                   "# %s: pass:%lu fail:%lu skip:%lu total:%lu",
109                   test->name,
110                   stats.passed,
111                   stats.failed,
112                   stats.skipped,
113                   stats.total);
114 }
115
116 /*
117  * Append formatted message to log, size of which is limited to
118  * KUNIT_LOG_SIZE bytes (including null terminating byte).
119  */
120 void kunit_log_append(char *log, const char *fmt, ...)
121 {
122         char line[KUNIT_LOG_SIZE];
123         va_list args;
124         int len_left;
125
126         if (!log)
127                 return;
128
129         len_left = KUNIT_LOG_SIZE - strlen(log) - 1;
130         if (len_left <= 0)
131                 return;
132
133         va_start(args, fmt);
134         vsnprintf(line, sizeof(line), fmt, args);
135         va_end(args);
136
137         strncat(log, line, len_left);
138 }
139 EXPORT_SYMBOL_GPL(kunit_log_append);
140
141 size_t kunit_suite_num_test_cases(struct kunit_suite *suite)
142 {
143         struct kunit_case *test_case;
144         size_t len = 0;
145
146         kunit_suite_for_each_test_case(suite, test_case)
147                 len++;
148
149         return len;
150 }
151 EXPORT_SYMBOL_GPL(kunit_suite_num_test_cases);
152
153 static void kunit_print_suite_start(struct kunit_suite *suite)
154 {
155         kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "KTAP version 1\n");
156         kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "# Subtest: %s",
157                   suite->name);
158         kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "1..%zd",
159                   kunit_suite_num_test_cases(suite));
160 }
161
162 static void kunit_print_ok_not_ok(void *test_or_suite,
163                                   bool is_test,
164                                   enum kunit_status status,
165                                   size_t test_number,
166                                   const char *description,
167                                   const char *directive)
168 {
169         struct kunit_suite *suite = is_test ? NULL : test_or_suite;
170         struct kunit *test = is_test ? test_or_suite : NULL;
171         const char *directive_header = (status == KUNIT_SKIPPED) ? " # SKIP " : "";
172
173         /*
174          * We do not log the test suite results as doing so would
175          * mean debugfs display would consist of the test suite
176          * description and status prior to individual test results.
177          * Hence directly printk the suite status, and we will
178          * separately seq_printf() the suite status for the debugfs
179          * representation.
180          */
181         if (suite)
182                 pr_info("%s %zd %s%s%s\n",
183                         kunit_status_to_ok_not_ok(status),
184                         test_number, description, directive_header,
185                         (status == KUNIT_SKIPPED) ? directive : "");
186         else
187                 kunit_log(KERN_INFO, test,
188                           KUNIT_SUBTEST_INDENT "%s %zd %s%s%s",
189                           kunit_status_to_ok_not_ok(status),
190                           test_number, description, directive_header,
191                           (status == KUNIT_SKIPPED) ? directive : "");
192 }
193
194 enum kunit_status kunit_suite_has_succeeded(struct kunit_suite *suite)
195 {
196         const struct kunit_case *test_case;
197         enum kunit_status status = KUNIT_SKIPPED;
198
199         if (suite->suite_init_err)
200                 return KUNIT_FAILURE;
201
202         kunit_suite_for_each_test_case(suite, test_case) {
203                 if (test_case->status == KUNIT_FAILURE)
204                         return KUNIT_FAILURE;
205                 else if (test_case->status == KUNIT_SUCCESS)
206                         status = KUNIT_SUCCESS;
207         }
208
209         return status;
210 }
211 EXPORT_SYMBOL_GPL(kunit_suite_has_succeeded);
212
213 static size_t kunit_suite_counter = 1;
214
215 static void kunit_print_suite_end(struct kunit_suite *suite)
216 {
217         kunit_print_ok_not_ok((void *)suite, false,
218                               kunit_suite_has_succeeded(suite),
219                               kunit_suite_counter++,
220                               suite->name,
221                               suite->status_comment);
222 }
223
224 unsigned int kunit_test_case_num(struct kunit_suite *suite,
225                                  struct kunit_case *test_case)
226 {
227         struct kunit_case *tc;
228         unsigned int i = 1;
229
230         kunit_suite_for_each_test_case(suite, tc) {
231                 if (tc == test_case)
232                         return i;
233                 i++;
234         }
235
236         return 0;
237 }
238 EXPORT_SYMBOL_GPL(kunit_test_case_num);
239
240 static void kunit_print_string_stream(struct kunit *test,
241                                       struct string_stream *stream)
242 {
243         struct string_stream_fragment *fragment;
244         char *buf;
245
246         if (string_stream_is_empty(stream))
247                 return;
248
249         buf = string_stream_get_string(stream);
250         if (!buf) {
251                 kunit_err(test,
252                           "Could not allocate buffer, dumping stream:\n");
253                 list_for_each_entry(fragment, &stream->fragments, node) {
254                         kunit_err(test, "%s", fragment->fragment);
255                 }
256                 kunit_err(test, "\n");
257         } else {
258                 kunit_err(test, "%s", buf);
259                 kunit_kfree(test, buf);
260         }
261 }
262
263 static void kunit_fail(struct kunit *test, const struct kunit_loc *loc,
264                        enum kunit_assert_type type, const struct kunit_assert *assert,
265                        assert_format_t assert_format, const struct va_format *message)
266 {
267         struct string_stream *stream;
268
269         kunit_set_failure(test);
270
271         stream = alloc_string_stream(test, GFP_KERNEL);
272         if (IS_ERR(stream)) {
273                 WARN(true,
274                      "Could not allocate stream to print failed assertion in %s:%d\n",
275                      loc->file,
276                      loc->line);
277                 return;
278         }
279
280         kunit_assert_prologue(loc, type, stream);
281         assert_format(assert, message, stream);
282
283         kunit_print_string_stream(test, stream);
284
285         string_stream_destroy(stream);
286 }
287
288 static void __noreturn kunit_abort(struct kunit *test)
289 {
290         kunit_try_catch_throw(&test->try_catch); /* Does not return. */
291
292         /*
293          * Throw could not abort from test.
294          *
295          * XXX: we should never reach this line! As kunit_try_catch_throw is
296          * marked __noreturn.
297          */
298         WARN_ONCE(true, "Throw could not abort from test!\n");
299 }
300
301 void kunit_do_failed_assertion(struct kunit *test,
302                                const struct kunit_loc *loc,
303                                enum kunit_assert_type type,
304                                const struct kunit_assert *assert,
305                                assert_format_t assert_format,
306                                const char *fmt, ...)
307 {
308         va_list args;
309         struct va_format message;
310         va_start(args, fmt);
311
312         message.fmt = fmt;
313         message.va = &args;
314
315         kunit_fail(test, loc, type, assert, assert_format, &message);
316
317         va_end(args);
318
319         if (type == KUNIT_ASSERTION)
320                 kunit_abort(test);
321 }
322 EXPORT_SYMBOL_GPL(kunit_do_failed_assertion);
323
324 void kunit_init_test(struct kunit *test, const char *name, char *log)
325 {
326         spin_lock_init(&test->lock);
327         INIT_LIST_HEAD(&test->resources);
328         test->name = name;
329         test->log = log;
330         if (test->log)
331                 test->log[0] = '\0';
332         test->status = KUNIT_SUCCESS;
333         test->status_comment[0] = '\0';
334 }
335 EXPORT_SYMBOL_GPL(kunit_init_test);
336
337 /*
338  * Initializes and runs test case. Does not clean up or do post validations.
339  */
340 static void kunit_run_case_internal(struct kunit *test,
341                                     struct kunit_suite *suite,
342                                     struct kunit_case *test_case)
343 {
344         if (suite->init) {
345                 int ret;
346
347                 ret = suite->init(test);
348                 if (ret) {
349                         kunit_err(test, "failed to initialize: %d\n", ret);
350                         kunit_set_failure(test);
351                         return;
352                 }
353         }
354
355         test_case->run_case(test);
356 }
357
358 static void kunit_case_internal_cleanup(struct kunit *test)
359 {
360         kunit_cleanup(test);
361 }
362
363 /*
364  * Performs post validations and cleanup after a test case was run.
365  * XXX: Should ONLY BE CALLED AFTER kunit_run_case_internal!
366  */
367 static void kunit_run_case_cleanup(struct kunit *test,
368                                    struct kunit_suite *suite)
369 {
370         if (suite->exit)
371                 suite->exit(test);
372
373         kunit_case_internal_cleanup(test);
374 }
375
376 struct kunit_try_catch_context {
377         struct kunit *test;
378         struct kunit_suite *suite;
379         struct kunit_case *test_case;
380 };
381
382 static void kunit_try_run_case(void *data)
383 {
384         struct kunit_try_catch_context *ctx = data;
385         struct kunit *test = ctx->test;
386         struct kunit_suite *suite = ctx->suite;
387         struct kunit_case *test_case = ctx->test_case;
388
389         current->kunit_test = test;
390
391         /*
392          * kunit_run_case_internal may encounter a fatal error; if it does,
393          * abort will be called, this thread will exit, and finally the parent
394          * thread will resume control and handle any necessary clean up.
395          */
396         kunit_run_case_internal(test, suite, test_case);
397         /* This line may never be reached. */
398         kunit_run_case_cleanup(test, suite);
399 }
400
401 static void kunit_catch_run_case(void *data)
402 {
403         struct kunit_try_catch_context *ctx = data;
404         struct kunit *test = ctx->test;
405         struct kunit_suite *suite = ctx->suite;
406         int try_exit_code = kunit_try_catch_get_result(&test->try_catch);
407
408         if (try_exit_code) {
409                 kunit_set_failure(test);
410                 /*
411                  * Test case could not finish, we have no idea what state it is
412                  * in, so don't do clean up.
413                  */
414                 if (try_exit_code == -ETIMEDOUT) {
415                         kunit_err(test, "test case timed out\n");
416                 /*
417                  * Unknown internal error occurred preventing test case from
418                  * running, so there is nothing to clean up.
419                  */
420                 } else {
421                         kunit_err(test, "internal error occurred preventing test case from running: %d\n",
422                                   try_exit_code);
423                 }
424                 return;
425         }
426
427         /*
428          * Test case was run, but aborted. It is the test case's business as to
429          * whether it failed or not, we just need to clean up.
430          */
431         kunit_run_case_cleanup(test, suite);
432 }
433
434 /*
435  * Performs all logic to run a test case. It also catches most errors that
436  * occur in a test case and reports them as failures.
437  */
438 static void kunit_run_case_catch_errors(struct kunit_suite *suite,
439                                         struct kunit_case *test_case,
440                                         struct kunit *test)
441 {
442         struct kunit_try_catch_context context;
443         struct kunit_try_catch *try_catch;
444
445         kunit_init_test(test, test_case->name, test_case->log);
446         try_catch = &test->try_catch;
447
448         kunit_try_catch_init(try_catch,
449                              test,
450                              kunit_try_run_case,
451                              kunit_catch_run_case);
452         context.test = test;
453         context.suite = suite;
454         context.test_case = test_case;
455         kunit_try_catch_run(try_catch, &context);
456
457         /* Propagate the parameter result to the test case. */
458         if (test->status == KUNIT_FAILURE)
459                 test_case->status = KUNIT_FAILURE;
460         else if (test_case->status != KUNIT_FAILURE && test->status == KUNIT_SUCCESS)
461                 test_case->status = KUNIT_SUCCESS;
462 }
463
464 static void kunit_print_suite_stats(struct kunit_suite *suite,
465                                     struct kunit_result_stats suite_stats,
466                                     struct kunit_result_stats param_stats)
467 {
468         if (kunit_should_print_stats(suite_stats)) {
469                 kunit_log(KERN_INFO, suite,
470                           "# %s: pass:%lu fail:%lu skip:%lu total:%lu",
471                           suite->name,
472                           suite_stats.passed,
473                           suite_stats.failed,
474                           suite_stats.skipped,
475                           suite_stats.total);
476         }
477
478         if (kunit_should_print_stats(param_stats)) {
479                 kunit_log(KERN_INFO, suite,
480                           "# Totals: pass:%lu fail:%lu skip:%lu total:%lu",
481                           param_stats.passed,
482                           param_stats.failed,
483                           param_stats.skipped,
484                           param_stats.total);
485         }
486 }
487
488 static void kunit_update_stats(struct kunit_result_stats *stats,
489                                enum kunit_status status)
490 {
491         switch (status) {
492         case KUNIT_SUCCESS:
493                 stats->passed++;
494                 break;
495         case KUNIT_SKIPPED:
496                 stats->skipped++;
497                 break;
498         case KUNIT_FAILURE:
499                 stats->failed++;
500                 break;
501         }
502
503         stats->total++;
504 }
505
506 static void kunit_accumulate_stats(struct kunit_result_stats *total,
507                                    struct kunit_result_stats add)
508 {
509         total->passed += add.passed;
510         total->skipped += add.skipped;
511         total->failed += add.failed;
512         total->total += add.total;
513 }
514
515 int kunit_run_tests(struct kunit_suite *suite)
516 {
517         char param_desc[KUNIT_PARAM_DESC_SIZE];
518         struct kunit_case *test_case;
519         struct kunit_result_stats suite_stats = { 0 };
520         struct kunit_result_stats total_stats = { 0 };
521
522         /* Taint the kernel so we know we've run tests. */
523         add_taint(TAINT_TEST, LOCKDEP_STILL_OK);
524
525         if (suite->suite_init) {
526                 suite->suite_init_err = suite->suite_init(suite);
527                 if (suite->suite_init_err) {
528                         kunit_err(suite, KUNIT_SUBTEST_INDENT
529                                   "# failed to initialize (%d)", suite->suite_init_err);
530                         goto suite_end;
531                 }
532         }
533
534         kunit_print_suite_start(suite);
535
536         kunit_suite_for_each_test_case(suite, test_case) {
537                 struct kunit test = { .param_value = NULL, .param_index = 0 };
538                 struct kunit_result_stats param_stats = { 0 };
539                 test_case->status = KUNIT_SKIPPED;
540
541                 if (!test_case->generate_params) {
542                         /* Non-parameterised test. */
543                         kunit_run_case_catch_errors(suite, test_case, &test);
544                         kunit_update_stats(&param_stats, test.status);
545                 } else {
546                         /* Get initial param. */
547                         param_desc[0] = '\0';
548                         test.param_value = test_case->generate_params(NULL, param_desc);
549                         kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT
550                                   "KTAP version 1\n");
551                         kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT
552                                   "# Subtest: %s", test_case->name);
553
554                         while (test.param_value) {
555                                 kunit_run_case_catch_errors(suite, test_case, &test);
556
557                                 if (param_desc[0] == '\0') {
558                                         snprintf(param_desc, sizeof(param_desc),
559                                                  "param-%d", test.param_index);
560                                 }
561
562                                 kunit_log(KERN_INFO, &test,
563                                           KUNIT_SUBTEST_INDENT KUNIT_SUBTEST_INDENT
564                                           "%s %d %s",
565                                           kunit_status_to_ok_not_ok(test.status),
566                                           test.param_index + 1, param_desc);
567
568                                 /* Get next param. */
569                                 param_desc[0] = '\0';
570                                 test.param_value = test_case->generate_params(test.param_value, param_desc);
571                                 test.param_index++;
572
573                                 kunit_update_stats(&param_stats, test.status);
574                         }
575                 }
576
577
578                 kunit_print_test_stats(&test, param_stats);
579
580                 kunit_print_ok_not_ok(&test, true, test_case->status,
581                                       kunit_test_case_num(suite, test_case),
582                                       test_case->name,
583                                       test.status_comment);
584
585                 kunit_update_stats(&suite_stats, test_case->status);
586                 kunit_accumulate_stats(&total_stats, param_stats);
587         }
588
589         if (suite->suite_exit)
590                 suite->suite_exit(suite);
591
592         kunit_print_suite_stats(suite, suite_stats, total_stats);
593 suite_end:
594         kunit_print_suite_end(suite);
595
596         return 0;
597 }
598 EXPORT_SYMBOL_GPL(kunit_run_tests);
599
600 static void kunit_init_suite(struct kunit_suite *suite)
601 {
602         kunit_debugfs_create_suite(suite);
603         suite->status_comment[0] = '\0';
604         suite->suite_init_err = 0;
605 }
606
607 bool kunit_enabled(void)
608 {
609         return enable_param;
610 }
611
612 int __kunit_test_suites_init(struct kunit_suite * const * const suites, int num_suites)
613 {
614         unsigned int i;
615
616         if (!kunit_enabled() && num_suites > 0) {
617                 pr_info("kunit: disabled\n");
618                 return 0;
619         }
620
621         static_branch_inc(&kunit_running);
622
623         for (i = 0; i < num_suites; i++) {
624                 kunit_init_suite(suites[i]);
625                 kunit_run_tests(suites[i]);
626         }
627
628         static_branch_dec(&kunit_running);
629         return 0;
630 }
631 EXPORT_SYMBOL_GPL(__kunit_test_suites_init);
632
633 static void kunit_exit_suite(struct kunit_suite *suite)
634 {
635         kunit_debugfs_destroy_suite(suite);
636 }
637
638 void __kunit_test_suites_exit(struct kunit_suite **suites, int num_suites)
639 {
640         unsigned int i;
641
642         if (!kunit_enabled())
643                 return;
644
645         for (i = 0; i < num_suites; i++)
646                 kunit_exit_suite(suites[i]);
647
648         kunit_suite_counter = 1;
649 }
650 EXPORT_SYMBOL_GPL(__kunit_test_suites_exit);
651
652 #ifdef CONFIG_MODULES
653 static void kunit_module_init(struct module *mod)
654 {
655         __kunit_test_suites_init(mod->kunit_suites, mod->num_kunit_suites);
656 }
657
658 static void kunit_module_exit(struct module *mod)
659 {
660         __kunit_test_suites_exit(mod->kunit_suites, mod->num_kunit_suites);
661 }
662
663 static int kunit_module_notify(struct notifier_block *nb, unsigned long val,
664                                void *data)
665 {
666         struct module *mod = data;
667
668         switch (val) {
669         case MODULE_STATE_LIVE:
670                 kunit_module_init(mod);
671                 break;
672         case MODULE_STATE_GOING:
673                 kunit_module_exit(mod);
674                 break;
675         case MODULE_STATE_COMING:
676         case MODULE_STATE_UNFORMED:
677                 break;
678         }
679
680         return 0;
681 }
682
683 static struct notifier_block kunit_mod_nb = {
684         .notifier_call = kunit_module_notify,
685         .priority = 0,
686 };
687 #endif
688
689 struct kunit_kmalloc_array_params {
690         size_t n;
691         size_t size;
692         gfp_t gfp;
693 };
694
695 static int kunit_kmalloc_array_init(struct kunit_resource *res, void *context)
696 {
697         struct kunit_kmalloc_array_params *params = context;
698
699         res->data = kmalloc_array(params->n, params->size, params->gfp);
700         if (!res->data)
701                 return -ENOMEM;
702
703         return 0;
704 }
705
706 static void kunit_kmalloc_array_free(struct kunit_resource *res)
707 {
708         kfree(res->data);
709 }
710
711 void *kunit_kmalloc_array(struct kunit *test, size_t n, size_t size, gfp_t gfp)
712 {
713         struct kunit_kmalloc_array_params params = {
714                 .size = size,
715                 .n = n,
716                 .gfp = gfp
717         };
718
719         return kunit_alloc_resource(test,
720                                     kunit_kmalloc_array_init,
721                                     kunit_kmalloc_array_free,
722                                     gfp,
723                                     &params);
724 }
725 EXPORT_SYMBOL_GPL(kunit_kmalloc_array);
726
727 static inline bool kunit_kfree_match(struct kunit *test,
728                                      struct kunit_resource *res, void *match_data)
729 {
730         /* Only match resources allocated with kunit_kmalloc() and friends. */
731         return res->free == kunit_kmalloc_array_free && res->data == match_data;
732 }
733
734 void kunit_kfree(struct kunit *test, const void *ptr)
735 {
736         if (!ptr)
737                 return;
738
739         if (kunit_destroy_resource(test, kunit_kfree_match, (void *)ptr))
740                 KUNIT_FAIL(test, "kunit_kfree: %px already freed or not allocated by kunit", ptr);
741 }
742 EXPORT_SYMBOL_GPL(kunit_kfree);
743
744 void kunit_cleanup(struct kunit *test)
745 {
746         struct kunit_resource *res;
747         unsigned long flags;
748
749         /*
750          * test->resources is a stack - each allocation must be freed in the
751          * reverse order from which it was added since one resource may depend
752          * on another for its entire lifetime.
753          * Also, we cannot use the normal list_for_each constructs, even the
754          * safe ones because *arbitrary* nodes may be deleted when
755          * kunit_resource_free is called; the list_for_each_safe variants only
756          * protect against the current node being deleted, not the next.
757          */
758         while (true) {
759                 spin_lock_irqsave(&test->lock, flags);
760                 if (list_empty(&test->resources)) {
761                         spin_unlock_irqrestore(&test->lock, flags);
762                         break;
763                 }
764                 res = list_last_entry(&test->resources,
765                                       struct kunit_resource,
766                                       node);
767                 /*
768                  * Need to unlock here as a resource may remove another
769                  * resource, and this can't happen if the test->lock
770                  * is held.
771                  */
772                 spin_unlock_irqrestore(&test->lock, flags);
773                 kunit_remove_resource(test, res);
774         }
775         current->kunit_test = NULL;
776 }
777 EXPORT_SYMBOL_GPL(kunit_cleanup);
778
779 static int __init kunit_init(void)
780 {
781         kunit_debugfs_init();
782 #ifdef CONFIG_MODULES
783         return register_module_notifier(&kunit_mod_nb);
784 #else
785         return 0;
786 #endif
787 }
788 late_initcall(kunit_init);
789
790 static void __exit kunit_exit(void)
791 {
792 #ifdef CONFIG_MODULES
793         unregister_module_notifier(&kunit_mod_nb);
794 #endif
795         kunit_debugfs_cleanup();
796 }
797 module_exit(kunit_exit);
798
799 MODULE_LICENSE("GPL v2");