[PATCH] fix: drm/ttm/tests: use KUNIT_ASSERT_EQ for critical error checks to prevent kref underflow
From: WenTao Liang
Date: Fri Jun 26 2026 - 10:55:00 EST
Replace KUNIT_EXPECT_EQ with KUNIT_ASSERT_EQ in ttm_bo_validate test cases
where subsequent ttm_bo_fini would cause a kref underflow if the preceding
ttm_bo_init_reserved (or ttm_bo_validate) failed. When those functions fail
they already release their internal references, leaving the refcount at 0.
Continuing to ttm_bo_fini without aborting performs an extra kref_put.
Cc: stable@xxxxxxxxxxxxxxx
Fixes: 8bd1ff5ddc7b ("drm/ttm/tests: Test simple BO creation and validation")
Signed-off-by: WenTao Liang <vulab@xxxxxxxxxxx>
---
.../gpu/drm/ttm/tests/ttm_bo_validate_test.c | 22 +++++++++----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
index 2db221f6fc3a..7c4179f6349c 100644
--- a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
+++ b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
@@ -217,7 +217,7 @@ static void ttm_bo_init_reserved_resv(struct kunit *test)
&dummy_ttm_bo_destroy);
dma_resv_unlock(bo->base.resv);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
KUNIT_EXPECT_PTR_EQ(test, bo->base.resv, &resv);
ttm_resource_free(bo, &bo->resource);
@@ -249,7 +249,7 @@ static void ttm_bo_validate_basic(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo, params->bo_type,
fst_placement, PAGE_SIZE, &ctx_init, NULL,
NULL, &dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
snd_place = ttm_place_kunit_init(test, snd_mem, GPU_BUDDY_TOPDOWN_ALLOCATION);
snd_placement = ttm_placement_kunit_init(test, snd_place, 1);
@@ -395,7 +395,7 @@ static void ttm_bo_validate_same_placement(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo, params->bo_type,
placement, PAGE_SIZE, &ctx_init, NULL,
NULL, &dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
err = ttm_bo_validate(bo, placement, &ctx_val);
dma_resv_unlock(bo->base.resv);
@@ -722,7 +722,7 @@ static void ttm_bo_validate_move_fence_not_signaled(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo, bo_type, placement_init,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
ttm_mock_manager_init(priv->ttm_dev, fst_mem, MANAGER_SIZE);
ttm_mock_manager_init(priv->ttm_dev, snd_mem, MANAGER_SIZE);
@@ -840,7 +840,7 @@ static void ttm_bo_validate_happy_evict(struct kunit *test)
err = ttm_bo_validate(bo_val, placement, &ctx_val);
ttm_bo_unreserve(bo_val);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
KUNIT_EXPECT_EQ(test, bos[0].resource->mem_type, mem_type_evict);
KUNIT_EXPECT_TRUE(test, bos[0].ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC);
KUNIT_EXPECT_TRUE(test, bos[0].ttm->page_flags & TTM_TT_FLAG_PRIV_POPULATED);
@@ -879,7 +879,7 @@ static void ttm_bo_validate_all_pinned_evict(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_big, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
ttm_bo_pin(bo_big);
dma_resv_unlock(bo_big->base.resv);
@@ -930,7 +930,7 @@ static void ttm_bo_validate_allowed_only_evict(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_pinned, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
ttm_bo_pin(bo_pinned);
dma_resv_unlock(bo_pinned->base.resv);
@@ -941,7 +941,7 @@ static void ttm_bo_validate_allowed_only_evict(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_evictable, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
dma_resv_unlock(bo_evictable->base.resv);
bo = ttm_bo_kunit_init(test, test->priv, BO_SIZE, NULL);
@@ -995,7 +995,7 @@ static void ttm_bo_validate_deleted_evict(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_big, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
KUNIT_EXPECT_EQ(test, ttm_resource_manager_usage(man), big);
dma_resv_unlock(bo_big->base.resv);
@@ -1052,7 +1052,7 @@ static void ttm_bo_validate_busy_domain_evict(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_init, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
dma_resv_unlock(bo_init->base.resv);
bo_val = ttm_bo_kunit_init(test, test->priv, BO_SIZE, NULL);
@@ -1096,7 +1096,7 @@ static void ttm_bo_validate_evict_gutting(struct kunit *test)
err = ttm_bo_init_reserved(priv->ttm_dev, bo_evict, bo_type, placement,
PAGE_SIZE, &ctx_init, NULL, NULL,
&dummy_ttm_bo_destroy);
- KUNIT_EXPECT_EQ(test, err, 0);
+ KUNIT_ASSERT_EQ(test, err, 0);
dma_resv_unlock(bo_evict->base.resv);
bo = ttm_bo_kunit_init(test, test->priv, BO_SIZE, NULL);
--
2.39.5 (Apple Git-154)