aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_gem.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2018-05-25 12:39:24 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-06-28 06:41:05 -0400
commit5117bd898e8c0a31e8ab3a9b8523aecf0706e997 (patch)
tree5003d035c44116983a819d10d3a93ffab46ad86e /drivers/gpu/drm/omapdrm/omap_gem.c
parent3cbd0c587b129beaefb1405bbe43831e6bc9461e (diff)
drm/omap: gem: Fix mm_list locking
- None of the list walkings where protected. - Switch to a mutex since the list walking at device resume time can sleep when pinning buffers through the tiler. Only thing we need to be careful with here is that while we walk the list we can't unreference any gem objects, since the final unref would result in a recursive deadlock. But the only functions that walk the list is the device resume and debugfs dumping, so all safe. Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_gem.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_gem.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index cebbdf081e5d..4ba5d035c590 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -1000,6 +1000,7 @@ int omap_gem_resume(struct drm_device *dev)
1000 struct omap_gem_object *omap_obj; 1000 struct omap_gem_object *omap_obj;
1001 int ret = 0; 1001 int ret = 0;
1002 1002
1003 mutex_lock(&priv->list_lock);
1003 list_for_each_entry(omap_obj, &priv->obj_list, mm_list) { 1004 list_for_each_entry(omap_obj, &priv->obj_list, mm_list) {
1004 if (omap_obj->block) { 1005 if (omap_obj->block) {
1005 struct drm_gem_object *obj = &omap_obj->base; 1006 struct drm_gem_object *obj = &omap_obj->base;
@@ -1011,12 +1012,14 @@ int omap_gem_resume(struct drm_device *dev)
1011 omap_obj->roll, true); 1012 omap_obj->roll, true);
1012 if (ret) { 1013 if (ret) {
1013 dev_err(dev->dev, "could not repin: %d\n", ret); 1014 dev_err(dev->dev, "could not repin: %d\n", ret);
1014 return ret; 1015 goto done;
1015 } 1016 }
1016 } 1017 }
1017 } 1018 }
1018 1019
1019 return 0; 1020done:
1021 mutex_unlock(&priv->list_lock);
1022 return ret;
1020} 1023}
1021#endif 1024#endif
1022 1025
@@ -1086,9 +1089,9 @@ void omap_gem_free_object(struct drm_gem_object *obj)
1086 1089
1087 omap_gem_evict(obj); 1090 omap_gem_evict(obj);
1088 1091
1089 spin_lock(&priv->list_lock); 1092 mutex_lock(&priv->list_lock);
1090 list_del(&omap_obj->mm_list); 1093 list_del(&omap_obj->mm_list);
1091 spin_unlock(&priv->list_lock); 1094 mutex_unlock(&priv->list_lock);
1092 1095
1093 /* 1096 /*
1094 * We own the sole reference to the object at this point, but to keep 1097 * We own the sole reference to the object at this point, but to keep
@@ -1218,9 +1221,9 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
1218 goto err_release; 1221 goto err_release;
1219 } 1222 }
1220 1223
1221 spin_lock(&priv->list_lock); 1224 mutex_lock(&priv->list_lock);
1222 list_add(&omap_obj->mm_list, &priv->obj_list); 1225 list_add(&omap_obj->mm_list, &priv->obj_list);
1223 spin_unlock(&priv->list_lock); 1226 mutex_unlock(&priv->list_lock);
1224 1227
1225 return obj; 1228 return obj;
1226 1229