[igt-dev] [PATCH i-g-t v6] tests/kms_atomic_transition:reduce execution time

Shankar, Uma uma.shankar at intel.com
Thu Jan 7 12:06:32 UTC 2021



> -----Original Message-----
> From: Nidhi Gupta <nidhi1.gupta at intel.com>
> Sent: Tuesday, January 5, 2021 4:39 PM
> To: igt-dev at lists.freedesktop.org
> Cc: B S, Karthik <karthik.b.s at intel.com>; Shankar, Uma
> <uma.shankar at intel.com>; Gupta, Nidhi1 <nidhi1.gupta at intel.com>
> Subject: [PATCH i-g-t v6] tests/kms_atomic_transition:reduce execution time
> 
> v1: All the subtests are using for_each_pipe_with_valid_output function which

No need to say v1, instead describe what this change is for. Add any timing benefits
wrt execution time.

> will execute on all the possible combination of pipe and output to reduce the
> execution time replaced the function with for_each_pipe_with_single_output
> this will loop over all the pipes but at most once.
> 
> v2: kms_atomic_transition test is taking minimum of 69.5s time to execute on CI.
> To reduce the execution time this patch will add the change which will run the
> test on 1 HDR plane, 1 SDR UV plane, 1 SDR Y plane and skip the rest of the
> planes.
> 
> v3: combined v1 and v2 in one patch.
> 
> v4: -restricted execution of all the subtests to
>     2 pipes. (Uma)
>     -Modified skip_plane() function. (Uma)
> 
> v5: -added a extended flag, if it is set but the user

s/but/by

>     test will be executed on all the pipes otherwise will be
>     executed only on 2 pipes. (Karthik)
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta at intel.com>
> ---
>  tests/kms_atomic_transition.c | 136 +++++++++++++++++++++++++++-------
>  1 file changed, 110 insertions(+), 26 deletions(-)
> 
> diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c index
> 02206f0a..1d0faa67 100644
> --- a/tests/kms_atomic_transition.c
> +++ b/tests/kms_atomic_transition.c
> @@ -50,6 +50,10 @@ int *timeline;
>  pthread_t *thread;
>  int *seqno;
> 
> +typedef struct {
> +	bool extended;
> +} data_t;

I think its good to add igt_display_t *display in this structure itself.

>  static void
>  run_primary_test(igt_display_t *display, enum pipe pipe, igt_output_t *output)
> { @@ -120,8 +124,35 @@ static void configure_fencing(igt_plane_t *plane)
>  	igt_assert_eq(ret, 0);
>  }
> 
> +static bool skip_plane(igt_display_t *display, data_t *data,
> +igt_plane_t *plane) 

If you do the above, then pass just the data_t and display will come along with it.
Do it universally in the patch at all places.

{
> +	int index = plane->index;
> +
> +	if (data->extended)
> +		return false;
> +
> +	if (!is_i915_device(display->drm_fd))
> +		return false;
> +
> +	if (plane->type == DRM_PLANE_TYPE_CURSOR)
> +		return false;
> +
> +	if (intel_gen(intel_get_drm_devid(display->drm_fd)) < 11)
> +		return false;
> +
> +	/*
> +	 * Test 1 HDR plane, 1 SDR UV plane, 1 SDR Y plane.
> +	 *
> +	 * Kernel registers planes in the hardware Z order:
> +	 * 0,1,2 HDR planes
> +	 * 3,4 SDR UV planes
> +	 * 5,6 SDR Y planes
> +	 */
> +	return index != 0 && index != 3 && index != 5; }
> +
>  static int
> -wm_setup_plane(igt_display_t *display, enum pipe pipe,
> +wm_setup_plane(igt_display_t *display, data_t *data, enum pipe pipe,
>  	       uint32_t mask, struct plane_parms *parms, bool fencing)  {
>  	igt_plane_t *plane;
> @@ -135,6 +166,9 @@ wm_setup_plane(igt_display_t *display, enum pipe pipe,
>  	for_each_plane_on_pipe(display, pipe, plane) {
>  		int i = plane->index;
> 
> +		if (skip_plane(display, data, plane))
> +			continue;
> +
>  		if (!mask || !(parms[i].mask & mask)) {
>  			if (plane->values[IGT_PLANE_FB_ID]) {
>  				igt_plane_set_fb(plane, NULL);
> @@ -205,7 +239,8 @@ static void set_sprite_wh(igt_display_t *display, enum
> pipe pipe,  #define is_atomic_check_plane_size_errno(errno) \
>  		(errno == -EINVAL)
> 
> -static void setup_parms(igt_display_t *display, enum pipe pipe,
> +static void setup_parms(igt_display_t *display, data_t *data,
> +			enum pipe pipe,
>  			const drmModeModeInfo *mode,
>  			struct igt_fb *primary_fb,
>  			struct igt_fb *argb_fb,
> @@ -298,7 +333,7 @@ static void setup_parms(igt_display_t *display, enum
> pipe pipe,
>  		set_sprite_wh(display, pipe, parms, sprite_fb,
>  			      alpha, sprite_width, sprite_height);
> 
> -		wm_setup_plane(display, pipe, (1 << n_planes) - 1, parms, false);
> +		wm_setup_plane(display, data, pipe, (1 << n_planes) - 1, parms,
> +false);
>  		ret = igt_display_try_commit_atomic(display,
> DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET,
> NULL);
>  		igt_assert(!is_atomic_check_failure_errno(ret));
> 
> @@ -437,7 +472,7 @@ static void wait_for_transition(igt_display_t *display,
> enum pipe pipe, bool non
>   * so test this and make sure it works.
>   */
>  static void
> -run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t
> *output,
> +run_transition_test(igt_display_t *display, data_t *data, enum pipe
> +pipe, igt_output_t *output,
>  		enum transition_type type, bool nonblocking, bool fencing)  {
>  	struct igt_fb fb, argb_fb, sprite_fb;
> @@ -470,7 +505,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
> 
>  	igt_output_set_pipe(output, pipe);
> 
> -	wm_setup_plane(display, pipe, 0, NULL, false);
> +	wm_setup_plane(display, data, pipe, 0, NULL, false);
> 
>  	if (flags & DRM_MODE_ATOMIC_ALLOW_MODESET) {
>  		igt_output_set_pipe(output, PIPE_NONE); @@ -482,7 +517,7 @@
> run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
> 
>  	igt_display_commit2(display, COMMIT_ATOMIC);
> 
> -	setup_parms(display, pipe, mode, &fb, &argb_fb, &sprite_fb, parms,
> &iter_max);
> +	setup_parms(display, data, pipe, mode, &fb, &argb_fb, &sprite_fb,
> +parms, &iter_max);
> 
>  	/*
>  	 * In some configurations the tests may not run to completion with all
> @@ -490,7 +525,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
>  	 * planes to fix this
>  	 */
>  	while (1) {
> -		wm_setup_plane(display, pipe, iter_max - 1, parms, false);
> +		wm_setup_plane(display, data, pipe, iter_max - 1, parms, false);
> 
>  		if (fencing)
>  			igt_pipe_request_out_fence(pipe_obj);
> @@ -524,7 +559,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
>  	if (type == TRANSITION_AFTER_FREE) {
>  		int fence_fd = -1;
> 
> -		wm_setup_plane(display, pipe, 0, parms, fencing);
> +		wm_setup_plane(display, data, pipe, 0, parms, fencing);
> 
>  		atomic_commit(display, pipe, flags, (void *)(unsigned long)0,
> fencing);
>  		if (fencing) {
> @@ -560,7 +595,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
> 
>  		igt_output_set_pipe(output, pipe);
> 
> -		if (!wm_setup_plane(display, pipe, i, parms, fencing))
> +		if (!wm_setup_plane(display, data, pipe, i, parms, fencing))
>  			continue;
> 
>  		atomic_commit(display, pipe, flags, (void *)(unsigned long)i,
> fencing); @@ -569,7 +604,7 @@ run_transition_test(igt_display_t *display,
> enum pipe pipe, igt_output_t *output
>  		if (type == TRANSITION_MODESET_DISABLE) {
>  			igt_output_set_pipe(output, PIPE_NONE);
> 
> -			if (!wm_setup_plane(display, pipe, 0, parms, fencing))
> +			if (!wm_setup_plane(display, data, pipe, 0, parms,
> fencing))
>  				continue;
> 
>  			atomic_commit(display, pipe, flags, (void *) 0UL, fencing);
> @@ -586,7 +621,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
>  				    n_enable_planes < pipe_obj->n_planes)
>  					continue;
> 
> -				if (!wm_setup_plane(display, pipe, j, parms,
> fencing))
> +				if (!wm_setup_plane(display, data, pipe, j, parms,
> fencing))
>  					continue;
> 
>  				if (type >= TRANSITION_MODESET)
> @@ -595,7 +630,7 @@ run_transition_test(igt_display_t *display, enum pipe
> pipe, igt_output_t *output
>  				atomic_commit(display, pipe, flags, (void
> *)(unsigned long) j, fencing);
>  				wait_for_transition(display, pipe, nonblocking,
> fencing);
> 
> -				if (!wm_setup_plane(display, pipe, i, parms,
> fencing))
> +				if (!wm_setup_plane(display, data, pipe, i, parms,
> fencing))
>  					continue;
> 
>  				if (type >= TRANSITION_MODESET)
> @@ -913,7 +948,30 @@ static bool output_is_internal_panel(igt_output_t
> *output)
>  	}
>  }
> 
> -igt_main
> +static int opt_handler(int opt, int opt_index, void *_data) {
> +	data_t *data = _data;
> +
> +	switch (opt) {
> +	case 'e':
> +		data->extended = true;
> +		break;
> +	}
> +
> +	return IGT_OPT_HANDLER_SUCCESS;
> +}
> +
> +static const struct option long_opts[] = {
> +	{ .name = "extended", .has_arg = false, .val = 'e', },
> +	{}
> +};
> +
> +static const char help_str[] =
> +	"  --extended\t\tRun the extended tests\n";
> +
> +static data_t data;
> +
> +igt_main_args("", long_opts, help_str, opt_handler, &data)
>  {
>  	igt_display_t display;
>  	igt_output_t *output;
> @@ -935,48 +993,63 @@ igt_main
>  	}
> 
>  	igt_subtest("plane-primary-toggle-with-vblank-wait")
> -		for_each_pipe_with_valid_output(&display, pipe, output)
> +		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			run_primary_test(&display, pipe, output);
> +		}
> 
>  	igt_subtest_with_dynamic("plane-all-transition") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_PLANES, false, false);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_PLANES, false, false);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-all-transition-fencing") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_PLANES, false, true);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_PLANES, false, true);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-all-transition-nonblocking") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_PLANES, true, false);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_PLANES, true, false);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-all-transition-nonblocking-fencing") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_PLANES, true, true);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_PLANES, true, true);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-use-after-nonblocking-unbind") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_AFTER_FREE, true, false);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_AFTER_FREE, true, false);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-use-after-nonblocking-unbind-
> fencing") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_AFTER_FREE, true, true);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_AFTER_FREE, true, true);
>  		}
>  	}
> 
> @@ -987,45 +1060,56 @@ igt_main
>  	 */
>  	igt_subtest_with_dynamic("plane-all-modeset-transition")
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			if (output_is_internal_panel(output))
>  				continue;
> 
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_MODESET, false, false);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_MODESET, false, false);
>  		}
> 
>  	igt_subtest_with_dynamic("plane-all-modeset-transition-fencing")
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			if (output_is_internal_panel(output))
>  				continue;
> 
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_MODESET, false, true);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_MODESET, false, true);
>  		}
> 
>  	igt_subtest_with_dynamic("plane-all-modeset-transition-internal-
> panels") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			if (!output_is_internal_panel(output))
>  				continue;
> 
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_MODESET_FAST, false, false);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_MODESET_FAST, false, false);
>  		}
>  	}
> 
>  	igt_subtest_with_dynamic("plane-all-modeset-transition-fencing-
> internal-panels") {
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
>  			if (!output_is_internal_panel(output))
>  				continue;
> 
>  			igt_dynamic_f("%s-pipe-%s", igt_output_name(output),
> kmstest_pipe_name(pipe))
> -				run_transition_test(&display, pipe, output,
> TRANSITION_MODESET_FAST, false, true);
> +				run_transition_test(&display, &data, pipe,
> output,
> +TRANSITION_MODESET_FAST, false, true);
>  		}
>  	}
> 
>  	igt_subtest("plane-toggle-modeset-transition")
> -		for_each_pipe_with_valid_output(&display, pipe, output)
> -			run_transition_test(&display, pipe, output,
> TRANSITION_MODESET_DISABLE, false, false);
> +		for_each_pipe_with_valid_output(&display, pipe, output) {
> +			if (pipe >= 2 && !data.extended)
> +				break;
> +			run_transition_test(&display, &data, pipe, output,
> TRANSITION_MODESET_DISABLE, false, false);
> +		}
> 
>  	igt_subtest_with_dynamic("modeset-transition") {
>  		for (i = 1; i <= count; i++) {
> --
> 2.26.2



More information about the igt-dev mailing list