Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tests: Handle EDEADLK in set_up_atomic_state()

Fedora/CentOS/RHEL CI is reporting intermittent failures while running
the drm_validate_modeset test [1]:

# drm_test_check_connector_changed_modeset: EXPECTATION FAILED at
# drivers/gpu/drm/tests/drm_atomic_state_test.c:162
Expected ret == 0, but
ret == -35 (0xffffffffffffffdd)

Change the set_up_atomic_state() helper function to return on error and
restart the atomic sequence when the returned error is EDEADLK.

[1] https://s3.amazonaws.com/arr-cki-prod-trusted-artifacts/trusted-artifacts/2106744096/test_x86_64/11762450343/artifacts/jobwatch/logs/recipes/19797909/tasks/204139142/results/945095586/logs/dmesg.log

Fixes: 73d934d7b6e3 ("drm/tests: Add test for drm_atomic_helper_commit_modeset_disables()")
Closes: https://datawarehouse.cki-project.org/issue/4004
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Link: https://patch.msgid.link/20251104102535.12212-2-jose.exposito89@gmail.com

+22 -5
+22 -5
drivers/gpu/drm/tests/drm_atomic_state_test.c
··· 156 156 157 157 if (connector) { 158 158 conn_state = drm_atomic_get_connector_state(state, connector); 159 - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); 159 + if (IS_ERR(conn_state)) 160 + return PTR_ERR(conn_state); 160 161 161 162 ret = drm_atomic_set_crtc_for_connector(conn_state, crtc); 162 - KUNIT_EXPECT_EQ(test, ret, 0); 163 + if (ret) 164 + return ret; 163 165 } 164 166 165 167 crtc_state = drm_atomic_get_crtc_state(state, crtc); 166 - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); 168 + if (IS_ERR(crtc_state)) 169 + return PTR_ERR(crtc_state); 167 170 168 171 ret = drm_atomic_set_mode_for_crtc(crtc_state, &drm_atomic_test_mode); 169 - KUNIT_EXPECT_EQ(test, ret, 0); 172 + if (ret) 173 + return ret; 170 174 171 175 crtc_state->enable = true; 172 176 crtc_state->active = true; 173 177 174 178 if (connector) { 175 179 ret = drm_atomic_commit(state); 176 - KUNIT_ASSERT_EQ(test, ret, 0); 180 + if (ret) 181 + return ret; 177 182 } else { 178 183 // dummy connector mask 179 184 crtc_state->connector_mask = DRM_TEST_CONN_0; ··· 211 206 drm_modeset_acquire_init(&ctx, 0); 212 207 213 208 // first modeset to enable 209 + retry_set_up: 214 210 ret = set_up_atomic_state(test, priv, old_conn, &ctx); 211 + if (ret == -EDEADLK) { 212 + ret = drm_modeset_backoff(&ctx); 213 + if (!ret) 214 + goto retry_set_up; 215 + } 215 216 KUNIT_ASSERT_EQ(test, ret, 0); 216 217 217 218 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 288 277 289 278 drm_modeset_acquire_init(&ctx, 0); 290 279 280 + retry_set_up: 291 281 ret = set_up_atomic_state(test, priv, NULL, &ctx); 282 + if (ret == -EDEADLK) { 283 + ret = drm_modeset_backoff(&ctx); 284 + if (!ret) 285 + goto retry_set_up; 286 + } 292 287 KUNIT_ASSERT_EQ(test, ret, 0); 293 288 294 289 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx);