Skip to contentSkip to conversation

drm: fix memory leak around mode_group

PATCH In review Dave Airlie 2 participants 2 messages Apr 18, 2014 – Apr 22, 2014

Subsystems (2)
lore
Share & tools
lore

Dave Airlie

author maintainer
#0 lore raw

PATCH 1/1 drm: fix memory leak around mode_group

From: Dave Airlie <[email protected]>

This mode group id_list was never being freed.

---
 drivers/gpu/drm/drm_crtc.c | 6 ++++++
 drivers/gpu/drm/drm_stub.c | 1 +
 include/drm/drm_crtc.h     | 1 +
 3 files changed, 8 insertions(+)
drivers/gpu/drm/drm_crtc.c +6 -0
index d8b7099..a3fe324 100644
@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr
 	return 0;
 }
 
+void drm_mode_group_destroy(struct drm_mode_group *group)
+{
+	kfree(group->id_list);
+	group->id_list = NULL;
+}
+
 /*
  * NOTE: Driver's shouldn't ever call drm_mode_group_init_legacy_group - it is
  * the drm core's responsibility to set up mode control groups.
drivers/gpu/drm/drm_stub.c +1 -0
index 4c24c3a..80bc780 100644
@@ -371,6 +371,7 @@ static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
 	spin_unlock_irqrestore(&drm_minor_lock, flags);
 	minor->index = 0;
 
+	drm_mode_group_destroy(&minor->mode_group);
 	drm_debugfs_cleanup(minor);
 	drm_sysfs_device_remove(minor);
 }
include/drm/drm_crtc.h +1 -0
index e55fccb..c6b9e8a 100644
@@ -915,6 +915,7 @@ extern const char *drm_get_tv_subconnector_name(int val);
 extern const char *drm_get_tv_select_name(int val);
 extern void drm_fb_release(struct drm_file *file_priv);
 extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
+extern void drm_mode_group_destroy(struct drm_mode_group *group);
 extern bool drm_probe_ddc(struct i2c_adapter *adapter);
 extern struct edid *drm_get_edid(struct drm_connector *connector,
 				 struct i2c_adapter *adapter);
Signature · 1 line
1.9.0
#1 lore raw

Hi

Quoted 33 lines · Dave Airlie

From: Dave Airlie <[email protected]>

This mode group id_list was never being freed.

---
 drivers/gpu/drm/drm_crtc.c | 6 ++++++
 drivers/gpu/drm/drm_stub.c | 1 +
 include/drm/drm_crtc.h     | 1 +
 3 files changed, 8 insertions(+)
drivers/gpu/drm/drm_crtc.c +6 -0
index d8b7099..a3fe324 100644
@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr
        return 0;
 }
 
+void drm_mode_group_destroy(struct drm_mode_group *group)
+{
+       kfree(group->id_list);
+       group->id_list = NULL;
+}
+
 /*
  * NOTE: Driver's shouldn't ever call drm_mode_group_init_legacy_group - it is
  * the drm core's responsibility to set up mode control groups.
drivers/gpu/drm/drm_stub.c +0 -0
index 4c24c3a..80bc780 100644

drivers/gpu/drm/drm_stub.c static void drm_minor_unregister(struct drm_device *dev, unsigned int type) · line 374

Quoted 4 lines
drivers/gpu/drm/drm_stub.c +1 -0
@@ -371,6 +371,7 @@ static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
        spin_unlock_irqrestore(&drm_minor_lock, flags);
        minor->index = 0;
 
+       drm_mode_group_destroy(&minor->mode_group);

Nice catch, but this is racy regarding drm_unplug_dev(). Can we do it in drm_minor_free() instead? Imho, given that this is a memory-cleanup, not a runtime helper, it belongs there, anyway.

Thanks
David