[PATCH i-g-t v4 8/8] lib/kunit: Perform test suite filtering on the kernel side
Kamil Konieczny
kamil.konieczny at linux.intel.com
Tue Feb 6 17:21:06 UTC 2024
Hi Janusz,
On 2024-02-06 at 11:00:32 +0100, Janusz Krzysztofik wrote:
> When getting a list of test cases provided by a KUnit test module, we now
> set KUnit filters in a way that results in all test cases from all test
> suites of that module being reported as skipped, then we delete test cases
> that don't belong to a requested test suite from the list. Moreover,
> before executing test cases from that list, we modify KUnit filters in a
> way that all test cases from all test suites of the test module are
> executed, but we report only those from the requested test suite. Since
> KUnit base module has a capability of filtering test cases by test suite
> name, which we don't use, our approach to filtering is not optimal.
>
> Limit kernel side processing to test cases that belong to the requested
> test suite by setting KUnit filter_glob parameter to that test suite name,
> and drop user side test suite filtering. With user side post-processing
> of test case lists limited to SKIP verification, defer cleanup of memory
> occupied by the list entries to a first igt_fixture section that follows.
>
> Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
> ---
> lib/igt_kmod.c | 34 +++++++++-------------------------
> 1 file changed, 9 insertions(+), 25 deletions(-)
>
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index 506093c954..9b92696f1f 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -1157,7 +1157,6 @@ static bool kunit_get_tests(struct igt_list_head *tests,
> const char *suite,
> const char *opts)
> {
> - char *suite_name = NULL, *case_name = NULL;
> struct igt_ktap_result *r, *rn;
> struct igt_ktap_results *ktap;
> unsigned long taints;
> @@ -1179,7 +1178,7 @@ static bool kunit_get_tests(struct igt_list_head *tests,
> * perfectly -- seems to be more safe than extracting a test case list
> * of unknown length from /dev/kmsg.
> */
> - if (igt_debug_on(!kunit_set_filtering(NULL, "module=none", "skip")))
> + if (igt_debug_on(!kunit_set_filtering(suite, "module=none", "skip")))
> return false;
>
> igt_skip_on(modprobe(tst->kmod, opts));
> @@ -1194,30 +1193,13 @@ static bool kunit_get_tests(struct igt_list_head *tests,
>
> igt_ktap_free(ktap);
>
> - if (!err)
> - igt_list_for_each_entry_safe(r, rn, tests, link) {
> - if (igt_debug_on(r->code != IGT_EXIT_SKIP)) {
> - err = r->code ?: -EPROTO;
> - break;
> - }
> -
> - if (!suite)
> - continue;
> -
> - if (strcmp(r->suite_name, suite))
> - kunit_result_free(&r, &case_name, &suite_name);
> - }
> -
> - if (err) {
> - kunit_results_free(tests, &case_name, &suite_name);
> - } else {
> - free(suite_name);
> - free(case_name);
> - }
> -
> igt_skip_on_f(err,
> "KTAP parser failed while getting a list of test cases\n");
>
> + igt_list_for_each_entry_safe(r, rn, tests, link)
> + igt_require_f(r->code == IGT_EXIT_SKIP,
> + "Unexpected non-SKIP result while listing test cases\n");
> +
> igt_skip_on(kmod_module_remove_module(tst->kmod, KMOD_REMOVE_FORCE));
>
> return true;
> @@ -1225,6 +1207,7 @@ static bool kunit_get_tests(struct igt_list_head *tests,
>
> static void __igt_kunit(struct igt_ktest *tst,
> const char *subtest,
> + const char *suite,
> const char *opts,
> struct igt_list_head *tests)
> {
> @@ -1249,7 +1232,8 @@ static void __igt_kunit(struct igt_ktest *tst,
> t->case_name) {
>
> if (!modprobe.thread) {
> - igt_require(kunit_set_filtering(NULL, NULL, NULL));
> + igt_require(kunit_set_filtering(suite,
> + NULL, NULL));
Can you keep it in one line? With or without it,
Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>
> igt_assert_eq(pthread_mutexattr_init(&attr), 0);
> igt_assert_eq(pthread_mutexattr_setrobust(&attr,
> @@ -1443,7 +1427,7 @@ void igt_kunit(const char *module_name, const char *suite, const char *opts)
> if (!kunit_get_tests(&tests, &tst, suite, opts))
> __igt_kunit_legacy(&tst, subtest, opts);
> else
> - __igt_kunit(&tst, subtest, opts, &tests);
> + __igt_kunit(&tst, subtest, suite, opts, &tests);
> }
>
> igt_fixture {
> --
> 2.43.0
>
More information about the igt-dev
mailing list