Chris Wilson <ch...@chris-wilson.co.uk> writes:

> In bringup on simulated HW even rudimentary tests are slow, and so many
> may fail that we want to be able to filter out the noise to focus on the
> specific problem. Even just the tests groups provided for igt is not
> specific enough, and we would like to isolate one particular subtest
> (and probably subsubtests!). For simplicity, allow the user to provide a
> command line parameter such as
>
>       i915.st_filter=i915_timeline_mock_selftests/igt_sync
>
> to restrict ourselves to only running on subtest. The exact name to use
> is given during a normal run, highlighted as an error if it failed,
> debug otherwise. The test group is optional, and then all subtests are
> compared for an exact match with the filter (most subtests have unique
> names). The filter can be negated, e.g. i915.st_filter=!igt_sync and
> then all tests but those that match will be run. More than one match can
> be supplied separated by a comma, e.g.
>
>       i915.st_filter=igt_vma_create,igt_vma_pin1
>
> to only run those specified, or
>
>       i915.st_filter=!igt_vma_create,!igt_vma_pin1
>
> to run all but those named. Mixing a blacklist and whitelist will only
> execute those subtests matching the whitelist so long as they are
> previously excluded in the blacklist.
>
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_selftest.h          |  1 +
>  .../gpu/drm/i915/selftests/i915_selftest.c    | 44 +++++++++++++++++++
>  2 files changed, 45 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_selftest.h 
> b/drivers/gpu/drm/i915/i915_selftest.h
> index a73472dd12fd..207e21b478f2 100644
> --- a/drivers/gpu/drm/i915/i915_selftest.h
> +++ b/drivers/gpu/drm/i915/i915_selftest.h
> @@ -31,6 +31,7 @@ struct i915_selftest {
>       unsigned long timeout_jiffies;
>       unsigned int timeout_ms;
>       unsigned int random_seed;
> +     char *filter;
>       int mock;
>       int live;
>  };
> diff --git a/drivers/gpu/drm/i915/selftests/i915_selftest.c 
> b/drivers/gpu/drm/i915/selftests/i915_selftest.c
> index 86c54ea37f48..1b174ac65ff9 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_selftest.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_selftest.c
> @@ -197,6 +197,46 @@ int i915_live_selftests(struct pci_dev *pdev)
>       return 0;
>  }
>  
> +static bool apply_subtest_filter(const char *caller, const char *name)
> +{
> +     char *filter, *sep, *tok;
> +     bool result = true;
> +
> +     filter = kstrdup(i915_selftest.filter, GFP_KERNEL);

Was going to say that bailout if !filter.
But apparently it is ok this way.

-Mika

> +     for (sep = filter; (tok = strsep(&sep, ","));) {
> +             bool allow = true;
> +             char *sl;
> +
> +             if (*tok == '!') {
> +                     allow = false;
> +                     tok++;
> +             }
> +
> +             sl = strchr(tok, '/');
> +             if (sl) {
> +                     *sl++ = '\0';
> +                     if (strcmp(tok, caller)) {
> +                             if (allow)
> +                                     result = false;
> +                             continue;
> +                     }
> +                     tok = sl;
> +             }
> +
> +             if (strcmp(tok, name)) {
> +                     if (allow)
> +                             result = false;
> +                     continue;
> +             }
> +
> +             result = allow;
> +             break;
> +     }
> +     kfree(filter);
> +
> +     return result;
> +}
> +
>  int __i915_subtests(const char *caller,
>                   const struct i915_subtest *st,
>                   unsigned int count,
> @@ -209,6 +249,9 @@ int __i915_subtests(const char *caller,
>               if (signal_pending(current))
>                       return -EINTR;
>  
> +             if (!apply_subtest_filter(caller, st->name))
> +                     continue;
> +
>               pr_debug(DRIVER_NAME ": Running %s/%s\n", caller, st->name);
>               GEM_TRACE("Running %s/%s\n", caller, st->name);
>  
> @@ -244,6 +287,7 @@ bool __igt_timeout(unsigned long timeout, const char 
> *fmt, ...)
>  
>  module_param_named(st_random_seed, i915_selftest.random_seed, uint, 0400);
>  module_param_named(st_timeout, i915_selftest.timeout_ms, uint, 0400);
> +module_param_named(st_filter, i915_selftest.filter, charp, 0400);
>  
>  module_param_named_unsafe(mock_selftests, i915_selftest.mock, int, 0400);
>  MODULE_PARM_DESC(mock_selftests, "Run selftests before loading, using mock 
> hardware (0:disabled [default], 1:run tests then load driver, -1:run tests 
> then exit module)");
> -- 
> 2.20.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to