Skip to content

Commit 9261633

Browse files
Jinjie Ruanmripard
authored andcommitted
drm/connector: hdmi: Fix memory leak in drm_display_mode_from_cea_vic()
modprobe drm_connector_test and then rmmod drm_connector_test, the following memory leak occurs. The `mode` allocated in drm_mode_duplicate() called by drm_display_mode_from_cea_vic() is not freed, which cause the memory leak: unreferenced object 0xffffff80cb0ee400 (size 128): comm "kunit_try_catch", pid 1948, jiffies 4294950339 hex dump (first 32 bytes): 14 44 02 00 80 07 d8 07 04 08 98 08 00 00 38 04 .D............8. 3c 04 41 04 65 04 00 00 05 00 00 00 00 00 00 00 <.A.e........... backtrace (crc 90e9585c): [<00000000ec42e3d7>] kmemleak_alloc+0x34/0x40 [<00000000d0ef055a>] __kmalloc_cache_noprof+0x26c/0x2f4 [<00000000c2062161>] drm_mode_duplicate+0x44/0x19c [<00000000f96c74aa>] drm_display_mode_from_cea_vic+0x88/0x98 [<00000000d8f2c8b4>] 0xffffffdc982a4868 [<000000005d164dbc>] kunit_try_run_case+0x13c/0x3ac [<000000006fb23398>] kunit_generic_run_threadfn_adapter+0x80/0xec [<000000006ea56ca0>] kthread+0x2e8/0x374 [<000000000676063f>] ret_from_fork+0x10/0x20 ...... Free `mode` by using drm_kunit_display_mode_from_cea_vic() to fix it. Cc: [email protected] Fixes: abb6f74 ("drm/tests: Add HDMI TDMS character rate tests") Acked-by: Maxime Ripard <[email protected]> Signed-off-by: Jinjie Ruan <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Maxime Ripard <[email protected]>
1 parent caa714f commit 9261633

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

drivers/gpu/drm/tests/drm_connector_test.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb(struct kunit *test)
996996
unsigned long long rate;
997997
struct drm_device *drm = &priv->drm;
998998

999-
mode = drm_display_mode_from_cea_vic(drm, 16);
999+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
10001000
KUNIT_ASSERT_NOT_NULL(test, mode);
10011001

10021002
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1017,7 +1017,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc(struct kunit *test)
10171017
unsigned long long rate;
10181018
struct drm_device *drm = &priv->drm;
10191019

1020-
mode = drm_display_mode_from_cea_vic(drm, 16);
1020+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
10211021
KUNIT_ASSERT_NOT_NULL(test, mode);
10221022

10231023
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1038,7 +1038,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1(struct kunit *t
10381038
unsigned long long rate;
10391039
struct drm_device *drm = &priv->drm;
10401040

1041-
mode = drm_display_mode_from_cea_vic(drm, 1);
1041+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 1);
10421042
KUNIT_ASSERT_NOT_NULL(test, mode);
10431043

10441044
rate = drm_hdmi_compute_mode_clock(mode, 10, HDMI_COLORSPACE_RGB);
@@ -1056,7 +1056,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc(struct kunit *test)
10561056
unsigned long long rate;
10571057
struct drm_device *drm = &priv->drm;
10581058

1059-
mode = drm_display_mode_from_cea_vic(drm, 16);
1059+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
10601060
KUNIT_ASSERT_NOT_NULL(test, mode);
10611061

10621062
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1077,7 +1077,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1(struct kunit *t
10771077
unsigned long long rate;
10781078
struct drm_device *drm = &priv->drm;
10791079

1080-
mode = drm_display_mode_from_cea_vic(drm, 1);
1080+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 1);
10811081
KUNIT_ASSERT_NOT_NULL(test, mode);
10821082

10831083
rate = drm_hdmi_compute_mode_clock(mode, 12, HDMI_COLORSPACE_RGB);
@@ -1095,7 +1095,7 @@ static void drm_test_drm_hdmi_compute_mode_clock_rgb_double(struct kunit *test)
10951095
unsigned long long rate;
10961096
struct drm_device *drm = &priv->drm;
10971097

1098-
mode = drm_display_mode_from_cea_vic(drm, 6);
1098+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 6);
10991099
KUNIT_ASSERT_NOT_NULL(test, mode);
11001100

11011101
KUNIT_ASSERT_TRUE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1118,7 +1118,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_valid(struct kunit
11181118
unsigned long long rate;
11191119
unsigned int vic = *(unsigned int *)test->param_value;
11201120

1121-
mode = drm_display_mode_from_cea_vic(drm, vic);
1121+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, vic);
11221122
KUNIT_ASSERT_NOT_NULL(test, mode);
11231123

11241124
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1155,7 +1155,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc(struct kuni
11551155
drm_hdmi_compute_mode_clock_yuv420_vic_valid_tests[0];
11561156
unsigned long long rate;
11571157

1158-
mode = drm_display_mode_from_cea_vic(drm, vic);
1158+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, vic);
11591159
KUNIT_ASSERT_NOT_NULL(test, mode);
11601160

11611161
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1180,7 +1180,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc(struct kuni
11801180
drm_hdmi_compute_mode_clock_yuv420_vic_valid_tests[0];
11811181
unsigned long long rate;
11821182

1183-
mode = drm_display_mode_from_cea_vic(drm, vic);
1183+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, vic);
11841184
KUNIT_ASSERT_NOT_NULL(test, mode);
11851185

11861186
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1203,7 +1203,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc(struct kunit
12031203
struct drm_device *drm = &priv->drm;
12041204
unsigned long long rate;
12051205

1206-
mode = drm_display_mode_from_cea_vic(drm, 16);
1206+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
12071207
KUNIT_ASSERT_NOT_NULL(test, mode);
12081208

12091209
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1225,7 +1225,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc(struct kuni
12251225
struct drm_device *drm = &priv->drm;
12261226
unsigned long long rate;
12271227

1228-
mode = drm_display_mode_from_cea_vic(drm, 16);
1228+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
12291229
KUNIT_ASSERT_NOT_NULL(test, mode);
12301230

12311231
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);
@@ -1247,7 +1247,7 @@ static void drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc(struct kuni
12471247
struct drm_device *drm = &priv->drm;
12481248
unsigned long long rate;
12491249

1250-
mode = drm_display_mode_from_cea_vic(drm, 16);
1250+
mode = drm_kunit_display_mode_from_cea_vic(test, drm, 16);
12511251
KUNIT_ASSERT_NOT_NULL(test, mode);
12521252

12531253
KUNIT_ASSERT_FALSE(test, mode->flags & DRM_MODE_FLAG_DBLCLK);

0 commit comments

Comments
 (0)