drm: fix memory leak around mode_group
Subsystems (2)
Dave Airlie
maintainerPATCH 1/1 drm: fix memory leak around mode_group
From: Dave Airlie <[email protected]>
This mode group id_list was never being freed.
Signed-off-by Dave Airlie <[email protected]>
--- 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
@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *grreturn 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
@@ -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
@@ -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
Hi
Quoted 33 lines · Dave Airlie
From: Dave Airlie <[email protected]>
This mode group
id_listwas never being freed.Signed-off-by Dave Airlie <[email protected]>--- 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@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *grreturn 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
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