Hi Janusz,
On 2023-10-09 at 14:28:02 +0200, Janusz Krzysztofik wrote:
> IGT user interface allows to request execution of only those dynamic sub-
> subtests that match a user provided name pattern.  If the user pattern
> doesn't match any names of test cases provided by a kunit test module used
> with the subtest to be run then no results from any dynamic sub-subtests
> will be reported.  Since we already know the list of test cases provided
> by the kunit test module, there is no need to load that module to execute
> them unless the user pattern matches at least one of those test cases.
> 
> Don't load the kunit test module in execute mode before entering the loop
> of dynamic sub-subtests, and do that only from the first actually executed
> dynamic sub-subtest.
> 
> v2: Always pass last result to next dynamic sub-subtest, fetch first
>     result right after loading the kunit test module for execution.
> 
> Signed-off-by: Janusz Krzysztofik <janusz.krzyszto...@linux.intel.com>

Reviewed-by: Kamil Konieczny <kamil.koniec...@linux.intel.com>

> ---
>  lib/igt_kmod.c | 66 ++++++++++++++++++++++++++------------------------
>  1 file changed, 35 insertions(+), 31 deletions(-)
> 
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index 150fe49803..69915adc40 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -981,33 +981,37 @@ static void __igt_kunit(struct igt_ktest *tst,
>  
>       igt_skip_on(lseek(tst->kmsg, 0, SEEK_END) < 0);
>  
> -     igt_skip_on(pthread_mutexattr_init(&attr));
> -     igt_skip_on(pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST));
> -     igt_skip_on(pthread_mutex_init(&modprobe.lock, &attr));
> -
>       ktap = igt_ktap_alloc(&results);
>       igt_require(ktap);
>  
> -     if (igt_debug_on(pthread_create(&modprobe.thread, NULL,
> -                                     modprobe_task, &modprobe))) {
> -             igt_ktap_free(ktap);
> -             igt_skip("Failed to create a modprobe thread\n");
> -     }
> -
>       igt_list_for_each_entry(t, tests, link) {
>               igt_dynamic_f("%s%s%s",
>                             strcmp(t->suite_name, name) ?  t->suite_name : "",
>                             strcmp(t->suite_name, name) ? "-" : "",
>                             t->case_name) {
>  
> -                     if (igt_list_empty(&results)) {
> +                     if (!modprobe.thread) {
> +                             igt_assert_eq(pthread_mutexattr_init(&attr), 0);
> +                             igt_assert_eq(pthread_mutexattr_setrobust(&attr,
> +                                                       PTHREAD_MUTEX_ROBUST),
> +                                           0);
> +                             igt_assert_eq(pthread_mutex_init(&modprobe.lock,
> +                                                              &attr), 0);
> +
> +                             modprobe.err = pthread_create(&modprobe.thread,
> +                                                           NULL,
> +                                                           modprobe_task,
> +                                                           &modprobe);
> +                             igt_assert_eq(modprobe.err, 0);
> +
> +                             igt_assert(igt_list_empty(&results));
>                               igt_assert_eq(ret, -EINPROGRESS);
>                               ret = kunit_kmsg_result_get(&results, &modprobe,
>                                                           tst->kmsg, ktap);
>                               igt_fail_on(igt_list_empty(&results));
> -                     }
>  
> -                     r = igt_list_first_entry(&results, r, link);
> +                             r = igt_list_first_entry(&results, r, link);
> +                     }
>  
>                       while (igt_debug_on_f(strcmp(r->suite_name, 
> t->suite_name),
>                                             "suite_name expected: %s, got: 
> %s\n",
> @@ -1079,30 +1083,30 @@ static void __igt_kunit(struct igt_ktest *tst,
>                       igt_assert_eq(igt_kernel_tainted(&taints), 0);
>               }
>  
> -             kunit_result_free(&r, &suite_name, &case_name);
> -
>               if (igt_debug_on(ret != -EINPROGRESS))
>                       break;
>       }
>  
>       kunit_results_free(&results, &suite_name, &case_name);
>  
> -     switch (pthread_mutex_lock(&modprobe.lock)) {
> -     case 0:
> -             igt_debug_on(pthread_cancel(modprobe.thread));
> -             igt_debug_on(pthread_mutex_unlock(&modprobe.lock));
> -             igt_debug_on(pthread_join(modprobe.thread, NULL));
> -             break;
> -     case EOWNERDEAD:
> -             /* leave the mutex unrecoverable */
> -             igt_debug_on(pthread_mutex_unlock(&modprobe.lock));
> -             break;
> -     case ENOTRECOVERABLE:
> -             break;
> -     default:
> -             igt_debug("pthread_mutex_lock() failed\n");
> -             igt_debug_on(pthread_join(modprobe.thread, NULL));
> -             break;
> +     if (modprobe.thread) {
> +             switch (pthread_mutex_lock(&modprobe.lock)) {
> +             case 0:
> +                     igt_debug_on(pthread_cancel(modprobe.thread));
> +                     igt_debug_on(pthread_mutex_unlock(&modprobe.lock));
> +                     igt_debug_on(pthread_join(modprobe.thread, NULL));
> +                     break;
> +             case EOWNERDEAD:
> +                     /* leave the mutex unrecoverable */
> +                     igt_debug_on(pthread_mutex_unlock(&modprobe.lock));
> +                     break;
> +             case ENOTRECOVERABLE:
> +                     break;
> +             default:
> +                     igt_debug("pthread_mutex_lock() failed\n");
> +                     igt_debug_on(pthread_join(modprobe.thread, NULL));
> +                     break;
> +             }
>       }
>  
>       igt_ktap_free(ktap);
> -- 
> 2.42.0
> 

Reply via email to