diff options
Diffstat (limited to 'lib/kunit/executor.c')
| -rw-r--r-- | lib/kunit/executor.c | 53 | 
1 files changed, 39 insertions, 14 deletions
diff --git a/lib/kunit/executor.c b/lib/kunit/executor.c index 15832ed44668..acd1de436f59 100644 --- a/lib/kunit/executor.c +++ b/lib/kunit/executor.c @@ -1,5 +1,6 @@  // SPDX-License-Identifier: GPL-2.0 +#include <linux/reboot.h>  #include <kunit/test.h>  #include <linux/glob.h>  #include <linux/moduleparam.h> @@ -13,13 +14,17 @@ extern struct kunit_suite * const * const __kunit_suites_end[];  #if IS_BUILTIN(CONFIG_KUNIT) -static char *filter_glob; -module_param(filter_glob, charp, 0); +static char *filter_glob_param; +module_param_named(filter_glob, filter_glob_param, charp, 0);  MODULE_PARM_DESC(filter_glob,  		"Filter which KUnit test suites run at boot-time, e.g. list*"); +static char *kunit_shutdown; +core_param(kunit_shutdown, kunit_shutdown, charp, 0644); +  static struct kunit_suite * const * -kunit_filter_subsuite(struct kunit_suite * const * const subsuite) +kunit_filter_subsuite(struct kunit_suite * const * const subsuite, +			const char *filter_glob)  {  	int i, n = 0;  	struct kunit_suite **filtered; @@ -52,19 +57,14 @@ struct suite_set {  	struct kunit_suite * const * const *end;  }; -static struct suite_set kunit_filter_suites(void) +static struct suite_set kunit_filter_suites(const struct suite_set *suite_set, +					    const char *filter_glob)  {  	int i;  	struct kunit_suite * const **copy, * const *filtered_subsuite;  	struct suite_set filtered; -	const size_t max = __kunit_suites_end - __kunit_suites_start; - -	if (!filter_glob) { -		filtered.start = __kunit_suites_start; -		filtered.end = __kunit_suites_end; -		return filtered; -	} +	const size_t max = suite_set->end - suite_set->start;  	copy = kmalloc_array(max, sizeof(*filtered.start), GFP_KERNEL);  	filtered.start = copy; @@ -74,7 +74,7 @@ static struct suite_set kunit_filter_suites(void)  	}  	for (i = 0; i < max; ++i) { -		filtered_subsuite = kunit_filter_subsuite(__kunit_suites_start[i]); +		filtered_subsuite = kunit_filter_subsuite(suite_set->start[i], filter_glob);  		if (filtered_subsuite)  			*copy++ = filtered_subsuite;  	} @@ -82,6 +82,20 @@ static struct suite_set kunit_filter_suites(void)  	return filtered;  } +static void kunit_handle_shutdown(void) +{ +	if (!kunit_shutdown) +		return; + +	if (!strcmp(kunit_shutdown, "poweroff")) +		kernel_power_off(); +	else if (!strcmp(kunit_shutdown, "halt")) +		kernel_halt(); +	else if (!strcmp(kunit_shutdown, "reboot")) +		kernel_restart(NULL); + +} +  static void kunit_print_tap_header(struct suite_set *suite_set)  {  	struct kunit_suite * const * const *suites, * const *subsuite; @@ -98,21 +112,32 @@ static void kunit_print_tap_header(struct suite_set *suite_set)  int kunit_run_all_tests(void)  {  	struct kunit_suite * const * const *suites; +	struct suite_set suite_set = { +		.start = __kunit_suites_start, +		.end = __kunit_suites_end, +	}; -	struct suite_set suite_set = kunit_filter_suites(); +	if (filter_glob_param) +		suite_set = kunit_filter_suites(&suite_set, filter_glob_param);  	kunit_print_tap_header(&suite_set);  	for (suites = suite_set.start; suites < suite_set.end; suites++)  		__kunit_test_suites_init(*suites); -	if (filter_glob) { /* a copy was made of each array */ +	if (filter_glob_param) { /* a copy was made of each array */  		for (suites = suite_set.start; suites < suite_set.end; suites++)  			kfree(*suites);  		kfree(suite_set.start);  	} +	kunit_handle_shutdown(); +  	return 0;  } +#if IS_BUILTIN(CONFIG_KUNIT_TEST) +#include "executor_test.c" +#endif +  #endif /* IS_BUILTIN(CONFIG_KUNIT) */  | 
