From nobody Thu Apr 10 18:56:30 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2EB5F2505BF for ; Thu, 3 Apr 2025 13:33:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687226; cv=none; b=l2BG6tI8ZgJm80fazyqPPJWMkZ3/4lvVHZ1M7tLWVJ1PWUUtKltEa/DtNnzZN8iKbvO2ZVPSv3oRgCP3sJaiTuBIJV99fZWNRWElNSSEGOZwpAqWP3fkX+HXaX9SuBK5+wLxxHVTJxzy+fyVSdMMehgn7n1n0Nn7yNsoRyJySjo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687226; c=relaxed/simple; bh=nMRbYAhzi3enpxzVWvpdbPA24kzrQi4IdGrQ69iIiXs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UN2TjvRQebmBt+IwT57djsekbDIR7siAH8tYahNuV/9xnbOvgPXwzm8bkCDsr4F6M/4LKX40T2LPq5wElO5rKs45lZaFkB2u3mCTZx0UTJoLsQONp7h+w4sNodNZeJEjJ/9zyeB77x0UDKtzyFRmLMpr7+ZgoOFf3Ike2ZMitOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Uh8OhBy+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Uh8OhBy+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 128E8C4CEED; Thu, 3 Apr 2025 13:33:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743687225; bh=nMRbYAhzi3enpxzVWvpdbPA24kzrQi4IdGrQ69iIiXs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Uh8OhBy+yWs2hAhTylquklZOGQ/W7Y3EUaHYY7PMf1SQXvYb5xu9QoLv8M18gj+cZ OfM6JLRFp/uU73pr7grNCuVElwaT4FcL4Vitexze99M9Z1/62v9U4hgpeyTRBSmoaZ l4Wlj52mQ/zjpefezL43jtD95O5St4+3Rqzk/UXXJD9mNmz6BMKEue2tpki7o3IxIQ xD+pephrLBVBfQzGpp5WboeElWrDEkSrbDAVSlqHCdAk0ouNOsyNWP1K7XFITsiRhr iId554RZ+VEE1QLqrY2eNDsloOUw39r90iYb5zxmxB9NhhpZSYGhEzzwv3CsXTqdtE Z2r1C2mtWWGaA== From: Maxime Ripard Date: Thu, 03 Apr 2025 15:33:30 +0200 Subject: [PATCH v2 1/4] drm/vc4: tests: Use return instead of assert Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250403-drm-vc4-kunit-failures-v2-1-e09195cc8840@kernel.org> References: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> In-Reply-To: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> To: Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3363; i=mripard@kernel.org; h=from:subject:message-id; bh=nMRbYAhzi3enpxzVWvpdbPA24kzrQi4IdGrQ69iIiXs=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDOnv+gz3h1xKWRZ2syrt7q/t/23sxZexTOxlXpOnPd/G9 Vz8tZVHOkpZGMS4GGTFFFlihM2XxJ2a9bqTjW8ezBxWJpAhDFycAjARN09Ghs3zp7z8kPU+6/pG 9b1vF7OfM3Xd56h9If4D08L1T0Km5qgyMpz7nz7Tcb9b6c/Lxi0Xha0qT/iyBIYdqLt04OEVFu7 ZjjwA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The vc4_mock_atomic_add_output() and vc4_mock_atomic_del_output() assert that the functions they are calling didn't fail. Since some of them can return EDEADLK, we can't properly deal with it. Since both functions are expected to return an int, and all caller check the return value, let's just properly propagate the errors when they occur. Fixes: f759f5b53f1c ("drm/vc4: tests: Introduce a mocking infrastructure") Fixes: 76ec18dc5afa ("drm/vc4: tests: Add unit test suite for the PV muxing= ") Reviewed-by: Ma=C3=ADra Canal Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/tests/vc4_mock_output.c | 36 +++++++++++++++++++------= ---- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c b/drivers/gpu/drm/= vc4/tests/vc4_mock_output.c index e70d7c3076acf168782c48301f3b3dfb9be21f22..f0ddc223c1f839e8a14f37fdcbb= 72e7b2c836aa1 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c +++ b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c @@ -73,28 +73,34 @@ int vc4_mock_atomic_add_output(struct kunit *test, struct drm_encoder *encoder; struct drm_crtc *crtc; int ret; =20 encoder =3D vc4_find_encoder_by_type(drm, type); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); + if (!encoder) + return -ENODEV; =20 crtc =3D vc4_find_crtc_for_encoder(test, drm, encoder); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); + if (!crtc) + return -ENODEV; =20 output =3D encoder_to_vc4_dummy_output(encoder); conn =3D &output->connector; conn_state =3D drm_atomic_get_connector_state(state, conn); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); =20 ret =3D drm_atomic_set_crtc_for_connector(conn_state, crtc); - KUNIT_EXPECT_EQ(test, ret, 0); + if (ret) + return ret; =20 crtc_state =3D drm_atomic_get_crtc_state(state, crtc); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); =20 ret =3D drm_atomic_set_mode_for_crtc(crtc_state, &default_mode); - KUNIT_EXPECT_EQ(test, ret, 0); + if (ret) + return ret; =20 crtc_state->active =3D true; =20 return 0; } @@ -111,28 +117,34 @@ int vc4_mock_atomic_del_output(struct kunit *test, struct drm_encoder *encoder; struct drm_crtc *crtc; int ret; =20 encoder =3D vc4_find_encoder_by_type(drm, type); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder); + if (!encoder) + return -ENODEV; =20 crtc =3D vc4_find_crtc_for_encoder(test, drm, encoder); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc); + if (!crtc) + return -ENODEV; =20 crtc_state =3D drm_atomic_get_crtc_state(state, crtc); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + if (IS_ERR(crtc_state)) + return PTR_ERR(crtc_state); =20 crtc_state->active =3D false; =20 ret =3D drm_atomic_set_mode_for_crtc(crtc_state, NULL); - KUNIT_ASSERT_EQ(test, ret, 0); + if (ret) + return ret; =20 output =3D encoder_to_vc4_dummy_output(encoder); conn =3D &output->connector; conn_state =3D drm_atomic_get_connector_state(state, conn); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, conn_state); + if (IS_ERR(conn_state)) + return PTR_ERR(conn_state); =20 ret =3D drm_atomic_set_crtc_for_connector(conn_state, NULL); - KUNIT_ASSERT_EQ(test, ret, 0); + if (ret) + return ret; =20 return 0; } --=20 2.49.0 From nobody Thu Apr 10 18:56:30 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E397251780 for ; Thu, 3 Apr 2025 13:33:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687229; cv=none; b=YfpXyA6C5KDFlNl8GECaWFrBS35x7skiuaFdn8nvCm9323Uk6V2+MzRX7ZNXBAsJ49HWwdaFJfVPTcHk3sNd3lSayrxJq9kmnMXYdtCSzWbQNJlHuDScnC3PMP40DCqrwuHJq6CCUxwzVLqhpoPpkSTcp3+aB1H+x7bnCoIempE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687229; c=relaxed/simple; bh=bUeXH/Wwdj4sAGXZMnX8uO5zLm5ZlWDOVT0q62t00aY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vp8uIACDb9Uk+3jgKqv+DIVzEfr/Ylr6nRrVLgQrO94xWE7+xexJ11sc/ogUTQ3UKS0T9tKWfVsiVsAZ2koYlDb4rl0DjUKg48pjUw1hreHEr8r+lCxomCeg0Krpb8pWKhFuobF18xyvuUOFzkrIWw5Iya6LmcuSaMuj0rQd4v4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W2Jg+8bL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="W2Jg+8bL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 38033C4CEE5; Thu, 3 Apr 2025 13:33:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743687228; bh=bUeXH/Wwdj4sAGXZMnX8uO5zLm5ZlWDOVT0q62t00aY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=W2Jg+8bLEje7Ib31DEYv5NlcbQ4c29t9zWQ16iXiBvn0k2FbAhJX9SwUBDzxblhz9 qDDtuCshshgxbQK719bD5GVjVROMaBwyGk8u2kJzDY8uGmPFOBFhiNjVSAhJ+xzPXw 45QfQkrg/CamteDliPtJgBXZGfGig/hiAvubojWOEFuadMT+GIh8chI7hHs2ADtuhE i6YgZXt25gfbWLMgutO/cMHfc6HxcgzOxhTC068nUaXpHwKOoVysTO0p4An3hMBSVT 1dmtvbTGb3OmwmTkrUkU3dWjbHga7JcyL1sk/VIAtjLVakGY64Fbl/u7PEAPriNpim qQ2gfeBpBgWZw== From: Maxime Ripard Date: Thu, 03 Apr 2025 15:33:31 +0200 Subject: [PATCH v2 2/4] drm/vc4: tests: Document output handling functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250403-drm-vc4-kunit-failures-v2-2-e09195cc8840@kernel.org> References: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> In-Reply-To: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> To: Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2286; i=mripard@kernel.org; h=from:subject:message-id; bh=bUeXH/Wwdj4sAGXZMnX8uO5zLm5ZlWDOVT0q62t00aY=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDOnv+gz/HhUKeDzXV2aDuMFiTWXmuq1HHBILhba7a8kUb hdt2GDeUcrCIMbFICumyBIjbL4k7tSs151sfPNg5rAygQxh4OIUgIlEBjL80zftCknMs5BYP9n3 +N79gZuFd2vxRhnHls+x2RYrnMzXzsjwRZzz5ZHUtalzXk4M3PnUhaM6Jat71seM4Ctrjy760bm WHQA= X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D vc4_mock_atomic_add_output() and vc4_mock_atomic_del_output() are public but aren't documented. Let's provide the documentation. In particular, special care should be taken to deal with EDEADLK. Signed-off-by: Maxime Ripard Reviewed-by: Ma=C3=ADra Canal --- drivers/gpu/drm/vc4/tests/vc4_mock_output.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c b/drivers/gpu/drm/= vc4/tests/vc4_mock_output.c index f0ddc223c1f839e8a14f37fdcbb72e7b2c836aa1..577d9a9563696791632aec614c3= 81a214886bf27 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_mock_output.c +++ b/drivers/gpu/drm/vc4/tests/vc4_mock_output.c @@ -59,10 +59,23 @@ struct vc4_dummy_output *vc4_dummy_output(struct kunit = *test, =20 static const struct drm_display_mode default_mode =3D { DRM_SIMPLE_MODE(640, 480, 64, 48) }; =20 +/** + * vc4_mock_atomic_add_output() - Enables an output in a state + * @test: The test context object + * @state: Atomic state to enable the output in. + * @type: Type of the output encoder + * + * Adds an output CRTC and connector to a state, and enables them. + * + * Returns: + * 0 on success, a negative error code on failure. If the error is + * EDEADLK, the entire atomic sequence must be restarted. All other + * errors are fatal. + */ int vc4_mock_atomic_add_output(struct kunit *test, struct drm_atomic_state *state, enum vc4_encoder_type type) { struct drm_device *drm =3D state->dev; @@ -103,10 +116,23 @@ int vc4_mock_atomic_add_output(struct kunit *test, crtc_state->active =3D true; =20 return 0; } =20 +/** + * vc4_mock_atomic_del_output() - Disables an output in a state + * @test: The test context object + * @state: Atomic state to disable the output in. + * @type: Type of the output encoder + * + * Adds an output CRTC and connector to a state, and disables them. + * + * Returns: + * 0 on success, a negative error code on failure. If the error is + * EDEADLK, the entire atomic sequence must be restarted. All other + * errors are fatal. + */ int vc4_mock_atomic_del_output(struct kunit *test, struct drm_atomic_state *state, enum vc4_encoder_type type) { struct drm_device *drm =3D state->dev; --=20 2.49.0 From nobody Thu Apr 10 18:56:30 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8CAE22528FC for ; Thu, 3 Apr 2025 13:33:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687231; cv=none; b=IsoaeBhT9SlzYgTV6bP0PAZT3Ix4gnAIuXhThSBVZT83QyHeC1Pcomui6SECvLO7rUkvqZYXBMbzGEMRTW61ve+Hfi8SrcYpXDUhDX/QNizVfj6qQf8j3My9yXp60RSAZQr1LRm/4pf7g90apfQL22roiKcrfqD3FApg2rGoNl8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687231; c=relaxed/simple; bh=DcYcHvtr2QSHPcXF1G+Z6ruyDYsfnPIybNswZ8mMbsg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=khf7TueydvuSpL3aQr2zfu0a7rF9rzu3E/AL8XeW9t0J2pq0viY+PDvauZ2YrSmtmnLXsXgUa4YllMMj35JaX+MYhLvfPLjYP7KcnCtrjqLQWal1WVNR+ehhMjiIuHSqXxuLpWxVv61OFwLtNcNzJC3cuVjf7I3d/2hMNfgwNR8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oneAda3h; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oneAda3h" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 19FC7C4CEE5; Thu, 3 Apr 2025 13:33:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743687231; bh=DcYcHvtr2QSHPcXF1G+Z6ruyDYsfnPIybNswZ8mMbsg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oneAda3hrpHCbR3hQcJoUoLiraCqoA2k1eXrpWSg8z0VpKMOs9mgOiUSN//yC0iJR nUc7CYJZ5Ml+U458aN41pFYDEP2oych7gIOSBHN7W+bUsg9pF6Y5bqtDqT0MY4AHnG vxRUMwAuiINwWkm+k6WKCdA21OF5eWIdt8ueyekqAvYQimK8NsuLrIPFP3tnK75Io+ g7r41jb/yNtKAEuhMX9opPC6tignNyhABywJMQxrfL1UmyiY6w55OtkZia7zInZB8L YyAwvrUDiN+h1wX82o+bUMH3KWLcY1BTk8ikMn7Do7VzQB6c885xQm31yGa6vidfCf mRrBBpDdaBenw== From: Maxime Ripard Date: Thu, 03 Apr 2025 15:33:32 +0200 Subject: [PATCH v2 3/4] drm/vc4: tests: Stop allocating the state in test init Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250403-drm-vc4-kunit-failures-v2-3-e09195cc8840@kernel.org> References: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> In-Reply-To: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> To: Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4608; i=mripard@kernel.org; h=from:subject:message-id; bh=DcYcHvtr2QSHPcXF1G+Z6ruyDYsfnPIybNswZ8mMbsg=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDOnv+owCH/LxLOXXZjQy+PTOm/9n63Kz3w+n7N9y9GuCC M8e8W1ZHaUsDGJcDLJiiiwxwuZL4k7Net3JxjcPZg4rE8gQBi5OAZhI2kmGf9adDbtqOB0d5H8c y2zWe1ShcWNP7r7Qwxe1Kj7Mcly06wwjQ9tZltMpJzSYqlbkHHB4s/St9T91ZpNp25ZrnJp9+MQ MZ14A X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D The vc4-pv-muxing-combinations and vc5-pv-muxing-combinations test suites use a common test init function which, in part, allocates the drm atomic state the test will use. That allocation relies on drm_kunit_helper_atomic_state_alloc(), and thus requires a struct drm_modeset_acquire_ctx. This context will then be stored in the allocated state->acquire_ctx field. However, the context is local to the test init function, and is cleared as soon as drm_kunit_helper_atomic_state_alloc() is done. We thus end up with an dangling pointer to a cleared context in state->acquire_ctx for our test to consumes. We should really allocate the context and the state in the test functions, so we can also control when we're done with it. Fixes: 30188df0c387 ("drm/tests: Drop drm_kunit_helper_acquire_ctx_alloc()") Reviewed-by: Ma=C3=ADra Canal Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c | 41 +++++++++++++++++-----= ---- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c b/drivers/gpu/d= rm/vc4/tests/vc4_test_pv_muxing.c index 992e8f5c5c6ea8d92338a8fe739fa1115ff85338..52c04ef33206bf4f9e21e3c8b7c= ea932824a67fa 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c +++ b/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c @@ -18,11 +18,10 @@ =20 #include "vc4_mock.h" =20 struct pv_muxing_priv { struct vc4_dev *vc4; - struct drm_atomic_state *state; }; =20 static bool check_fifo_conflict(struct kunit *test, const struct drm_atomic_state *state) { @@ -675,14 +674,23 @@ KUNIT_ARRAY_PARAM(vc5_test_pv_muxing_invalid, =20 static void drm_vc4_test_pv_muxing(struct kunit *test) { const struct pv_muxing_param *params =3D test->param_value; const struct pv_muxing_priv *priv =3D test->priv; - struct drm_atomic_state *state =3D priv->state; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_device *drm; + struct vc4_dev *vc4; unsigned int i; int ret; =20 + drm_modeset_acquire_init(&ctx, 0); + + vc4 =3D priv->vc4; + drm =3D &vc4->base; + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); for (i =3D 0; i < params->nencoders; i++) { enum vc4_encoder_type enc_type =3D params->encoders[i]; =20 ret =3D vc4_mock_atomic_add_output(test, state, enc_type); KUNIT_ASSERT_EQ(test, ret, 0); @@ -698,56 +706,61 @@ static void drm_vc4_test_pv_muxing(struct kunit *test) enum vc4_encoder_type enc_type =3D params->encoders[i]; =20 KUNIT_EXPECT_TRUE(test, check_channel_for_encoder(test, state, enc_type, params->check_fn)); } + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); } =20 static void drm_vc4_test_pv_muxing_invalid(struct kunit *test) { const struct pv_muxing_param *params =3D test->param_value; const struct pv_muxing_priv *priv =3D test->priv; - struct drm_atomic_state *state =3D priv->state; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_device *drm; + struct vc4_dev *vc4; unsigned int i; int ret; =20 + drm_modeset_acquire_init(&ctx, 0); + + vc4 =3D priv->vc4; + drm =3D &vc4->base; + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + for (i =3D 0; i < params->nencoders; i++) { enum vc4_encoder_type enc_type =3D params->encoders[i]; =20 ret =3D vc4_mock_atomic_add_output(test, state, enc_type); KUNIT_ASSERT_EQ(test, ret, 0); } =20 ret =3D drm_atomic_check_only(state); KUNIT_EXPECT_LT(test, ret, 0); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); } =20 static int vc4_pv_muxing_test_init(struct kunit *test) { const struct pv_muxing_param *params =3D test->param_value; - struct drm_modeset_acquire_ctx ctx; struct pv_muxing_priv *priv; - struct drm_device *drm; struct vc4_dev *vc4; =20 priv =3D kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); KUNIT_ASSERT_NOT_NULL(test, priv); test->priv =3D priv; =20 vc4 =3D params->mock_fn(test); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4); priv->vc4 =3D vc4; =20 - drm_modeset_acquire_init(&ctx, 0); - - drm =3D &vc4->base; - priv->state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->state); - - drm_modeset_drop_locks(&ctx); - drm_modeset_acquire_fini(&ctx); - return 0; } =20 static struct kunit_case vc4_pv_muxing_tests[] =3D { KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing, --=20 2.49.0 From nobody Thu Apr 10 18:56:30 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA248253333 for ; Thu, 3 Apr 2025 13:33:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687234; cv=none; b=ouZObGvoN5jk7K9d358yO4uvA3lZ7DB00BbSopXwPlo/WpSMY6t8Vb1o5P/NrSHmazZlVLhMSoBMFW+k+OaBSHE1CoA6pVNvpBs0jgDshG/NQYtSudVCyjxvRUS2CfWQp/Tb6IUtsoqxm8c/zUTEQNaRD2Mub7NFKo0jTcqu0yA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743687234; c=relaxed/simple; bh=hMXyl/o28HCBQcio/Vf3sP3GQUcIbXdFe9WHjTM8Fjg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RV9I3XUopwz9by2ldCcUnm8/kvlvPfp3xrcxAcFkwDxkJhHJJJMj4no6UmTwrqoYFMWQXa6A+TDXbokfxWomcOQVSPeCZb6QtN+FOnbIcwk3qYzsQ1DtY+KUc278LL2H/U7BcKCQGveOj4jukwdG0PAAtwbFGqOCNwTHmafmxmw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fFYDb8c+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fFYDb8c+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E1064C4CEE5; Thu, 3 Apr 2025 13:33:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743687234; bh=hMXyl/o28HCBQcio/Vf3sP3GQUcIbXdFe9WHjTM8Fjg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fFYDb8c+ymb+FThbz5S66LzuzIlEmTagnsBzHN+4WB/dn+oaKsnCtqOl/FKxUUAnj R3egR4ORvs/j+6eVL1V3vpLZM86m9aH+5lYQMVZzcmpUpq7N2qxBbeaywu/AKII1Wv xv7u/Q+Zva9F9hpoN259KRX1UubvPoL9sW81wSQEPFO1Xk9Q4AUK5g0v6wTtyQMI86 26DF7vXWSSCFh+/r7Urrg+oBaghk32w6BJSvf1A4G/s29RGryB7aidJe5mBi+Lkke+ 4KsVzunC14pehqmyMtnPhi+aA3fZvndoiCDBm71q6+am357vEVUYjb0/JJcOlSiYQa U+bSPR9ix0uKA== From: Maxime Ripard Date: Thu, 03 Apr 2025 15:33:33 +0200 Subject: [PATCH v2 4/4] drm/vc4: tests: Retry pv-muxing tests when EDEADLK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250403-drm-vc4-kunit-failures-v2-4-e09195cc8840@kernel.org> References: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> In-Reply-To: <20250403-drm-vc4-kunit-failures-v2-0-e09195cc8840@kernel.org> To: Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Maxime Ripard X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8413; i=mripard@kernel.org; h=from:subject:message-id; bh=hMXyl/o28HCBQcio/Vf3sP3GQUcIbXdFe9WHjTM8Fjg=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDOnv+oxazp7jtlO+vjvaklNjRUIw55wc6XLLI9GWv9erz 3tTIG3fUcrCIMbFICumyBIjbL4k7tSs151sfPNg5rAygQxh4OIUgIkEzWf4K7pIt+vamZv7Eq4z 7RQXu/0i/7pXi9muPzIh+zUfhoRu+cjw32tfJafSG5nvnI8bQ1TeLyy88Mo2J+YPh/f1N5PS5sy +wgIA X-Developer-Key: i=mripard@kernel.org; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D Some functions used by the HVS->PV muxing tests can return with EDEADLK, meaning the entire sequence should be restarted. It's not a fatal error and we should treat it as a recoverable error, and recover, instead of failing the test like we currently do. Fixes: 76ec18dc5afa ("drm/vc4: tests: Add unit test suite for the PV muxing= ") Signed-off-by: Maxime Ripard Reviewed-by: Ma=C3=ADra Canal --- drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c | 113 +++++++++++++++++++++= +++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c b/drivers/gpu/d= rm/vc4/tests/vc4_test_pv_muxing.c index 52c04ef33206bf4f9e21e3c8b7cea932824a67fa..d1f694029169adf6a907a72614b= c66afd745017e 100644 --- a/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c +++ b/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c @@ -685,20 +685,34 @@ static void drm_vc4_test_pv_muxing(struct kunit *test) =20 drm_modeset_acquire_init(&ctx, 0); =20 vc4 =3D priv->vc4; drm =3D &vc4->base; + +retry: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); for (i =3D 0; i < params->nencoders; i++) { enum vc4_encoder_type enc_type =3D params->encoders[i]; =20 ret =3D vc4_mock_atomic_add_output(test, state, enc_type); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry; + } KUNIT_ASSERT_EQ(test, ret, 0); } =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry; + } KUNIT_EXPECT_EQ(test, ret, 0); =20 KUNIT_EXPECT_TRUE(test, check_fifo_conflict(test, state)); =20 @@ -726,21 +740,35 @@ static void drm_vc4_test_pv_muxing_invalid(struct kun= it *test) =20 drm_modeset_acquire_init(&ctx, 0); =20 vc4 =3D priv->vc4; drm =3D &vc4->base; + +retry: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 for (i =3D 0; i < params->nencoders; i++) { enum vc4_encoder_type enc_type =3D params->encoders[i]; =20 ret =3D vc4_mock_atomic_add_output(test, state, enc_type); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry; + } KUNIT_ASSERT_EQ(test, ret, 0); } =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry; + } KUNIT_EXPECT_LT(test, ret, 0); =20 drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); } @@ -811,17 +839,30 @@ static void drm_test_vc5_pv_muxing_bugs_subsequent_cr= tc_enable(struct kunit *tes KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4); =20 drm_modeset_acquire_init(&ctx, 0); =20 drm =3D &vc4->base; +retry_first: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 new_hvs_state =3D vc4_hvs_get_new_global_state(state); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state); =20 @@ -834,17 +875,30 @@ static void drm_test_vc5_pv_muxing_bugs_subsequent_cr= tc_enable(struct kunit *tes KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[hdmi0_channel].in_use); =20 ret =3D drm_atomic_helper_swap_state(state, false); KUNIT_ASSERT_EQ(test, ret, 0); =20 +retry_second: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 new_hvs_state =3D vc4_hvs_get_new_global_state(state); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state); =20 @@ -885,20 +939,39 @@ static void drm_test_vc5_pv_muxing_bugs_stable_fifo(s= truct kunit *test) KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4); =20 drm_modeset_acquire_init(&ctx, 0); =20 drm =3D &vc4->base; +retry_first: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 new_hvs_state =3D vc4_hvs_get_new_global_state(state); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state); =20 @@ -919,17 +992,30 @@ static void drm_test_vc5_pv_muxing_bugs_stable_fifo(s= truct kunit *test) KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[old_hdmi1_channel].in_u= se); =20 ret =3D drm_atomic_helper_swap_state(state, false); KUNIT_ASSERT_EQ(test, ret, 0); =20 +retry_second: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_del_output(test, state, VC4_ENCODER_TYPE_HDMI0); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 new_hvs_state =3D vc4_hvs_get_new_global_state(state); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state); =20 @@ -979,29 +1065,54 @@ drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable_t= oo_many_crtc_state(struct ku KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4); =20 drm_modeset_acquire_init(&ctx, 0); =20 drm =3D &vc4->base; +retry_first: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_first; + } KUNIT_ASSERT_EQ(test, ret, 0); - ret =3D drm_atomic_helper_swap_state(state, false); KUNIT_ASSERT_EQ(test, ret, 0); =20 +retry_second: state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); =20 ret =3D vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_second; + } KUNIT_ASSERT_EQ(test, ret, 0); =20 new_vc4_crtc_state =3D get_vc4_crtc_state_for_encoder(test, state, VC4_ENCODER_TYPE_HDMI0); KUNIT_EXPECT_NULL(test, new_vc4_crtc_state); --=20 2.49.0