aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-09 15:23:51 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-16 16:04:24 -0400
commitdd4916c55aa4bacb26c343d0f0faa64e7aaef918 (patch)
tree8abe744474a06c1044101a37bf023b996507d8bd /drivers/gpu/drm/i915/intel_display.c
parent533df0fecdeda3e116ee8ffc8bfef96216e814bc (diff)
drm/i915: grab dev->struct_mutex around framebuffer_init
We look at gem state (like obj->tiling/obj->stride), we better have the relevant locks. Right now this doesn't matter much since most of these checks are a curtesy to safe buggy userspace, but I'd like to freeze the tiling once we have framebuffer objects attached. And then locking matters. Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0bbf9215637b..88e560070bec 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7285,14 +7285,21 @@ intel_framebuffer_create(struct drm_device *dev,
7285 return ERR_PTR(-ENOMEM); 7285 return ERR_PTR(-ENOMEM);
7286 } 7286 }
7287 7287
7288 ret = i915_mutex_lock_interruptible(dev);
7289 if (ret)
7290 goto err;
7291
7288 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); 7292 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj);
7289 if (ret) { 7293 mutex_unlock(&dev->struct_mutex);
7290 drm_gem_object_unreference_unlocked(&obj->base); 7294 if (ret)
7291 kfree(intel_fb); 7295 goto err;
7292 return ERR_PTR(ret);
7293 }
7294 7296
7295 return &intel_fb->base; 7297 return &intel_fb->base;
7298err:
7299 drm_gem_object_unreference_unlocked(&obj->base);
7300 kfree(intel_fb);
7301
7302 return ERR_PTR(ret);
7296} 7303}
7297 7304
7298static u32 7305static u32
@@ -9989,6 +9996,8 @@ int intel_framebuffer_init(struct drm_device *dev,
9989 int pitch_limit; 9996 int pitch_limit;
9990 int ret; 9997 int ret;
9991 9998
9999 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
10000
9992 if (obj->tiling_mode == I915_TILING_Y) { 10001 if (obj->tiling_mode == I915_TILING_Y) {
9993 DRM_DEBUG("hardware does not support tiling Y\n"); 10002 DRM_DEBUG("hardware does not support tiling Y\n");
9994 return -EINVAL; 10003 return -EINVAL;