The positive WRITEBACK_FB_ID test submits a writeback to the common input
framebuffer without requesting or waiting for its completion fence. A
blocking atomic commit does not imply that writeback has finished.

The following pixel-output test fills the same buffer with its reference
color. The earlier writeback can still be modifying it, leaving a mixture
of the old and new contents and causing intermittent checksum failures.
On ARM64 VKMS, a diagnostic run observed the prior fence still unsignalled
and a black row in both the input and the captured output after the input
had been filled red.

Request a fence for the successful FB ID writeback and wait for it before
returning. Only require the returned fence descriptor to be -1 when the
commit fails, so the shared commit helper also accepts this successful
fenced operation. Keep all invalid-parameter checks intact.

Signed-off-by: Aditya Tipre <[email protected]>
---
New prerequisite in v3:
- Wait for the existing valid FB ID writeback before its target buffer is
  reused as input by the next subtest.

A diagnostic run observed the prior fence still unsignalled and a row of
old black pixels replacing red input pixels. Waiting for the fence removes
this race. The standalone fix passes the four applicable existing subtests
on unfixed and fixed VKMS kernels with one and two CPUs; both XRGB2101010
cases skip.

 tests/kms_writeback.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tests/kms_writeback.c b/tests/kms_writeback.c
index 7c30e8e..550d603 100644
--- a/tests/kms_writeback.c
+++ b/tests/kms_writeback.c
@@ -228,7 +228,7 @@ static int do_writeback_test(igt_output_t *output, uint32_t 
fb_id,
 
        ret = igt_display_try_commit_atomic(display, 
DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
 
-       if (ptr_valid)
+       if (ptr_valid && ret)
                igt_assert(*out_fence_ptr == -1);
 
        /* WRITEBACK_FB_ID must always read as zero */
@@ -288,8 +288,12 @@ static void writeback_fb_id(igt_output_t *output, igt_fb_t 
*valid_fb, igt_fb_t *
        igt_assert_eq(ret, 0);
 
        /* Valid output buffer */
-       ret = do_writeback_test(output, valid_fb->fb_id, NULL, false);
+       ret = do_writeback_test(output, valid_fb->fb_id,
+                               &output->writeback_out_fence_fd, true);
        igt_assert_eq(ret, 0);
+
+       /* The next subtest may reuse this buffer as input. */
+       igt_get_and_wait_out_fence(output);
 }
 
 static void fill_fb(igt_fb_t *fb, uint32_t pixel)

base-commit: 454657e58fbcfd6fa8a9db0830aa1652fe6364c2
-- 
2.50.1 (Apple Git-155)

Reply via email to