drm/i915/selftests: Apply a subtest filter
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 29 Jan 2019 18:54:49 +0000 (18:54 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 29 Jan 2019 19:59:57 +0000 (19:59 +0000)
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 <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190129185452.20989-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_selftest.h
drivers/gpu/drm/i915/selftests/i915_selftest.c

index a73472dd12fd926da14d45e35af9a4ac70b97a1e..207e21b478f21afe1165d863f082acd092a7cbf5 100644 (file)
@@ -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;
 };
index 86c54ea37f488c99847416a98db8fc0f9d4db033..10ef0e636a247c985db45409f158800f310ad3cb 100644 (file)
@@ -197,6 +197,49 @@ 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);
+       for (sep = filter; (tok = strsep(&sep, ","));) {
+               bool allow = true;
+               char *sl;
+
+               if (*tok == '!') {
+                       allow = false;
+                       tok++;
+               }
+
+               if (*tok == '\0')
+                       continue;
+
+               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 +252,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 +290,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)");