Skip to content

Commit 2cdef89

Browse files
Thomas Hellströmintel-lab-lkp
authored andcommitted
drm/tests/drm_exec: Add a test for object freeing within drm_exec_fini()
Check that object freeing from within drm_exec_fini() works as expected and doesn't generate any warnings. Cc: Christian König <[email protected]> Cc: [email protected] Signed-off-by: Thomas Hellström <[email protected]>
1 parent 107578c commit 2cdef89

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

drivers/gpu/drm/tests/drm_exec_test.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,52 @@ static void test_prepare_array(struct kunit *test)
170170
drm_gem_private_object_fini(&gobj2);
171171
}
172172

173+
static const struct drm_gem_object_funcs put_funcs = {
174+
.free = (void *)kfree,
175+
};
176+
177+
/*
178+
* Check that freeing objects from within drm_exec_fini()
179+
* behaves as expected.
180+
*/
181+
static void test_early_put(struct kunit *test)
182+
{
183+
struct drm_exec_priv *priv = test->priv;
184+
struct drm_gem_object *gobj1;
185+
struct drm_gem_object *gobj2;
186+
struct drm_gem_object *array[2];
187+
struct drm_exec exec;
188+
int ret;
189+
190+
gobj1 = kzalloc(sizeof(*gobj1), GFP_KERNEL);
191+
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, gobj1);
192+
if (!gobj1)
193+
return;
194+
195+
gobj2 = kzalloc(sizeof(*gobj2), GFP_KERNEL);
196+
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, gobj2);
197+
if (!gobj2) {
198+
kfree(gobj1);
199+
return;
200+
}
201+
202+
gobj1->funcs = &put_funcs;
203+
gobj2->funcs = &put_funcs;
204+
array[0] = gobj1;
205+
array[1] = gobj2;
206+
drm_gem_private_object_init(priv->drm, gobj1, PAGE_SIZE);
207+
drm_gem_private_object_init(priv->drm, gobj2, PAGE_SIZE);
208+
209+
drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
210+
drm_exec_until_all_locked(&exec)
211+
ret = drm_exec_prepare_array(&exec, array, ARRAY_SIZE(array),
212+
1);
213+
KUNIT_EXPECT_EQ(test, ret, 0);
214+
drm_gem_object_put(gobj1);
215+
drm_gem_object_put(gobj2);
216+
drm_exec_fini(&exec);
217+
}
218+
173219
static void test_multiple_loops(struct kunit *test)
174220
{
175221
struct drm_exec exec;
@@ -198,6 +244,7 @@ static struct kunit_case drm_exec_tests[] = {
198244
KUNIT_CASE(test_prepare),
199245
KUNIT_CASE(test_prepare_array),
200246
KUNIT_CASE(test_multiple_loops),
247+
KUNIT_CASE(test_early_put),
201248
{}
202249
};
203250

0 commit comments

Comments
 (0)