public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks
@ 2025-04-08  7:34 Maxime Ripard
  2025-04-08  7:34 ` [PATCH 1/7] drm/tests: helpers: Create kunit helper to destroy a drm_display_mode Maxime Ripard
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

Hi,

Here's a series that fixes some memory leaks in our kunit tests that
eventually show up in kmemleak.

Let me know what you think,
Maxime

Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Maxime Ripard (7):
      drm/tests: helpers: Create kunit helper to destroy a drm_display_mode
      drm/tests: modeset: Fix drm_display_mode memory leak
      drm/tests: modeset: Fix drm_display_mode memory leak
      drm/tests: cmdline: Fix drm_display_mode memory leak
      drm/tests: modes: Fix drm_display_mode memory leak
      drm/tests: modes: Fix drm_display_mode memory leak
      drm/tests: probe-helper: Fix drm_display_mode memory leak

 drivers/gpu/drm/tests/drm_client_modeset_test.c |  9 ++++++++-
 drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 10 +++++++++-
 drivers/gpu/drm/tests/drm_kunit_helpers.c       | 23 ++++++++++++++++++++++
 drivers/gpu/drm/tests/drm_modes_test.c          | 26 +++++++++++++++++++++++++
 drivers/gpu/drm/tests/drm_probe_helper_test.c   |  8 +++++++-
 include/drm/drm_kunit_helpers.h                 |  3 +++
 6 files changed, 76 insertions(+), 3 deletions(-)
---
base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
change-id: 20250408-drm-kunit-drm-display-mode-memleak-49d05334c16e

Best regards,
-- 
Maxime Ripard <mripard@kernel.org>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/7] drm/tests: helpers: Create kunit helper to destroy a drm_display_mode
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 2/7] drm/tests: modeset: Fix drm_display_mode memory leak Maxime Ripard
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

A number of test suites call functions that expect the returned
drm_display_mode to be destroyed eventually.

However, none of the tests called drm_mode_destroy, which results in a
memory leak.

Since drm_mode_destroy takes two pointers as argument, we can't use a
kunit wrapper. Let's just create a helper every test suite can use.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_kunit_helpers.c | 23 +++++++++++++++++++++++
 include/drm/drm_kunit_helpers.h           |  3 +++
 2 files changed, 26 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_kunit_helpers.c b/drivers/gpu/drm/tests/drm_kunit_helpers.c
index a4eb68f0decca15988105b9d58266e3871934a8b..7f540f9e4d98cc507e51b486edb99177a23011d1 100644
--- a/drivers/gpu/drm/tests/drm_kunit_helpers.c
+++ b/drivers/gpu/drm/tests/drm_kunit_helpers.c
@@ -276,10 +276,33 @@ static void kunit_action_drm_mode_destroy(void *ptr)
 	struct drm_display_mode *mode = ptr;
 
 	drm_mode_destroy(NULL, mode);
 }
 
+/**
+ * drm_kunit_add_mode_destroy_action() - Add a drm_destroy_mode kunit action
+ * @test: The test context object
+ * @mode: The drm_display_mode to destroy eventually
+ *
+ * Registers a kunit action that will destroy the drm_display_mode at
+ * the end of the test.
+ *
+ * If an error occurs, the drm_display_mode will be destroyed.
+ *
+ * Returns:
+ * 0 on success, an error code otherwise.
+ */
+int drm_kunit_add_mode_destroy_action(struct kunit *test,
+				      struct drm_display_mode *mode)
+{
+
+	return kunit_add_action_or_reset(test,
+					 kunit_action_drm_mode_destroy,
+					 mode);
+}
+EXPORT_SYMBOL_GPL(drm_kunit_add_mode_destroy_action);
+
 /**
  * drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC for a KUnit test
  * @test: The test context object
  * @dev: DRM device
  * @video_code: CEA VIC of the mode
diff --git a/include/drm/drm_kunit_helpers.h b/include/drm/drm_kunit_helpers.h
index 11d59ce0bac0bbec07ae5f07ed9710cf01d73f09..1c62d1d4458cae3a6883a0daaf42b8431c4a213a 100644
--- a/include/drm/drm_kunit_helpers.h
+++ b/include/drm/drm_kunit_helpers.h
@@ -116,10 +116,13 @@ drm_kunit_helper_create_crtc(struct kunit *test,
 			     struct drm_plane *primary,
 			     struct drm_plane *cursor,
 			     const struct drm_crtc_funcs *funcs,
 			     const struct drm_crtc_helper_funcs *helper_funcs);
 
+int drm_kunit_add_mode_destroy_action(struct kunit *test,
+				      struct drm_display_mode *mode);
+
 struct drm_display_mode *
 drm_kunit_display_mode_from_cea_vic(struct kunit *test, struct drm_device *dev,
 				    u8 video_code);
 
 #endif // DRM_KUNIT_HELPERS_H_

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/7] drm/tests: modeset: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
  2025-04-08  7:34 ` [PATCH 1/7] drm/tests: helpers: Create kunit helper to destroy a drm_display_mode Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 3/7] " Maxime Ripard
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

drm_mode_find_dmt() returns a drm_display_mode that needs to be
destroyed later one. The drm_test_pick_cmdline_res_1920_1080_60() test
never does however, which leads to a memory leak.

Let's make sure it's freed.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: 8fc0380f6ba7 ("drm/client: Add some tests for drm_connector_pick_cmdline_mode()")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_client_modeset_test.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_client_modeset_test.c b/drivers/gpu/drm/tests/drm_client_modeset_test.c
index 7516f6cb36e4e3a1ed3a655de6f6a4479a0efade..3e9518d7b8b7eb92f1be3ce376d850cbab638d10 100644
--- a/drivers/gpu/drm/tests/drm_client_modeset_test.c
+++ b/drivers/gpu/drm/tests/drm_client_modeset_test.c
@@ -93,10 +93,13 @@ static void drm_test_pick_cmdline_res_1920_1080_60(struct kunit *test)
 	int ret;
 
 	expected_mode = drm_mode_find_dmt(priv->drm, 1920, 1080, 60, false);
 	KUNIT_ASSERT_NOT_NULL(test, expected_mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_ASSERT_TRUE(test,
 			  drm_mode_parse_command_line_for_connector(cmdline,
 								    connector,
 								    cmdline_mode));
 

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/7] drm/tests: modeset: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
  2025-04-08  7:34 ` [PATCH 1/7] drm/tests: helpers: Create kunit helper to destroy a drm_display_mode Maxime Ripard
  2025-04-08  7:34 ` [PATCH 2/7] drm/tests: modeset: Fix drm_display_mode memory leak Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 4/7] drm/tests: cmdline: " Maxime Ripard
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

drm_analog_tv_mode() and its variants return a drm_display_mode that
needs to be destroyed later one. The drm_test_pick_cmdline_named() test
never does however, which leads to a memory leak.

Let's make sure it's freed.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: fedcaf726f54 ("drm/modes: Properly generate a drm_display_mode from a named mode")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_client_modeset_test.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tests/drm_client_modeset_test.c b/drivers/gpu/drm/tests/drm_client_modeset_test.c
index 3e9518d7b8b7eb92f1be3ce376d850cbab638d10..b2fdb1a774fe69c4e14b718324d7380f900bd548 100644
--- a/drivers/gpu/drm/tests/drm_client_modeset_test.c
+++ b/drivers/gpu/drm/tests/drm_client_modeset_test.c
@@ -130,11 +130,12 @@ static void drm_test_pick_cmdline_named(struct kunit *test)
 	const struct drm_connector_pick_cmdline_mode_test *params = test->param_value;
 	struct drm_client_modeset_test_priv *priv = test->priv;
 	struct drm_device *drm = priv->drm;
 	struct drm_connector *connector = &priv->connector;
 	struct drm_cmdline_mode *cmdline_mode = &connector->cmdline_mode;
-	const struct drm_display_mode *expected_mode, *mode;
+	const struct drm_display_mode *mode;
+	struct drm_display_mode *expected_mode;
 	const char *cmdline = params->cmdline;
 	int ret;
 
 	KUNIT_ASSERT_TRUE(test,
 			  drm_mode_parse_command_line_for_connector(cmdline,
@@ -150,10 +151,13 @@ static void drm_test_pick_cmdline_named(struct kunit *test)
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
 	expected_mode = params->func(drm);
 	KUNIT_ASSERT_NOT_NULL(test, expected_mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected_mode, mode));
 }
 
 static const
 struct drm_connector_pick_cmdline_mode_test drm_connector_pick_cmdline_mode_tests[] = {

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/7] drm/tests: cmdline: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (2 preceding siblings ...)
  2025-04-08  7:34 ` [PATCH 3/7] " Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 5/7] drm/tests: modes: " Maxime Ripard
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

drm_analog_tv_mode() and its variants return a drm_display_mode that
needs to be destroyed later one. The drm_test_cmdline_tv_options() test
never does however, which leads to a memory leak.

Let's make sure it's freed.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: e691c9992ae1 ("drm/modes: Introduce the tv_mode property as a command-line option")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c
index 59c8408c453c2ef8f18c7c887b0405418e9e1f99..1cfcb597b088b4d159a5fb10a309338cb73abbe9 100644
--- a/drivers/gpu/drm/tests/drm_cmdline_parser_test.c
+++ b/drivers/gpu/drm/tests/drm_cmdline_parser_test.c
@@ -5,10 +5,11 @@
  */
 
 #include <kunit/test.h>
 
 #include <drm/drm_connector.h>
+#include <drm/drm_kunit_helpers.h>
 #include <drm/drm_modes.h>
 
 static const struct drm_connector no_connector = {};
 
 static void drm_test_cmdline_force_e_only(struct kunit *test)
@@ -953,12 +954,19 @@ struct drm_cmdline_tv_option_test {
 };
 
 static void drm_test_cmdline_tv_options(struct kunit *test)
 {
 	const struct drm_cmdline_tv_option_test *params = test->param_value;
-	const struct drm_display_mode *expected_mode = params->mode_fn(NULL);
+	struct drm_display_mode *expected_mode;
 	struct drm_cmdline_mode mode = { };
+	int ret;
+
+	expected_mode = params->mode_fn(NULL);
+	KUNIT_ASSERT_NOT_NULL(test, expected_mode);
+
+	ret = drm_kunit_add_mode_destroy_action(test, expected_mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
 									  &no_connector, &mode));
 	KUNIT_EXPECT_TRUE(test, mode.specified);
 	KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay);

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/7] drm/tests: modes: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (3 preceding siblings ...)
  2025-04-08  7:34 ` [PATCH 4/7] drm/tests: cmdline: " Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 6/7] " Maxime Ripard
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

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.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: 4fcd238560ee ("drm/modes: Add a function to generate analog display modes")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_modes_test.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_modes_test.c b/drivers/gpu/drm/tests/drm_modes_test.c
index 6ed51f99e133c96db7c1deafea9be1c00eebe7a1..7ba646d87856f52f99b0f9bcfed0c31d848c798d 100644
--- a/drivers/gpu/drm/tests/drm_modes_test.c
+++ b/drivers/gpu/drm/tests/drm_modes_test.c
@@ -38,17 +38,21 @@ static int drm_test_modes_init(struct kunit *test)
 
 static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
 {
 	struct drm_test_modes_priv *priv = test->priv;
 	struct drm_display_mode *mode;
+	int ret;
 
 	mode = drm_analog_tv_mode(priv->drm,
 				  DRM_MODE_TV_MODE_NTSC,
 				  13500 * HZ_PER_KHZ, 720, 480,
 				  true);
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 60);
 	KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
 
 	/* BT.601 defines hsync_start at 736 for 480i */
 	KUNIT_EXPECT_EQ(test, mode->hsync_start, 736);
@@ -68,34 +72,45 @@ static void drm_test_modes_analog_tv_ntsc_480i(struct kunit *test)
 
 static void drm_test_modes_analog_tv_ntsc_480i_inlined(struct kunit *test)
 {
 	struct drm_test_modes_priv *priv = test->priv;
 	struct drm_display_mode *expected, *mode;
+	int ret;
 
 	expected = drm_analog_tv_mode(priv->drm,
 				      DRM_MODE_TV_MODE_NTSC,
 				      13500 * HZ_PER_KHZ, 720, 480,
 				      true);
 	KUNIT_ASSERT_NOT_NULL(test, expected);
 
+	ret = drm_kunit_add_mode_destroy_action(test, expected);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	mode = drm_mode_analog_ntsc_480i(priv->drm);
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
 }
 
 static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
 {
 	struct drm_test_modes_priv *priv = test->priv;
 	struct drm_display_mode *mode;
+	int ret;
 
 	mode = drm_analog_tv_mode(priv->drm,
 				  DRM_MODE_TV_MODE_PAL,
 				  13500 * HZ_PER_KHZ, 720, 576,
 				  true);
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
 	KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
 
 	/* BT.601 defines hsync_start at 732 for 576i */
 	KUNIT_EXPECT_EQ(test, mode->hsync_start, 732);
@@ -115,20 +130,27 @@ static void drm_test_modes_analog_tv_pal_576i(struct kunit *test)
 
 static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
 {
 	struct drm_test_modes_priv *priv = test->priv;
 	struct drm_display_mode *expected, *mode;
+	int ret;
 
 	expected = drm_analog_tv_mode(priv->drm,
 				      DRM_MODE_TV_MODE_PAL,
 				      13500 * HZ_PER_KHZ, 720, 576,
 				      true);
 	KUNIT_ASSERT_NOT_NULL(test, expected);
 
+	ret = drm_kunit_add_mode_destroy_action(test, expected);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	mode = drm_mode_analog_pal_576i(priv->drm);
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_TRUE(test, drm_mode_equal(expected, mode));
 }
 
 static void drm_test_modes_analog_tv_mono_576i(struct kunit *test)
 {

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 6/7] drm/tests: modes: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (4 preceding siblings ...)
  2025-04-08  7:34 ` [PATCH 5/7] drm/tests: modes: " Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:34 ` [PATCH 7/7] drm/tests: probe-helper: " Maxime Ripard
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

drm_analog_tv_mode() and its variants return a drm_display_mode that
needs to be destroyed later one. The
drm_test_modes_analog_tv_mono_576i() test never does however, which
leads to a memory leak.

Let's make sure it's freed.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: e31538489908 ("drm/tests: Add tests for the new Monochrome value of tv_mode")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_modes_test.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_modes_test.c b/drivers/gpu/drm/tests/drm_modes_test.c
index 7ba646d87856f52f99b0f9bcfed0c31d848c798d..f5b20f92df8be73ad9ef46aedae8b855e637e4dd 100644
--- a/drivers/gpu/drm/tests/drm_modes_test.c
+++ b/drivers/gpu/drm/tests/drm_modes_test.c
@@ -154,17 +154,21 @@ static void drm_test_modes_analog_tv_pal_576i_inlined(struct kunit *test)
 
 static void drm_test_modes_analog_tv_mono_576i(struct kunit *test)
 {
 	struct drm_test_modes_priv *priv = test->priv;
 	struct drm_display_mode *mode;
+	int ret;
 
 	mode = drm_analog_tv_mode(priv->drm,
 				  DRM_MODE_TV_MODE_MONOCHROME,
 				  13500 * HZ_PER_KHZ, 720, 576,
 				  true);
 	KUNIT_ASSERT_NOT_NULL(test, mode);
 
+	ret = drm_kunit_add_mode_destroy_action(test, mode);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
 	KUNIT_EXPECT_EQ(test, drm_mode_vrefresh(mode), 50);
 	KUNIT_EXPECT_EQ(test, mode->hdisplay, 720);
 
 	/* BT.601 defines hsync_start at 732 for 576i */
 	KUNIT_EXPECT_EQ(test, mode->hsync_start, 732);

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 7/7] drm/tests: probe-helper: Fix drm_display_mode memory leak
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (5 preceding siblings ...)
  2025-04-08  7:34 ` [PATCH 6/7] " Maxime Ripard
@ 2025-04-08  7:34 ` Maxime Ripard
  2025-04-08  7:56 ` [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Thomas Zimmermann
  2025-04-08 15:34 ` Maxime Ripard
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08  7:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel, Maxime Ripard

drm_analog_tv_mode() and its variants return a drm_display_mode that
needs to be destroyed later one. The
drm_test_connector_helper_tv_get_modes_check() test never does however,
which leads to a memory leak.

Let's make sure it's freed.

Closes: https://lore.kernel.org/dri-devel/a7655158a6367ac46194d57f4b7433ef0772a73e.camel@mailbox.org/
Fixes: 1e4a91db109f ("drm/probe-helper: Provide a TV get_modes helper")
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/tests/drm_probe_helper_test.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/tests/drm_probe_helper_test.c b/drivers/gpu/drm/tests/drm_probe_helper_test.c
index bc09ff38aca18eb06dc476310e1dbf372bc5545c..db0e4f5df275e8473ec916ed7a7cf16db96b81c5 100644
--- a/drivers/gpu/drm/tests/drm_probe_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_probe_helper_test.c
@@ -96,11 +96,11 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
 	const struct drm_connector_helper_tv_get_modes_test *params = test->param_value;
 	struct drm_probe_helper_test_priv *priv = test->priv;
 	struct drm_connector *connector = &priv->connector;
 	struct drm_cmdline_mode *cmdline = &connector->cmdline_mode;
 	struct drm_display_mode *mode;
-	const struct drm_display_mode *expected;
+	struct drm_display_mode *expected;
 	size_t len;
 	int ret;
 
 	if (params->cmdline) {
 		cmdline->tv_mode_specified = true;
@@ -132,10 +132,13 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
 		expected = params->expected_modes[0](priv->drm);
 		KUNIT_ASSERT_NOT_NULL(test, expected);
 
 		KUNIT_EXPECT_TRUE(test, drm_mode_equal(mode, expected));
 		KUNIT_EXPECT_TRUE(test, mode->type & DRM_MODE_TYPE_PREFERRED);
+
+		ret = drm_kunit_add_mode_destroy_action(test, expected);
+		KUNIT_ASSERT_EQ(test, ret, 0);
 	}
 
 	if (params->num_expected_modes >= 2) {
 		mode = list_next_entry(mode, head);
 		KUNIT_ASSERT_NOT_NULL(test, mode);
@@ -143,10 +146,13 @@ drm_test_connector_helper_tv_get_modes_check(struct kunit *test)
 		expected = params->expected_modes[1](priv->drm);
 		KUNIT_ASSERT_NOT_NULL(test, expected);
 
 		KUNIT_EXPECT_TRUE(test, drm_mode_equal(mode, expected));
 		KUNIT_EXPECT_FALSE(test, mode->type & DRM_MODE_TYPE_PREFERRED);
+
+		ret = drm_kunit_add_mode_destroy_action(test, expected);
+		KUNIT_ASSERT_EQ(test, ret, 0);
 	}
 
 	mutex_unlock(&priv->drm->mode_config.mutex);
 }
 

-- 
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (6 preceding siblings ...)
  2025-04-08  7:34 ` [PATCH 7/7] drm/tests: probe-helper: " Maxime Ripard
@ 2025-04-08  7:56 ` Thomas Zimmermann
  2025-04-08 15:34 ` Maxime Ripard
  8 siblings, 0 replies; 10+ messages in thread
From: Thomas Zimmermann @ 2025-04-08  7:56 UTC (permalink / raw)
  To: Maxime Ripard, Maarten Lankhorst, David Airlie, Simona Vetter
  Cc: Philipp Stanner, dri-devel, linux-kernel



Am 08.04.25 um 09:34 schrieb Maxime Ripard:
> Hi,
>
> Here's a series that fixes some memory leaks in our kunit tests that
> eventually show up in kmemleak.
>
> Let me know what you think,
> Maxime
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>

On the series:

Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>

> ---
> Maxime Ripard (7):
>        drm/tests: helpers: Create kunit helper to destroy a drm_display_mode
>        drm/tests: modeset: Fix drm_display_mode memory leak
>        drm/tests: modeset: Fix drm_display_mode memory leak
>        drm/tests: cmdline: Fix drm_display_mode memory leak
>        drm/tests: modes: Fix drm_display_mode memory leak
>        drm/tests: modes: Fix drm_display_mode memory leak
>        drm/tests: probe-helper: Fix drm_display_mode memory leak
>
>   drivers/gpu/drm/tests/drm_client_modeset_test.c |  9 ++++++++-
>   drivers/gpu/drm/tests/drm_cmdline_parser_test.c | 10 +++++++++-
>   drivers/gpu/drm/tests/drm_kunit_helpers.c       | 23 ++++++++++++++++++++++
>   drivers/gpu/drm/tests/drm_modes_test.c          | 26 +++++++++++++++++++++++++
>   drivers/gpu/drm/tests/drm_probe_helper_test.c   |  8 +++++++-
>   include/drm/drm_kunit_helpers.h                 |  3 +++
>   6 files changed, 76 insertions(+), 3 deletions(-)
> ---
> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
> change-id: 20250408-drm-kunit-drm-display-mode-memleak-49d05334c16e
>
> Best regards,

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks
  2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
                   ` (7 preceding siblings ...)
  2025-04-08  7:56 ` [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Thomas Zimmermann
@ 2025-04-08 15:34 ` Maxime Ripard
  8 siblings, 0 replies; 10+ messages in thread
From: Maxime Ripard @ 2025-04-08 15:34 UTC (permalink / raw)
  To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
	Maxime Ripard
  Cc: Philipp Stanner, dri-devel, linux-kernel

On Tue, 08 Apr 2025 09:34:06 +0200, Maxime Ripard wrote:
> Here's a series that fixes some memory leaks in our kunit tests that
> eventually show up in kmemleak.
> 
> Let me know what you think,
> Maxime
> 
> 
> [...]

Applied to misc/kernel.git (drm-misc-fixes).

Thanks!
Maxime

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-04-08 15:34 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-08  7:34 [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Maxime Ripard
2025-04-08  7:34 ` [PATCH 1/7] drm/tests: helpers: Create kunit helper to destroy a drm_display_mode Maxime Ripard
2025-04-08  7:34 ` [PATCH 2/7] drm/tests: modeset: Fix drm_display_mode memory leak Maxime Ripard
2025-04-08  7:34 ` [PATCH 3/7] " Maxime Ripard
2025-04-08  7:34 ` [PATCH 4/7] drm/tests: cmdline: " Maxime Ripard
2025-04-08  7:34 ` [PATCH 5/7] drm/tests: modes: " Maxime Ripard
2025-04-08  7:34 ` [PATCH 6/7] " Maxime Ripard
2025-04-08  7:34 ` [PATCH 7/7] drm/tests: probe-helper: " Maxime Ripard
2025-04-08  7:56 ` [PATCH 0/7] drm/tests: Fix drm_display_mode memory leaks Thomas Zimmermann
2025-04-08 15:34 ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox