aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-12-10 05:38:49 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-12-10 06:05:56 -0500
commita18c0af171bfb875012da26f23df051004726973 (patch)
tree44d20565fb6df932d615325a01fa44e034be2edb
parent393e872e1daa4958f862fdbd321bb9ba7f7acb0d (diff)
drm: Zero out DRM object memory upon cleanup
Drivers where the DRM objects have a lifetime that extends beyond that of the DRM device need to zero out the DRM object memory to void stale data such as properties. The DRM core code expects to operate on newly allocated and zeroed out objects and will behave unexpectedly, such as add duplicate properties, otherwise. Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/drm_crtc.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 3ce588200021..632e6eaf4c74 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -725,6 +725,8 @@ void drm_crtc_cleanup(struct drm_crtc *crtc)
725 WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state); 725 WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state);
726 if (crtc->state && crtc->funcs->atomic_destroy_state) 726 if (crtc->state && crtc->funcs->atomic_destroy_state)
727 crtc->funcs->atomic_destroy_state(crtc, crtc->state); 727 crtc->funcs->atomic_destroy_state(crtc, crtc->state);
728
729 memset(crtc, 0, sizeof(*crtc));
728} 730}
729EXPORT_SYMBOL(drm_crtc_cleanup); 731EXPORT_SYMBOL(drm_crtc_cleanup);
730 732
@@ -927,6 +929,8 @@ void drm_connector_cleanup(struct drm_connector *connector)
927 if (connector->state && connector->funcs->atomic_destroy_state) 929 if (connector->state && connector->funcs->atomic_destroy_state)
928 connector->funcs->atomic_destroy_state(connector, 930 connector->funcs->atomic_destroy_state(connector,
929 connector->state); 931 connector->state);
932
933 memset(connector, 0, sizeof(*connector));
930} 934}
931EXPORT_SYMBOL(drm_connector_cleanup); 935EXPORT_SYMBOL(drm_connector_cleanup);
932 936
@@ -1068,6 +1072,8 @@ void drm_bridge_cleanup(struct drm_bridge *bridge)
1068 list_del(&bridge->head); 1072 list_del(&bridge->head);
1069 dev->mode_config.num_bridge--; 1073 dev->mode_config.num_bridge--;
1070 drm_modeset_unlock_all(dev); 1074 drm_modeset_unlock_all(dev);
1075
1076 memset(bridge, 0, sizeof(*bridge));
1071} 1077}
1072EXPORT_SYMBOL(drm_bridge_cleanup); 1078EXPORT_SYMBOL(drm_bridge_cleanup);
1073 1079
@@ -1134,10 +1140,11 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
1134 drm_modeset_lock_all(dev); 1140 drm_modeset_lock_all(dev);
1135 drm_mode_object_put(dev, &encoder->base); 1141 drm_mode_object_put(dev, &encoder->base);
1136 kfree(encoder->name); 1142 kfree(encoder->name);
1137 encoder->name = NULL;
1138 list_del(&encoder->head); 1143 list_del(&encoder->head);
1139 dev->mode_config.num_encoder--; 1144 dev->mode_config.num_encoder--;
1140 drm_modeset_unlock_all(dev); 1145 drm_modeset_unlock_all(dev);
1146
1147 memset(encoder, 0, sizeof(*encoder));
1141} 1148}
1142EXPORT_SYMBOL(drm_encoder_cleanup); 1149EXPORT_SYMBOL(drm_encoder_cleanup);
1143 1150
@@ -1257,6 +1264,8 @@ void drm_plane_cleanup(struct drm_plane *plane)
1257 WARN_ON(plane->state && !plane->funcs->atomic_destroy_state); 1264 WARN_ON(plane->state && !plane->funcs->atomic_destroy_state);
1258 if (plane->state && plane->funcs->atomic_destroy_state) 1265 if (plane->state && plane->funcs->atomic_destroy_state)
1259 plane->funcs->atomic_destroy_state(plane, plane->state); 1266 plane->funcs->atomic_destroy_state(plane, plane->state);
1267
1268 memset(plane, 0, sizeof(*plane));
1260} 1269}
1261EXPORT_SYMBOL(drm_plane_cleanup); 1270EXPORT_SYMBOL(drm_plane_cleanup);
1262 1271