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

drm/tests: hdmi: Handle drm_kunit_helper_enable_crtc_connector() returning EDEADLK

Fedora/CentOS/RHEL CI is reporting intermittent failures while running
the KUnit tests present in drm_hdmi_state_helper_test.c [1].

While the specific test causing the failure change between runs, all of
them are caused by drm_kunit_helper_enable_crtc_connector() returning
-EDEADLK. The error trace always follow this structure:

# <test name>: ASSERTION FAILED at
# drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c:<line>
Expected ret == 0, but
ret == -35 (0xffffffffffffffdd)

As documented, if the drm_kunit_helper_enable_crtc_connector() function
returns -EDEADLK (-35), the entire atomic sequence must be restarted.

Handle this error code for all function calls.

Closes: https://datawarehouse.cki-project.org/issue/4039 [1]
Fixes: 6a5c0ad7e08e ("drm/tests: hdmi_state_helpers: Switch to new helper")
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
Link: https://patch.msgid.link/20251104102258.10026-1-jose.exposito89@gmail.com

+143
+143
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
··· 257 257 258 258 drm_modeset_acquire_init(&ctx, 0); 259 259 260 + retry_conn_enable: 260 261 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 261 262 crtc, conn, 262 263 preferred, 263 264 &ctx); 265 + if (ret == -EDEADLK) { 266 + ret = drm_modeset_backoff(&ctx); 267 + if (!ret) 268 + goto retry_conn_enable; 269 + } 264 270 KUNIT_ASSERT_EQ(test, ret, 0); 265 271 266 272 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 332 326 333 327 drm_modeset_acquire_init(&ctx, 0); 334 328 329 + retry_conn_enable: 335 330 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 336 331 crtc, conn, 337 332 preferred, 338 333 &ctx); 334 + if (ret == -EDEADLK) { 335 + ret = drm_modeset_backoff(&ctx); 336 + if (!ret) 337 + goto retry_conn_enable; 338 + } 339 339 KUNIT_ASSERT_EQ(test, ret, 0); 340 340 341 341 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 409 397 410 398 drm_modeset_acquire_init(&ctx, 0); 411 399 400 + retry_conn_enable: 412 401 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 413 402 crtc, conn, 414 403 preferred, 415 404 &ctx); 405 + if (ret == -EDEADLK) { 406 + ret = drm_modeset_backoff(&ctx); 407 + if (!ret) 408 + goto retry_conn_enable; 409 + } 416 410 KUNIT_ASSERT_EQ(test, ret, 0); 417 411 418 412 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 475 457 KUNIT_ASSERT_NOT_NULL(test, mode); 476 458 477 459 crtc = priv->crtc; 460 + 461 + retry_conn_enable: 478 462 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 479 463 crtc, conn, 480 464 mode, 481 465 &ctx); 466 + if (ret == -EDEADLK) { 467 + ret = drm_modeset_backoff(&ctx); 468 + if (!ret) 469 + goto retry_conn_enable; 470 + } 482 471 KUNIT_ASSERT_EQ(test, ret, 0); 483 472 484 473 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 543 518 544 519 drm_modeset_acquire_init(&ctx, 0); 545 520 521 + retry_conn_enable: 546 522 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 547 523 crtc, conn, 548 524 preferred, 549 525 &ctx); 526 + if (ret == -EDEADLK) { 527 + ret = drm_modeset_backoff(&ctx); 528 + if (!ret) 529 + goto retry_conn_enable; 530 + } 550 531 KUNIT_ASSERT_EQ(test, ret, 0); 551 532 552 533 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 611 580 KUNIT_ASSERT_NOT_NULL(test, mode); 612 581 613 582 crtc = priv->crtc; 583 + 584 + retry_conn_enable: 614 585 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 615 586 crtc, conn, 616 587 mode, 617 588 &ctx); 589 + if (ret == -EDEADLK) { 590 + ret = drm_modeset_backoff(&ctx); 591 + if (!ret) 592 + goto retry_conn_enable; 593 + } 618 594 KUNIT_ASSERT_EQ(test, ret, 0); 619 595 620 596 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 681 643 682 644 drm_modeset_acquire_init(&ctx, 0); 683 645 646 + retry_conn_enable: 684 647 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 685 648 crtc, conn, 686 649 preferred, 687 650 &ctx); 651 + if (ret == -EDEADLK) { 652 + ret = drm_modeset_backoff(&ctx); 653 + if (!ret) 654 + goto retry_conn_enable; 655 + } 688 656 KUNIT_ASSERT_EQ(test, ret, 0); 689 657 690 658 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 749 705 KUNIT_ASSERT_NOT_NULL(test, mode); 750 706 751 707 crtc = priv->crtc; 708 + 709 + retry_conn_enable: 752 710 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 753 711 crtc, conn, 754 712 mode, 755 713 &ctx); 714 + if (ret == -EDEADLK) { 715 + ret = drm_modeset_backoff(&ctx); 716 + if (!ret) 717 + goto retry_conn_enable; 718 + } 756 719 KUNIT_ASSERT_EQ(test, ret, 0); 757 720 758 721 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 921 870 922 871 drm_modeset_acquire_init(&ctx, 0); 923 872 873 + retry_conn_enable: 924 874 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 925 875 crtc, conn, 926 876 preferred, 927 877 &ctx); 878 + if (ret == -EDEADLK) { 879 + ret = drm_modeset_backoff(&ctx); 880 + if (!ret) 881 + goto retry_conn_enable; 882 + } 928 883 KUNIT_ASSERT_EQ(test, ret, 0); 929 884 930 885 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 1003 946 1004 947 drm_modeset_acquire_init(&ctx, 0); 1005 948 949 + retry_conn_enable: 1006 950 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1007 951 crtc, conn, 1008 952 preferred, 1009 953 &ctx); 954 + if (ret == -EDEADLK) { 955 + ret = drm_modeset_backoff(&ctx); 956 + if (!ret) 957 + goto retry_conn_enable; 958 + } 1010 959 KUNIT_ASSERT_EQ(test, ret, 0); 1011 960 1012 961 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); ··· 1085 1022 1086 1023 drm_modeset_acquire_init(&ctx, 0); 1087 1024 1025 + retry_conn_enable: 1088 1026 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1089 1027 crtc, conn, 1090 1028 preferred, 1091 1029 &ctx); 1030 + if (ret == -EDEADLK) { 1031 + ret = drm_modeset_backoff(&ctx); 1032 + if (!ret) 1033 + goto retry_conn_enable; 1034 + } 1092 1035 KUNIT_ASSERT_EQ(test, ret, 0); 1093 1036 1094 1037 conn_state = conn->state; ··· 1138 1069 1139 1070 drm_modeset_acquire_init(&ctx, 0); 1140 1071 1072 + retry_conn_enable: 1141 1073 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1142 1074 crtc, conn, 1143 1075 preferred, 1144 1076 &ctx); 1077 + if (ret == -EDEADLK) { 1078 + ret = drm_modeset_backoff(&ctx); 1079 + if (!ret) 1080 + goto retry_conn_enable; 1081 + } 1145 1082 KUNIT_ASSERT_EQ(test, ret, 0); 1146 1083 1147 1084 conn_state = conn->state; ··· 1193 1118 1194 1119 drm_modeset_acquire_init(&ctx, 0); 1195 1120 1121 + retry_conn_enable: 1196 1122 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1197 1123 crtc, conn, 1198 1124 preferred, 1199 1125 &ctx); 1126 + if (ret == -EDEADLK) { 1127 + ret = drm_modeset_backoff(&ctx); 1128 + if (!ret) 1129 + goto retry_conn_enable; 1130 + } 1200 1131 KUNIT_ASSERT_EQ(test, ret, 0); 1201 1132 1202 1133 conn_state = conn->state; ··· 1248 1167 1249 1168 drm_modeset_acquire_init(&ctx, 0); 1250 1169 1170 + retry_conn_enable: 1251 1171 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1252 1172 crtc, conn, 1253 1173 preferred, 1254 1174 &ctx); 1175 + if (ret == -EDEADLK) { 1176 + ret = drm_modeset_backoff(&ctx); 1177 + if (!ret) 1178 + goto retry_conn_enable; 1179 + } 1255 1180 KUNIT_ASSERT_EQ(test, ret, 0); 1256 1181 1257 1182 conn_state = conn->state; ··· 1305 1218 1306 1219 drm_modeset_acquire_init(&ctx, 0); 1307 1220 1221 + retry_conn_enable: 1308 1222 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1309 1223 crtc, conn, 1310 1224 preferred, 1311 1225 &ctx); 1226 + if (ret == -EDEADLK) { 1227 + ret = drm_modeset_backoff(&ctx); 1228 + if (!ret) 1229 + goto retry_conn_enable; 1230 + } 1312 1231 KUNIT_ASSERT_EQ(test, ret, 0); 1313 1232 1314 1233 /* You shouldn't be doing that at home. */ ··· 1385 1292 1386 1293 drm_modeset_acquire_init(&ctx, 0); 1387 1294 1295 + retry_conn_enable: 1388 1296 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1389 1297 crtc, conn, 1390 1298 preferred, 1391 1299 &ctx); 1300 + if (ret == -EDEADLK) { 1301 + ret = drm_modeset_backoff(&ctx); 1302 + if (!ret) 1303 + goto retry_conn_enable; 1304 + } 1392 1305 KUNIT_EXPECT_EQ(test, ret, 0); 1393 1306 1394 1307 conn_state = conn->state; ··· 1539 1440 1540 1441 drm_modeset_acquire_init(&ctx, 0); 1541 1442 1443 + retry_conn_enable: 1542 1444 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1543 1445 crtc, conn, 1544 1446 preferred, 1545 1447 &ctx); 1448 + if (ret == -EDEADLK) { 1449 + ret = drm_modeset_backoff(&ctx); 1450 + if (!ret) 1451 + goto retry_conn_enable; 1452 + } 1546 1453 KUNIT_EXPECT_EQ(test, ret, 0); 1547 1454 1548 1455 conn_state = conn->state; ··· 1774 1669 drm_modeset_acquire_init(&ctx, 0); 1775 1670 1776 1671 crtc = priv->crtc; 1672 + 1673 + retry_conn_enable: 1777 1674 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1778 1675 crtc, conn, 1779 1676 mode, 1780 1677 &ctx); 1678 + if (ret == -EDEADLK) { 1679 + ret = drm_modeset_backoff(&ctx); 1680 + if (!ret) 1681 + goto retry_conn_enable; 1682 + } 1781 1683 KUNIT_EXPECT_EQ(test, ret, 0); 1782 1684 1783 1685 conn_state = conn->state; ··· 1848 1736 1849 1737 drm_modeset_acquire_init(&ctx, 0); 1850 1738 1739 + retry_conn_enable: 1851 1740 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1852 1741 crtc, conn, 1853 1742 preferred, 1854 1743 &ctx); 1744 + if (ret == -EDEADLK) { 1745 + ret = drm_modeset_backoff(&ctx); 1746 + if (!ret) 1747 + goto retry_conn_enable; 1748 + } 1855 1749 KUNIT_EXPECT_EQ(test, ret, 0); 1856 1750 1857 1751 conn_state = conn->state; ··· 1923 1805 1924 1806 drm_modeset_acquire_init(&ctx, 0); 1925 1807 1808 + retry_conn_enable: 1926 1809 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1927 1810 crtc, conn, 1928 1811 preferred, 1929 1812 &ctx); 1813 + if (ret == -EDEADLK) { 1814 + ret = drm_modeset_backoff(&ctx); 1815 + if (!ret) 1816 + goto retry_conn_enable; 1817 + } 1930 1818 KUNIT_EXPECT_EQ(test, ret, 0); 1931 1819 1932 1820 conn_state = conn->state; ··· 1989 1865 1990 1866 drm_modeset_acquire_init(&ctx, 0); 1991 1867 1868 + retry_conn_enable: 1992 1869 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 1993 1870 crtc, conn, 1994 1871 preferred, 1995 1872 &ctx); 1873 + if (ret == -EDEADLK) { 1874 + ret = drm_modeset_backoff(&ctx); 1875 + if (!ret) 1876 + goto retry_conn_enable; 1877 + } 1996 1878 KUNIT_EXPECT_EQ(test, ret, 0); 1997 1879 1998 1880 conn_state = conn->state; ··· 2057 1927 2058 1928 drm_modeset_acquire_init(&ctx, 0); 2059 1929 1930 + retry_conn_enable: 2060 1931 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 2061 1932 crtc, conn, 2062 1933 preferred, 2063 1934 &ctx); 1935 + if (ret == -EDEADLK) { 1936 + ret = drm_modeset_backoff(&ctx); 1937 + if (!ret) 1938 + goto retry_conn_enable; 1939 + } 2064 1940 KUNIT_EXPECT_EQ(test, ret, 0); 2065 1941 2066 1942 conn_state = conn->state; ··· 2106 1970 2107 1971 drm = &priv->drm; 2108 1972 crtc = priv->crtc; 1973 + 1974 + retry_conn_enable: 2109 1975 ret = drm_kunit_helper_enable_crtc_connector(test, drm, 2110 1976 crtc, conn, 2111 1977 preferred, 2112 1978 &ctx); 1979 + if (ret == -EDEADLK) { 1980 + ret = drm_modeset_backoff(&ctx); 1981 + if (!ret) 1982 + goto retry_conn_enable; 1983 + } 2113 1984 KUNIT_ASSERT_EQ(test, ret, 0); 2114 1985 2115 1986 state = drm_kunit_helper_atomic_state_alloc(test, drm, &ctx);