Commit ad222799 authored by Dave Airlie's avatar Dave Airlie

drm: fix memory leak around mode_group (v2)

This mode group id_list was never being freed.

v2: take David's suggestion to free in minor_free.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 444c9a08
...@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr ...@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr
return 0; 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 * 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. * the drm core's responsibility to set up mode control groups.
......
...@@ -294,6 +294,7 @@ static void drm_minor_free(struct drm_device *dev, unsigned int type) ...@@ -294,6 +294,7 @@ static void drm_minor_free(struct drm_device *dev, unsigned int type)
slot = drm_minor_get_slot(dev, type); slot = drm_minor_get_slot(dev, type);
if (*slot) { if (*slot) {
drm_mode_group_destroy(&(*slot)->mode_group);
kfree(*slot); kfree(*slot);
*slot = NULL; *slot = NULL;
} }
......
...@@ -915,6 +915,7 @@ extern const char *drm_get_tv_subconnector_name(int val); ...@@ -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 const char *drm_get_tv_select_name(int val);
extern void drm_fb_release(struct drm_file *file_priv); 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 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 bool drm_probe_ddc(struct i2c_adapter *adapter);
extern struct edid *drm_get_edid(struct drm_connector *connector, extern struct edid *drm_get_edid(struct drm_connector *connector,
struct i2c_adapter *adapter); struct i2c_adapter *adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment