[PATCH i-g-t 2/3] Unify handling of slow/combinatorial tests

David Weinehall
2015-10-28T11:30:40Z

Some tests should not be run by default, due to their slow,
and sometimes superfluous, nature.

We still want to be able to run these tests in some cases.
Until now there's been no unified way of handling this. Remedy
this by introducing the --all option to igt_core,
and use it in gem_concurrent_blit & kms_frontbuffer_tracking.

Signed-off-by: David Weinehall <david.weinehall@linux.intel.com>
---
lib/igt_core.c | 24 +++++
lib/igt_core.h | 7 ++
tests/gem_concurrent_blit.c | 44 ++++-----
tests/kms_frontbuffer_tracking.c | 208 ++++++++++++++++++++++-----------------
4 files changed, 165 insertions(+), 118 deletions(-)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 59127cafe606..6575b9d6bf0d 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -216,6 +216,7 @@ const char *igt_interactive_debug;

/* subtests helpers */
static bool list_subtests = false;
+static bool with_slow_combinatorial = false;
static char *run_single_subtest = NULL;
static bool run_single_subtest_found = false;
static const char *in_subtest = NULL;
@@ -235,6 +236,7 @@ bool test_child;

enum {
OPT_LIST_SUBTESTS,
+ OPT_WITH_SLOW_COMBINATORIAL,
OPT_RUN_SUBTEST,
OPT_DESCRIPTION,
OPT_DEBUG,
@@ -478,6 +480,7 @@ static void print_usage(const char *help_str, bool output_on_stderr)

fprintf(f, "Usage: %s [OPTIONS]\n", command_str);
fprintf(f, " --list-subtests\n"
+ " --all\n"
" --run-subtest <pattern>\n"
" --debug[=log-domain]\n"
" --interactive-debug[=domain]\n"
@@ -510,6 +513,7 @@ static int common_init(int *argc, char **argv,
int c, option_index = 0, i, x;
static struct option long_options[] = {
{"list-subtests", 0, 0, OPT_LIST_SUBTESTS},
+ {"all", 0, 0, OPT_WITH_SLOW_COMBINATORIAL},
{"run-subtest", 1, 0, OPT_RUN_SUBTEST},
{"help-description", 0, 0, OPT_DESCRIPTION},
{"debug", optional_argument, 0, OPT_DEBUG},
@@ -617,6 +621,10 @@ static int common_init(int *argc, char **argv,
if (!run_single_subtest)
list_subtests = true;
break;
+ case OPT_WITH_SLOW_COMBINATORIAL:
+ if (!run_single_subtest)
+ with_slow_combinatorial = true;
+ break;
case OPT_RUN_SUBTEST:
if (!list_subtests)
run_single_subtest = strdup(optarg);
@@ -1629,6 +1637,22 @@ void igt_skip_on_simulation(void)
igt_require(!igt_run_in_simulation());
}

+/**
+ * __igt_slow_combinatorial:
+ *
+ * This is used to skip subtests that should only be included
+ * when the "--all" command line option has been specified. This version
+ * is intended as a test.
+ *
+ * @slow_test: true if the subtest is part of the slow/combinatorial set
+ *
+ * Returns: true if the test should be run, false if the test should be skipped
+ */
+bool __igt_slow_combinatorial(bool slow_test)
+{
+ return !slow_test || with_slow_combinatorial;
+}
+
/* structured logging */

/**
diff --git a/lib/igt_core.h b/lib/igt_core.h
index 5ae09653fd55..7b592278bf6c 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -191,6 +191,12 @@ bool __igt_run_subtest(const char *subtest_name);
#define igt_subtest_f(f...) \
__igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)

+bool __igt_slow_combinatorial(bool slow_test);
+
+#define igt_subtest_slow_f(__slow, f...) \
+ if (__igt_slow_combinatorial(__slow)) \
+ __igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)
+
const char *igt_subtest_name(void);
bool igt_only_list_subtests(void);

@@ -669,6 +675,7 @@ void igt_disable_exit_handler(void);

/* helpers to automatically reduce test runtime in simulation */
bool igt_run_in_simulation(void);
+
/**
* SLOW_QUICK:
* @slow: value in simulation mode
diff --git a/tests/gem_concurrent_blit.c b/tests/gem_concurrent_blit.c
index 1d2d787202df..fe37cc707583 100644
--- a/tests/gem_concurrent_blit.c
+++ b/tests/gem_concurrent_blit.c
@@ -55,7 +55,6 @@ IGT_TEST_DESCRIPTION("Test of pread/pwrite/mmap behavior when writing to active"

int fd, devid, gen;
struct intel_batchbuffer *batch;
-int all;

static void
nop_release_bo(drm_intel_bo *bo)
@@ -931,16 +930,14 @@ run_basic_modes(const struct access_mode *mode,
struct buffers buffers;

for (h = hangs; h->suffix; h++) {
- if (!all && *h->suffix)
- continue;
-
- for (p = all ? pipelines : pskip; p->prefix; p++) {
+ for (p = __igt_slow_combinatorial(true) ? pipelines : pskip;
+ p->prefix; p++) {
igt_fixture {
batch = buffers_init(&buffers, mode, fd);
}

/* try to overwrite the source values */
- igt_subtest_f("%s-%s-overwrite-source-one%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-overwrite-source-one%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -949,7 +946,7 @@ run_basic_modes(const struct access_mode *mode,
p->copy, h->hang);
}

- igt_subtest_f("%s-%s-overwrite-source%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-overwrite-source%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -958,7 +955,7 @@ run_basic_modes(const struct access_mode *mode,
p->copy, h->hang);
}

- igt_subtest_f("%s-%s-overwrite-source-read-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-overwrite-source-read-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -967,7 +964,7 @@ run_basic_modes(const struct access_mode *mode,
p->copy, h->hang);
}

- igt_subtest_f("%s-%s-overwrite-source-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-overwrite-source-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
igt_require(rendercopy);
@@ -977,7 +974,7 @@ run_basic_modes(const struct access_mode *mode,
p->copy, h->hang);
}

- igt_subtest_f("%s-%s-overwrite-source-rev%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-overwrite-source-rev%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -987,7 +984,7 @@ run_basic_modes(const struct access_mode *mode,
}

/* try to intermix copies with GPU copies*/
- igt_subtest_f("%s-%s-intermix-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-intermix-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
igt_require(rendercopy);
@@ -996,7 +993,7 @@ run_basic_modes(const struct access_mode *mode,
do_intermix_rcs,
p->copy, h->hang);
}
- igt_subtest_f("%s-%s-intermix-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-intermix-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
igt_require(rendercopy);
@@ -1005,7 +1002,7 @@ run_basic_modes(const struct access_mode *mode,
do_intermix_bcs,
p->copy, h->hang);
}
- igt_subtest_f("%s-%s-intermix-both%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-intermix-both%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
igt_require(rendercopy);
@@ -1016,7 +1013,7 @@ run_basic_modes(const struct access_mode *mode,
}

/* try to read the results before the copy completes */
- igt_subtest_f("%s-%s-early-read%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-early-read%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -1026,7 +1023,7 @@ run_basic_modes(const struct access_mode *mode,
}

/* concurrent reads */
- igt_subtest_f("%s-%s-read-read-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-read-read-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -1034,7 +1031,7 @@ run_basic_modes(const struct access_mode *mode,
do_read_read_bcs,
p->copy, h->hang);
}
- igt_subtest_f("%s-%s-read-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-read-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
igt_require(rendercopy);
@@ -1045,7 +1042,7 @@ run_basic_modes(const struct access_mode *mode,
}

/* and finally try to trick the kernel into loosing the pending write */
- igt_subtest_f("%s-%s-gpu-read-after-write%s%s", mode->name, p->prefix, suffix, h->suffix) {
+ igt_subtest_slow_f(*h->suffix, "%s-%s-gpu-read-after-write%s%s", mode->name, p->prefix, suffix, h->suffix) {
h->require();
p->require();
buffers_create(&buffers, num_buffers);
@@ -1064,13 +1061,11 @@ run_basic_modes(const struct access_mode *mode,
static void
run_modes(const struct access_mode *mode)
{
- if (all) {
- run_basic_modes(mode, "", run_single);
+ run_basic_modes(mode, "", run_single);

- igt_fork_signal_helper();
- run_basic_modes(mode, "-interruptible", run_interruptible);
- igt_stop_signal_helper();
- }
+ igt_fork_signal_helper();
+ run_basic_modes(mode, "-interruptible", run_interruptible);
+ igt_stop_signal_helper();

igt_fork_signal_helper();
run_basic_modes(mode, "-forked", run_forked);
@@ -1083,9 +1078,6 @@ igt_main

igt_skip_on_simulation();

- if (strstr(igt_test_name(), "all"))
- all = true;
-
igt_fixture {
fd = drm_open_driver(DRIVER_INTEL);
devid = intel_get_drm_devid(fd);
diff --git a/tests/kms_frontbuffer_tracking.c b/tests/kms_frontbuffer_tracking.c
index 15707b9b9040..86fd7ca08692 100644
--- a/tests/kms_frontbuffer_tracking.c
+++ b/tests/kms_frontbuffer_tracking.c
@@ -47,8 +47,7 @@ IGT_TEST_DESCRIPTION("Test the Kernel's frontbuffer tracking mechanism and "
* combinations that are somewhat redundant and don't add much value to the
* test. For example, since we already do the offscreen testing with a single
* pipe enabled, there's no much value in doing it again with dual pipes. If you
- * still want to try these redundant tests, you need to use the --show-hidden
- * option.
+ * still want to try these redundant tests, you need to use the --all option.
*
* The most important hidden thing is the FEATURE_NONE set of tests. Whenever
* you get a failure on any test, it is important to check whether the same test
@@ -116,6 +115,10 @@ struct test_mode {
} format;

enum igt_draw_method method;
+
+ /* The test is slow and/or combinatorial;
+ * skip unless otherwise specified */
+ bool slow;
};

enum flip_type {
@@ -237,7 +240,6 @@ struct {
bool fbc_check_last_action;
bool no_edp;
bool small_modes;
- bool show_hidden;
int step;
int only_pipes;
int shared_fb_x_offset;
@@ -249,7 +251,6 @@ struct {
.fbc_check_last_action = true,
.no_edp = false,
.small_modes = false,
- .show_hidden= false,
.step = 0,
.only_pipes = PIPE_COUNT,
.shared_fb_x_offset = 500,
@@ -2933,9 +2934,6 @@ static int opt_handler(int option, int option_index, void *data)
case 'm':
opt.small_modes = true;
break;
- case 'i':
- opt.show_hidden = true;
- break;
case 't':
opt.step++;
break;
@@ -2971,7 +2969,6 @@ const char *help_str =
" --no-fbc-action-check Don't check for the FBC last action\n"
" --no-edp Don't use eDP monitors\n"
" --use-small-modes Use smaller resolutions for the modes\n"
-" --show-hidden Show hidden subtests\n"
" --step Stop on each step so you can check the screen\n"
" --shared-fb-x offset Use 'offset' as the X offset for the shared FB\n"
" --shared-fb-y offset Use 'offset' as the Y offset for the shared FB\n"
@@ -3068,18 +3065,19 @@ static const char *format_str(enum pixel_format format)
for (t.plane = 0; t.plane < PLANE_COUNT; t.plane++) { \
for (t.fbs = 0; t.fbs < FBS_COUNT; t.fbs++) { \
for (t.method = 0; t.method < IGT_DRAW_METHOD_COUNT; t.method++) { \
+ t.slow = false; \
if (t.pipes == PIPE_SINGLE && t.screen == SCREEN_SCND) \
continue; \
if (t.screen == SCREEN_OFFSCREEN && t.plane != PLANE_PRI) \
continue; \
- if (!opt.show_hidden && t.pipes == PIPE_DUAL && \
+ if (t.pipes == PIPE_DUAL && \
t.screen == SCREEN_OFFSCREEN) \
- continue; \
- if (!opt.show_hidden && t.feature == FEATURE_NONE) \
- continue; \
- if (!opt.show_hidden && t.fbs == FBS_SHARED && \
+ t.slow = true; \
+ if (t.feature == FEATURE_NONE) \
+ t.slow = true; \
+ if (t.fbs == FBS_SHARED && \
(t.plane == PLANE_CUR || t.plane == PLANE_SPR)) \
- continue;
+ t.slow = true;

#define TEST_MODE_ITER_END } } } } } }
@@ -3094,7 +3092,6 @@ int main(int argc, char *argv[])
{ "no-fbc-action-check", 0, 0, 'a'},
{ "no-edp", 0, 0, 'e'},
{ "use-small-modes", 0, 0, 'm'},
- { "show-hidden", 0, 0, 'i'},
{ "step", 0, 0, 't'},
{ "shared-fb-x", 1, 0, 'x'},
{ "shared-fb-y", 1, 0, 'y'},
@@ -3110,8 +3107,9 @@ int main(int argc, char *argv[])
setup_environment();

for (t.feature = 0; t.feature < FEATURE_COUNT; t.feature++) {
- if (!opt.show_hidden && t.feature == FEATURE_NONE)
- continue;
+ t.slow = false;
+ if (t.feature == FEATURE_NONE)
+ t.slow = true;
for (t.pipes = 0; t.pipes < PIPE_COUNT; t.pipes++) {
t.screen = SCREEN_PRIM;
t.plane = PLANE_PRI;
@@ -3120,52 +3118,58 @@ int main(int argc, char *argv[])
/* Make sure nothing is using this value. */
t.method = -1;

- igt_subtest_f("%s-%s-rte",
- feature_str(t.feature),
- pipes_str(t.pipes))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-rte",
+ feature_str(t.feature),
+ pipes_str(t.pipes))
rte_subtest(&t);
}
}

TEST_MODE_ITER_BEGIN(t)
- igt_subtest_f("%s-%s-%s-%s-%s-draw-%s",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- plane_str(t.plane),
- fbs_str(t.fbs),
- igt_draw_get_method_name(t.method))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-%s-draw-%s",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ plane_str(t.plane),
+ fbs_str(t.fbs),
+ igt_draw_get_method_name(t.method))
draw_subtest(&t);
TEST_MODE_ITER_END

TEST_MODE_ITER_BEGIN(t)
if (t.plane != PLANE_PRI ||
- t.screen == SCREEN_OFFSCREEN ||
- (!opt.show_hidden && t.method != IGT_DRAW_BLT))
+ t.screen == SCREEN_OFFSCREEN)
continue;
-
- igt_subtest_f("%s-%s-%s-%s-flip-%s",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- fbs_str(t.fbs),
- igt_draw_get_method_name(t.method))
+ if (t.method != IGT_DRAW_BLT)
+ t.slow = true;
+
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-flip-%s",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ fbs_str(t.fbs),
+ igt_draw_get_method_name(t.method))
flip_subtest(&t, FLIP_PAGEFLIP);

- igt_subtest_f("%s-%s-%s-%s-evflip-%s",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- fbs_str(t.fbs),
- igt_draw_get_method_name(t.method))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-evflip-%s",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ fbs_str(t.fbs),
+ igt_draw_get_method_name(t.method))
flip_subtest(&t, FLIP_PAGEFLIP_EVENT);

- igt_subtest_f("%s-%s-%s-%s-msflip-%s",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- fbs_str(t.fbs),
- igt_draw_get_method_name(t.method))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-msflip-%s",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ fbs_str(t.fbs),
+ igt_draw_get_method_name(t.method))
flip_subtest(&t, FLIP_MODESET);

TEST_MODE_ITER_END
@@ -3177,10 +3181,11 @@ int main(int argc, char *argv[])
(t.feature & FEATURE_FBC) == 0)
continue;

- igt_subtest_f("%s-%s-%s-fliptrack",
- feature_str(t.feature),
- pipes_str(t.pipes),
- fbs_str(t.fbs))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-fliptrack",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ fbs_str(t.fbs))
fliptrack_subtest(&t, FLIP_PAGEFLIP);
TEST_MODE_ITER_END

@@ -3190,20 +3195,22 @@ int main(int argc, char *argv[])
t.plane == PLANE_PRI)
continue;

- igt_subtest_f("%s-%s-%s-%s-%s-move",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- plane_str(t.plane),
- fbs_str(t.fbs))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-%s-move",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ plane_str(t.plane),
+ fbs_str(t.fbs))
move_subtest(&t);

- igt_subtest_f("%s-%s-%s-%s-%s-onoff",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- plane_str(t.plane),
- fbs_str(t.fbs))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-%s-onoff",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ plane_str(t.plane),
+ fbs_str(t.fbs))
onoff_subtest(&t);
TEST_MODE_ITER_END

@@ -3213,27 +3220,30 @@ int main(int argc, char *argv[])
t.plane != PLANE_SPR)
continue;

- igt_subtest_f("%s-%s-%s-%s-%s-fullscreen",
- feature_str(t.feature),
- pipes_str(t.pipes),
- screen_str(t.screen),
- plane_str(t.plane),
- fbs_str(t.fbs))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-%s-fullscreen",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ screen_str(t.screen),
+ plane_str(t.plane),
+ fbs_str(t.fbs))
fullscreen_plane_subtest(&t);
TEST_MODE_ITER_END

TEST_MODE_ITER_BEGIN(t)
if (t.screen != SCREEN_PRIM ||
- t.method != IGT_DRAW_BLT ||
- (!opt.show_hidden && t.plane != PLANE_PRI) ||
- (!opt.show_hidden && t.fbs != FBS_INDIVIDUAL))
+ t.method != IGT_DRAW_BLT)
continue;
-
- igt_subtest_f("%s-%s-%s-%s-multidraw",
- feature_str(t.feature),
- pipes_str(t.pipes),
- plane_str(t.plane),
- fbs_str(t.fbs))
+ if (t.plane != PLANE_PRI ||
+ t.fbs != FBS_INDIVIDUAL)
+ t.slow = true;
+
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-%s-%s-multidraw",
+ feature_str(t.feature),
+ pipes_str(t.pipes),
+ plane_str(t.plane),
+ fbs_str(t.fbs))
multidraw_subtest(&t);
TEST_MODE_ITER_END

@@ -3245,7 +3255,9 @@ int main(int argc, char *argv[])
t.method != IGT_DRAW_MMAP_GTT)
continue;

- igt_subtest_f("%s-farfromfence", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-farfromfence",
+ feature_str(t.feature))
farfromfence_subtest(&t);
TEST_MODE_ITER_END

@@ -3261,10 +3273,11 @@ int main(int argc, char *argv[])
if (t.format == FORMAT_DEFAULT)
continue;

- igt_subtest_f("%s-%s-draw-%s",
- feature_str(t.feature),
- format_str(t.format),
- igt_draw_get_method_name(t.method))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-draw-%s",
+ feature_str(t.feature),
+ format_str(t.format),
+ igt_draw_get_method_name(t.method))
format_draw_subtest(&t);
}
TEST_MODE_ITER_END
@@ -3275,9 +3288,10 @@ int main(int argc, char *argv[])
t.plane != PLANE_PRI ||
t.method != IGT_DRAW_MMAP_CPU)
continue;
- igt_subtest_f("%s-%s-scaledprimary",
- feature_str(t.feature),
- fbs_str(t.fbs))
+ igt_subtest_slow_f(t.slow,
+ "%s-%s-scaledprimary",
+ feature_str(t.feature),
+ fbs_str(t.fbs))
scaledprimary_subtest(&t);
TEST_MODE_ITER_END

@@ -3289,22 +3303,32 @@ int main(int argc, char *argv[])
t.method != IGT_DRAW_MMAP_CPU)
continue;

- igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-modesetfrombusy",
+ feature_str(t.feature))
modesetfrombusy_subtest(&t);

if (t.feature & FEATURE_FBC) {
- igt_subtest_f("%s-badstride", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-badstride",
+ feature_str(t.feature))
badstride_subtest(&t);

- igt_subtest_f("%s-stridechange", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-stridechange",
+ feature_str(t.feature))
stridechange_subtest(&t);
}

if (t.feature & FEATURE_PSR)
- igt_subtest_f("%s-slowdraw", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-slowdraw",
+ feature_str(t.feature))
slow_draw_subtest(&t);

- igt_subtest_f("%s-suspend", feature_str(t.feature))
+ igt_subtest_slow_f(t.slow,
+ "%s-suspend",
+ feature_str(t.feature))
suspend_subtest(&t);
TEST_MODE_ITER_END

--
2.6.2