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

Paulo Zanoni
2015-10-23T13:50:47Z

2015-10-23 9:42 GMT-02:00 David Weinehall <david.weinehall@linux.intel.com>:
> 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 though in some cases.
> Until now there's been no unified way of handling this. Remedy
> this by introducing the --with-slow-combinatorial option to
> igt_core, and use it in gem_concurrent_blit & kms_frontbuffer_tracking.
> ---
> lib/igt_core.c | 19 ++++++
> lib/igt_core.h | 1 +
> tests/gem_concurrent_blit.c | 40 ++++++++----
> tests/kms_frontbuffer_tracking.c | 135 +++++++++++++++++++++++++++------------
> 4 files changed, 142 insertions(+), 53 deletions(-)
>
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 59127cafe606..ba40ce0e0ead 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"
> + " --with-slow-combinatorial\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},
> + {"with-slow-combinatorial", 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,17 @@ void igt_skip_on_simulation(void)
> igt_require(!igt_run_in_simulation());
> }
>
> +/**
> + * igt_slow_combinatorial:
> + *
> + * This is used to define subtests that should only be listed/run
> + * when the "--with-slow-combinatorial" has been specified
> + */
> +void igt_slow_combinatorial(void)
> +{
> + igt_skip_on(!with_slow_combinatorial);
> +}
> +
> /* structured logging */
>
> /**
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index 5ae09653fd55..6ddf25563275 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -680,6 +680,7 @@ bool igt_run_in_simulation(void);
> #define SLOW_QUICK(slow,quick) (igt_run_in_simulation() ? (quick) : (slow))
>
> void igt_skip_on_simulation(void);
> +void igt_slow_combinatorial(void);
>
> extern const char *igt_interactive_debug;
>
> diff --git a/tests/gem_concurrent_blit.c b/tests/gem_concurrent_blit.c
> index 1d2d787202df..311b6829e984 100644
> --- a/tests/gem_concurrent_blit.c
> +++ b/tests/gem_concurrent_blit.c
> @@ -931,9 +931,6 @@ 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++) {
> igt_fixture {
> batch = buffers_init(&buffers, mode, fd);
> @@ -941,6 +938,8 @@ run_basic_modes(const struct access_mode *mode,
>
> /* try to overwrite the source values */
> igt_subtest_f("%s-%s-overwrite-source-one%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -950,6 +949,8 @@ run_basic_modes(const struct access_mode *mode,
> }
>
> igt_subtest_f("%s-%s-overwrite-source%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -959,6 +960,8 @@ run_basic_modes(const struct access_mode *mode,
> }
>
> igt_subtest_f("%s-%s-overwrite-source-read-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -968,6 +971,8 @@ run_basic_modes(const struct access_mode *mode,
> }
>
> igt_subtest_f("%s-%s-overwrite-source-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> igt_require(rendercopy);
> @@ -978,6 +983,8 @@ run_basic_modes(const struct access_mode *mode,
> }
>
> igt_subtest_f("%s-%s-overwrite-source-rev%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -988,6 +995,8 @@ 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) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> igt_require(rendercopy);
> @@ -997,6 +1006,8 @@ run_basic_modes(const struct access_mode *mode,
> p->copy, h->hang);
> }
> igt_subtest_f("%s-%s-intermix-bcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> igt_require(rendercopy);
> @@ -1006,6 +1017,8 @@ run_basic_modes(const struct access_mode *mode,
> p->copy, h->hang);
> }
> igt_subtest_f("%s-%s-intermix-both%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> igt_require(rendercopy);
> @@ -1017,6 +1030,8 @@ 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) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -1027,6 +1042,8 @@ 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) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -1035,6 +1052,8 @@ run_basic_modes(const struct access_mode *mode,
> p->copy, h->hang);
> }
> igt_subtest_f("%s-%s-read-read-rcs%s%s", mode->name, p->prefix, suffix, h->suffix) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> igt_require(rendercopy);
> @@ -1046,6 +1065,8 @@ 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) {
> + if (*h->suffix)
> + igt_slow_combinatorial();
> h->require();
> p->require();
> buffers_create(&buffers, num_buffers);
> @@ -1064,13 +1085,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 +1102,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 d97e148c5073..6f84ef0813d9 100644
> --- a/tests/kms_frontbuffer_tracking.c
> +++ b/tests/kms_frontbuffer_tracking.c
> @@ -47,8 +47,8 @@ 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
> + * "--with-slow-combinatorial" 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 +116,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 +241,6 @@ struct {
> bool fbc_check_last_action;
> bool no_edp;
> bool small_modes;
> - bool show_hidden;

It's not clear to me, please clarify: now the tests that were
previously completely hidden will be listed in --list-subtests and
will be shown as skipped during normal runs?

For kms_frontbuffer_tracking, hidden tests are supposed to be just for
developers who know what they are doing. I hide them behind a special
command-line switch that's not used by QA because I don't want QA
wasting time running those tests. One third of the
kms_frontbuffer_tracking hidden tests only serve the purpose of
checking whether there's a bug in kms_frontbuffer_track itself or not.
For some other hidden tests, they are there just to help better debug
in case some other non-hidden tests fail. Some other hidden tests are
100% useless and superfulous.QA should only run the non-hidden tests.
So if some non-hidden test fails, the developers can use the hidden
tests to help debugging.

Besides, the "if (t.slow)" could have been moved to
check_test_requirements(), making the code much simpler :)

> int step;
> int only_feature;
> int only_pipes;
> @@ -250,7 +253,6 @@ struct {
> .fbc_check_last_action = true,
> .no_edp = false,
> .small_modes = false,
> - .show_hidden= false,
> .step = 0,
> .only_feature = FEATURE_COUNT,
> .only_pipes = PIPE_COUNT,
> @@ -2892,9 +2894,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;
> @@ -2942,7 +2941,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"
> " --nop-only Only run the \"nop\" feature subtests\n"
> " --fbc-only Only run the \"fbc\" feature subtests\n"
> @@ -3036,6 +3034,7 @@ static const char *format_str(enum pixel_format format)
>
> #define TEST_MODE_ITER_BEGIN(t) \
> t.format = FORMAT_DEFAULT; \
> + t.slow = false; \
> for (t.feature = 0; t.feature < FEATURE_COUNT; t.feature++) { \
> for (t.pipes = 0; t.pipes < PIPE_COUNT; t.pipes++) { \
> for (t.screen = 0; t.screen < SCREEN_COUNT; t.screen++) { \
> @@ -3046,15 +3045,15 @@ static const char *format_str(enum pixel_format format)
> 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 && opt.only_feature != FEATURE_NONE) \
> - && t.feature == FEATURE_NONE) \
> - continue; \
> - if (!opt.show_hidden && t.fbs == FBS_SHARED && \
> + t.slow = true; \
> + if (opt.only_feature != FEATURE_NONE && \
> + 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 } } } } } }
> @@ -3069,7 +3068,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'},
> { "nop-only", 0, 0, 'n'},
> { "fbc-only", 0, 0, 'f'},
> @@ -3088,9 +3086,11 @@ int main(int argc, char *argv[])
> setup_environment();
>
> for (t.feature = 0; t.feature < FEATURE_COUNT; t.feature++) {
> - if ((!opt.show_hidden && opt.only_feature != FEATURE_NONE)
> - && t.feature == FEATURE_NONE)
> - continue;
> + bool slow = false;
> +
> + if (opt.only_feature != FEATURE_NONE &&
> + t.feature == FEATURE_NONE)
> + slow = true;
> for (t.pipes = 0; t.pipes < PIPE_COUNT; t.pipes++) {
> t.screen = SCREEN_PRIM;
> t.plane = PLANE_PRI;
> @@ -3101,8 +3101,11 @@ int main(int argc, char *argv[])
>
> igt_subtest_f("%s-%s-rte",
> feature_str(t.feature),
> - pipes_str(t.pipes))
> + pipes_str(t.pipes)) {
> + if (slow)
> + igt_slow_combinatorial();
> rte_subtest(&t);
> + }
> }
> }
>
> @@ -3113,39 +3116,52 @@ int main(int argc, char *argv[])
> screen_str(t.screen),
> plane_str(t.plane),
> fbs_str(t.fbs),
> - igt_draw_get_method_name(t.method))
> + igt_draw_get_method_name(t.method)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> 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;
> + if (t.method != IGT_DRAW_BLT)
> + t.slow = true;
>
> 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))
> + igt_draw_get_method_name(t.method)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> 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_draw_get_method_name(t.method)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> 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_draw_get_method_name(t.method)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> flip_subtest(&t, FLIP_MODESET);
> + }
>
> TEST_MODE_ITER_END
>
> @@ -3159,8 +3175,11 @@ int main(int argc, char *argv[])
> igt_subtest_f("%s-%s-%s-fliptrack",
> feature_str(t.feature),
> pipes_str(t.pipes),
> - fbs_str(t.fbs))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> fliptrack_subtest(&t, FLIP_PAGEFLIP);
> + }
> TEST_MODE_ITER_END
>
> TEST_MODE_ITER_BEGIN(t)
> @@ -3174,16 +3193,22 @@ int main(int argc, char *argv[])
> pipes_str(t.pipes),
> screen_str(t.screen),
> plane_str(t.plane),
> - fbs_str(t.fbs))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> 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))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> onoff_subtest(&t);
> + }
> TEST_MODE_ITER_END
>
> TEST_MODE_ITER_BEGIN(t)
> @@ -3197,23 +3222,30 @@ int main(int argc, char *argv[])
> pipes_str(t.pipes),
> screen_str(t.screen),
> plane_str(t.plane),
> - fbs_str(t.fbs))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> 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;
> + if (t.plane != PLANE_PRI ||
> + t.fbs != FBS_INDIVIDUAL)
> + t.slow = true;
>
> igt_subtest_f("%s-%s-%s-%s-multidraw",
> feature_str(t.feature),
> pipes_str(t.pipes),
> plane_str(t.plane),
> - fbs_str(t.fbs))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> multidraw_subtest(&t);
> + }
> TEST_MODE_ITER_END
>
> TEST_MODE_ITER_BEGIN(t)
> @@ -3224,8 +3256,11 @@ int main(int argc, char *argv[])
> t.method != IGT_DRAW_MMAP_GTT)
> continue;
>
> - igt_subtest_f("%s-farfromfence", feature_str(t.feature))
> + igt_subtest_f("%s-farfromfence", feature_str(t.feature)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> farfromfence_subtest(&t);
> + }
> TEST_MODE_ITER_END
>
> TEST_MODE_ITER_BEGIN(t)
> @@ -3243,8 +3278,11 @@ int main(int argc, char *argv[])
> igt_subtest_f("%s-%s-draw-%s",
> feature_str(t.feature),
> format_str(t.format),
> - igt_draw_get_method_name(t.method))
> + igt_draw_get_method_name(t.method)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> format_draw_subtest(&t);
> + }
> }
> TEST_MODE_ITER_END
>
> @@ -3256,8 +3294,11 @@ int main(int argc, char *argv[])
> continue;
> igt_subtest_f("%s-%s-scaledprimary",
> feature_str(t.feature),
> - fbs_str(t.fbs))
> + fbs_str(t.fbs)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> scaledprimary_subtest(&t);
> + }
> TEST_MODE_ITER_END
>
> TEST_MODE_ITER_BEGIN(t)
> @@ -3268,19 +3309,31 @@ int main(int argc, char *argv[])
> t.method != IGT_DRAW_MMAP_CPU)
> continue;
>
> - igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature))
> + igt_subtest_f("%s-modesetfrombusy", feature_str(t.feature)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> modesetfrombusy_subtest(&t);
> + }
>
> if (t.feature & FEATURE_FBC)
> - igt_subtest_f("%s-badstride", feature_str(t.feature))
> + igt_subtest_f("%s-badstride", feature_str(t.feature)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> badstride_subtest(&t);
> + }
>
> if (t.feature & FEATURE_PSR)
> - igt_subtest_f("%s-slowdraw", feature_str(t.feature))
> + igt_subtest_f("%s-slowdraw", feature_str(t.feature)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> slow_draw_subtest(&t);
> + }
>
> - igt_subtest_f("%s-suspend", feature_str(t.feature))
> + igt_subtest_f("%s-suspend", feature_str(t.feature)) {
> + if (t.slow)
> + igt_slow_combinatorial();
> suspend_subtest(&t);
> + }
> TEST_MODE_ITER_END
>
> igt_fixture
> --
> 2.6.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

--
Paulo Zanoni