[igt-dev] [PATCH i-g-t 10/10] KUnit: replace abort with graceful skip
Janusz Krzysztofik
janusz.krzysztofik at linux.intel.com
Tue Jun 13 09:11:00 UTC 2023
On Tuesday, 13 June 2023 10:41:03 CEST Mauro Carvalho Chehab wrote:
> On Tue, 13 Jun 2023 09:27:26 +0200
> Dominik Karol Piatkowski <dominik.karol.piatkowski at intel.com> wrote:
>
> > Sample drm_buddy output with missing requirements:
> > Starting subtest: drm_buddy_test
> > (drm_buddy:32218) igt_kmod-WARNING: Unable to load KUnit
> > Subtest drm_buddy_test: SKIP (0.001s)
> >
> > Signed-off-by: Dominik Karol Piątkowski
<dominik.karol.piatkowski at intel.com>
> > Cc: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
> > Cc: Mauro Carvalho Chehab <mauro.chehab at linux.intel.com>
> > ---
> > lib/igt_kmod.c | 20 +++++++++++++-------
> > 1 file changed, 13 insertions(+), 7 deletions(-)
> >
> > diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> > index 1511bdef4..04220f404 100644
> > --- a/lib/igt_kmod.c
> > +++ b/lib/igt_kmod.c
> > @@ -763,27 +763,27 @@ static void __igt_kunit(const char *module_name,
const char *opts)
> > int ret;
> > struct ktap_test_results *results;
> > struct ktap_test_results_element *temp;
> > + bool skip = false;
> >
> > /* get normalized module name */
> > if (igt_ktest_init(&tst, module_name) != 0) {
> > - igt_warn("Unable to initialize ktest for %s\n",
module_name);
> > - igt_fail(IGT_EXIT_SKIP);
> > + igt_skip("Unable to initialize ktest for %s\n",
module_name);
> > }
> >
> > if (igt_ktest_begin(&tst) != 0) {
> > - igt_warn("Unable to begin ktest for %s\n", module_name);
> > -
> > igt_ktest_fini(&tst);
> > - igt_fail(IGT_EXIT_SKIP);
> > + igt_skip("Unable to begin ktest for %s\n", module_name);
> > }
> >
> > if (tst.kmsg < 0) {
> > igt_warn("Could not open /dev/kmsg\n");
> > + skip = true;
>
> Hmm.... not being able to read from /dev/kmsg doesn't seem a reason for
> skipping the test.
>
> IMO, the test should be skipped only if:
>
> 1. The Kernel is not compiled with KUnit support;
> 2. The KUnit test was not compiled.
>
> Errors for all other conditions should be considered as failures.
>
> Now, I'm not sure what would be the proper way to test for such
> skip condition. I suspect you could check the error code at
> igt_kmod_load(), calling igt_skip() if it returns -ENOENT,
> e. g. on this part of __igt_kunit():
>
> /* The KUnit module is required for running any KUnit tests */
> if (igt_kmod_load("kunit", NULL) != 0 ||
> kmod_module_new_from_name(kmod_ctx(), "kunit", &kunit_kmod) !=
0) {
> igt_warn("Unable to load KUnit\n");
> igt_fail(IGT_EXIT_FAILURE);
> }
>
> is_builtin = kmod_module_get_initstate(kunit_kmod) ==
KMOD_MODULE_BUILTIN;
>
> results = ktap_parser_start(f, is_builtin);
>
> if (igt_kmod_load(module_name, opts) != 0) {
> igt_warn("Unable to load %s module\n", module_name);
> ret = ktap_parser_stop();
> igt_fail(IGT_EXIT_FAILURE);
> }
>
>
> This could be replaced by something similar to:
>
> err = igt_kmod_load("kunit", NULL);
> igt_skip_on(err == ENOENT, "KUnit not supported");
> igt_fail_on_f(err != 0, "Error %d when trying to load kunit", err);
> if (kmod_module_new_from_name(kmod_ctx(), "kunit", &kunit_kmod) !=
0) {
> igt_warn("Unable to load KUnit\n");
> igt_fail(IGT_EXIT_FAILURE);
> }
>
>
> is_builtin = kmod_module_get_initstate(kunit_kmod) ==
KMOD_MODULE_BUILTIN;
>
> results = ktap_parser_start(f, is_builtin);
>
> err = igt_kmod_load(module_name, opts)
> igt_skip_on(err == ENOENT, "Module %s not found", module_name);
> if (err) {
> igt_warn("Error %d when trying to load %s module\n", err,
module_name);
> ret = ktap_parser_stop();
> igt_fail(IGT_EXIT_FAILURE);
> }
>
>
> In order to explicitly check for (1) and (2).
Why do we reinvent the wheel instead of following the pattern from
igt_kselftest()? We used to follow it, before the whole igt_kunit() body was
put under igt_subtest_with_dynamic() (patch 6/8 of v5, then squashed with 5/5,
IIRC). That forced us to introduce a series of changes inside igt_kunit(),
which we now contest. Was that really necessary?
Thanks,
Janusz
>
> Regards,
> Mauro
>
More information about the igt-dev
mailing list