Skip to content

Commit d341463

Browse files
committed
drm/tests: modes: Fix drm_display_mode memory leak
drm_analog_tv_mode() and its variants return a drm_display_mode that needs to be destroyed later one. The drm_modes_analog_tv tests never do however, which leads to a memory leak. Let's make sure it's freed. Reported-by: Philipp Stanner <phasta@mailbox.org> Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/ Fixes: 4fcd238 ("drm/modes: Add a function to generate analog display modes") Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://lore.kernel.org/r/20250408-drm-kunit-drm-display-mode-memleak-v1-5-996305a2e75a@kernel.org Signed-off-by: Maxime Ripard <mripard@kernel.org>
1 parent 70f29ca commit d341463

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

drivers/gpu/drm/tests/drm_modes_test.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,17 @@ static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
4040
{
4141
struct drm_test_modes_priv *priv = test->priv;
4242
struct drm_display_mode *mode;
43+
int ret;
4344

4445
mode = drm_analog_tv_mode(priv->drm,
4546
DRM_MODE_TV_MODE_NTSC,
4647
13500 * HZ_PER_KHZ, 720, 480,
4748
true);
4849
KUNIT_ASSERT_NOT_NULL(test, mode);
4950

51+
ret = drm_kunit_add_mode_destroy_action(test, mode);
52+
KUNIT_ASSERT_EQ(test, ret, 0);
53+
5054
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60);
5155
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
5256

@@ -70,30 +74,41 @@ static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
7074
{
7175
struct drm_test_modes_priv *priv = test->priv;
7276
struct drm_display_mode *expected, *mode;
77+
int ret;
7378

7479
expected = drm_analog_tv_mode(priv->drm,
7580
DRM_MODE_TV_MODE_NTSC,
7681
13500 * HZ_PER_KHZ, 720, 480,
7782
true);
7883
KUNIT_ASSERT_NOT_NULL(test, expected);
7984

85+
ret = drm_kunit_add_mode_destroy_action(test, expected);
86+
KUNIT_ASSERT_EQ(test, ret, 0);
87+
8088
mode = drm_mode_analog_ntsc_480i(priv->drm);
8189
KUNIT_ASSERT_NOT_NULL(test, mode);
8290

91+
ret = drm_kunit_add_mode_destroy_action(test, mode);
92+
KUNIT_ASSERT_EQ(test, ret, 0);
93+
8394
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
8495
}
8596

8697
static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
8798
{
8899
struct drm_test_modes_priv *priv = test->priv;
89100
struct drm_display_mode *mode;
101+
int ret;
90102

91103
mode = drm_analog_tv_mode(priv->drm,
92104
DRM_MODE_TV_MODE_PAL,
93105
13500 * HZ_PER_KHZ, 720, 576,
94106
true);
95107
KUNIT_ASSERT_NOT_NULL(test, mode);
96108

109+
ret = drm_kunit_add_mode_destroy_action(test, mode);
110+
KUNIT_ASSERT_EQ(test, ret, 0);
111+
97112
KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
98113
KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
99114

@@ -117,16 +132,23 @@ static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
117132
{
118133
struct drm_test_modes_priv *priv = test->priv;
119134
struct drm_display_mode *expected, *mode;
135+
int ret;
120136

121137
expected = drm_analog_tv_mode(priv->drm,
122138
DRM_MODE_TV_MODE_PAL,
123139
13500 * HZ_PER_KHZ, 720, 576,
124140
true);
125141
KUNIT_ASSERT_NOT_NULL(test, expected);
126142

143+
ret = drm_kunit_add_mode_destroy_action(test, expected);
144+
KUNIT_ASSERT_EQ(test, ret, 0);
145+
127146
mode = drm_mode_analog_pal_576i(priv->drm);
128147
KUNIT_ASSERT_NOT_NULL(test, mode);
129148

149+
ret = drm_kunit_add_mode_destroy_action(test, mode);
150+
KUNIT_ASSERT_EQ(test, ret, 0);
151+
130152
KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
131153
}
132154

0 commit comments

Comments
 (0)