[igt-dev] [PATCH i-g-t] tests/kms_flip_tiling: Fix clean up when subtest fails
Petri Latvala
petri.latvala at intel.com
Wed May 19 08:24:14 UTC 2021
On Tue, May 18, 2021 at 10:32:19PM +0530, Jeevan B wrote:
> If a subtest fails during commit for some reason on the first connector,
> all the subsequent subtests on the same pipe fails.
> This is because the pipe is still connected to the previous connector
> as the cleanup part will have been skipped during the failed subtest.
>
> To fix this, moved the cleanup part to a separate function and calling it
> outside the subtest scope.
>
> Signed-off-by: Jeevan B <jeevan.b at intel.com>
> ---
> tests/kms_flip_tiling.c | 31 +++++++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/tests/kms_flip_tiling.c b/tests/kms_flip_tiling.c
> index 09e99580..36f69ffd 100644
> --- a/tests/kms_flip_tiling.c
> +++ b/tests/kms_flip_tiling.c
> @@ -39,6 +39,7 @@ typedef struct {
> igt_display_t display;
> int gen;
> uint32_t testformat;
> + struct igt_fb fb[2];
> } data_t;
>
> static igt_pipe_crc_t *_pipe_crc;
> @@ -69,7 +70,6 @@ test_flip_tiling(data_t *data, enum pipe pipe, igt_output_t *output, uint64_t ti
> {
> drmModeModeInfo *mode;
> igt_plane_t *primary;
> - struct igt_fb fb[2];
> igt_pipe_crc_t *pipe_crc;
> igt_crc_t reference_crc, crc;
> int fb_id, ret, width;
> @@ -105,27 +105,27 @@ test_flip_tiling(data_t *data, enum pipe pipe, igt_output_t *output, uint64_t ti
>
> fb_id = igt_create_pattern_fb(data->drm_fd, width, mode->vdisplay,
> data->testformat, tiling[0],
> - &fb[0]);
> + &data->fb[0]);
> igt_assert(fb_id);
>
> /* Second fb has different background so CRC does not match. */
> fb_id = igt_create_color_pattern_fb(data->drm_fd, width, mode->vdisplay,
> data->testformat, tiling[1],
> - 0.5, 0.5, 0.5, &fb[1]);
> + 0.5, 0.5, 0.5, &data->fb[1]);
> igt_assert(fb_id);
>
> /* Set the crtc and generate a reference CRC. */
> - igt_plane_set_fb(primary, &fb[1]);
> + igt_plane_set_fb(primary, &data->fb[1]);
> igt_display_commit(&data->display);
> igt_pipe_crc_collect_crc(pipe_crc, &reference_crc);
>
> /* Commit the first fb. */
> - igt_plane_set_fb(primary, &fb[0]);
> + igt_plane_set_fb(primary, &data->fb[0]);
> igt_display_commit(&data->display);
>
> /* Flip to the second fb. */
> ret = drmModePageFlip(data->drm_fd, output->config.crtc->crtc_id,
> - fb[1].fb_id, DRM_MODE_PAGE_FLIP_EVENT, NULL);
> + data->fb[1].fb_id, DRM_MODE_PAGE_FLIP_EVENT, NULL);
> /*
> * Page flip should work but some transitions may be temporarily
> * on some kernels.
> @@ -137,6 +137,12 @@ test_flip_tiling(data_t *data, enum pipe pipe, igt_output_t *output, uint64_t ti
> /* Get a crc and compare with the reference. */
> igt_pipe_crc_collect_crc(pipe_crc, &crc);
> igt_assert_crc_equal(&reference_crc, &crc);
> +}
> +
> +static void test_cleanup(data_t *data, enum pipe pipe, igt_output_t *output)
> +{
> + igt_plane_t *primary;
> + primary = igt_output_get_plane(output, 0);
>
> /* Clean up. */
> igt_plane_set_fb(primary, NULL);
> @@ -144,8 +150,8 @@ test_flip_tiling(data_t *data, enum pipe pipe, igt_output_t *output, uint64_t ti
> igt_output_set_pipe(output, PIPE_ANY);
> igt_display_commit(&data->display);
>
> - igt_remove_fb(data->drm_fd, &fb[0]);
> - igt_remove_fb(data->drm_fd, &fb[1]);
> + igt_remove_fb(data->drm_fd, &data->fb[0]);
> + igt_remove_fb(data->drm_fd, &data->fb[1]);
> }
>
> static data_t data;
> @@ -185,6 +191,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -204,6 +211,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -223,6 +231,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -246,6 +255,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -265,6 +275,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -284,6 +295,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -307,6 +319,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -326,6 +339,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
> }
>
> @@ -345,6 +359,7 @@ igt_main
> for_each_pipe_with_valid_output(&data.display, pipe, output) {
> igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> test_flip_tiling(&data, pipe, output, tiling);
> + test_cleanup(&data, pipe, output);
> }
Check the indentation on these. This indentation makes it look like
test_cleanup call is inside igt_dynamic, but it isn't.
--
Petri Latvala
More information about the igt-dev
mailing list