[PATCH i-g-t v3 3/5] lib/kunit: Time out promptly on missing KTAP report

Kamil Konieczny kamil.konieczny at linux.intel.com
Tue Mar 19 18:33:34 UTC 2024


Hi Janusz,
On 2024-03-18 at 11:13:29 +0100, Janusz Krzysztofik wrote:
> If a test provides a subtest name that doesn't match any test suites
> provided by the requested KUnit test module then no KTAP report appears in
> dmesg, not even an empty one as one may expect.  As a consequence, we now
> loop endlessly around reading potential lines of the missing report from
> /dev/kmsg, until killed by IGT runner on timeout.
> 
> When trying to collect names of test cases from a KTAP report generated in
> all skip mode, set an alarm that fires up 10 seconds after we start
> waiting for the report, interrupts blocking read() if pending, and
> terminates the subtest with SKIP result.
> 
> As soon as we have collected a non-empty list of test cases, we may as
> well expect a non-empty KTAP report from actual execution of those test
> cases, assuming successful load of the KUnit test module in execution
> mode.  Then, there is no need to set up a similar timeout before we start
> to extract and parse that report.
> 
> Suggested-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
>  lib/igt_kmod.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index 8a6824ea7e..f0e4d5ec76 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -1204,12 +1204,19 @@ static void __igt_kunit_legacy(struct igt_ktest *tst,
>  	igt_skip_on_f(ret, "KTAP parser failed\n");
>  }
>  
> +static void kunit_get_tests_timeout(int signal)
> +{
> +	igt_skip("Timed out while trying to extract a list of KUnit test cases from /dev/kmsg\n");
> +}
> +
>  static bool kunit_get_tests(struct igt_list_head *tests,
>  			    struct igt_ktest *tst,
>  			    const char *suite,
>  			    const char *opts,
>  			    struct igt_ktap_results **ktap)
>  {
> +	struct sigaction sigalrm = { .sa_handler = kunit_get_tests_timeout, },
> +			 *saved;
>  	struct igt_ktap_result *r, *rn;
>  	unsigned long taints;
>  	int flags, err;
> @@ -1239,10 +1246,16 @@ static bool kunit_get_tests(struct igt_list_head *tests,
>  	*ktap = igt_ktap_alloc(tests);
>  	igt_require(*ktap);
>  
> +	igt_skip_on(sigaction(SIGALRM, &sigalrm, saved));
> +	alarm(10);
> +
>  	do
>  		err = kunit_kmsg_result_get(tests, NULL, tst->kmsg, *ktap);
>  	while (err == -EINPROGRESS);
>  
> +	alarm(0);
> +	igt_debug_on(sigaction(SIGALRM, saved, NULL));
> +
>  	igt_ktap_free(ktap);
>  
>  	igt_skip_on_f(err,
> -- 
> 2.43.0
> 


More information about the igt-dev mailing list