aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2015-04-13 11:03:03 -0400
committerJani Nikula <jani.nikula@intel.com>2015-04-14 09:09:05 -0400
commite0d6149b3debce1a7e17dfda7c2829935917dc58 (patch)
treefce1cc2151d4a8c9250230f4514b7bc7c3899dc8 /drivers/gpu/drm/i915
parent08d9bc920d465bbbbd762cac9383249c19bf69a2 (diff)
drm/i915: Move drm_framebuffer_unreference out of struct_mutex for takeover
intel_user_framebuffer_destroy() requires the struct_mutex for its object bookkeeping, so this means that all calls to drm_framebuffer_unreference must be held without that lock. This is a simplified version of the identically named patch by Chris Wilson. Regression from commit ab8d66752a9c28cd6c94fa173feacdfc1554aa03 Author: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Date: Mon Feb 2 15:44:15 2015 +0000 drm/i915: Track old framebuffer instead of object v2: Bikeshedding. References: https://bugs.freedesktop.org/show_bug.cgi?id=89166 Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 5b32b682bc3e..d547d9c8dda2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14259,6 +14259,7 @@ void intel_modeset_gem_init(struct drm_device *dev)
14259 struct drm_i915_private *dev_priv = dev->dev_private; 14259 struct drm_i915_private *dev_priv = dev->dev_private;
14260 struct drm_crtc *c; 14260 struct drm_crtc *c;
14261 struct drm_i915_gem_object *obj; 14261 struct drm_i915_gem_object *obj;
14262 int ret;
14262 14263
14263 mutex_lock(&dev->struct_mutex); 14264 mutex_lock(&dev->struct_mutex);
14264 intel_init_gt_powersave(dev); 14265 intel_init_gt_powersave(dev);
@@ -14283,16 +14284,18 @@ void intel_modeset_gem_init(struct drm_device *dev)
14283 * pinned & fenced. When we do the allocation it's too early 14284 * pinned & fenced. When we do the allocation it's too early
14284 * for this. 14285 * for this.
14285 */ 14286 */
14286 mutex_lock(&dev->struct_mutex);
14287 for_each_crtc(dev, c) { 14287 for_each_crtc(dev, c) {
14288 obj = intel_fb_obj(c->primary->fb); 14288 obj = intel_fb_obj(c->primary->fb);
14289 if (obj == NULL) 14289 if (obj == NULL)
14290 continue; 14290 continue;
14291 14291
14292 if (intel_pin_and_fence_fb_obj(c->primary, 14292 mutex_lock(&dev->struct_mutex);
14293 c->primary->fb, 14293 ret = intel_pin_and_fence_fb_obj(c->primary,
14294 c->primary->state, 14294 c->primary->fb,
14295 NULL)) { 14295 c->primary->state,
14296 NULL);
14297 mutex_unlock(&dev->struct_mutex);
14298 if (ret) {
14296 DRM_ERROR("failed to pin boot fb on pipe %d\n", 14299 DRM_ERROR("failed to pin boot fb on pipe %d\n",
14297 to_intel_crtc(c)->pipe); 14300 to_intel_crtc(c)->pipe);
14298 drm_framebuffer_unreference(c->primary->fb); 14301 drm_framebuffer_unreference(c->primary->fb);
@@ -14300,7 +14303,6 @@ void intel_modeset_gem_init(struct drm_device *dev)
14300 update_state_fb(c->primary); 14303 update_state_fb(c->primary);
14301 } 14304 }
14302 } 14305 }
14303 mutex_unlock(&dev->struct_mutex);
14304 14306
14305 intel_backlight_register(dev); 14307 intel_backlight_register(dev);
14306} 14308}