diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-09 15:23:51 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-16 16:04:24 -0400 |
commit | dd4916c55aa4bacb26c343d0f0faa64e7aaef918 (patch) | |
tree | 8abe744474a06c1044101a37bf023b996507d8bd /drivers/gpu/drm/i915/intel_display.c | |
parent | 533df0fecdeda3e116ee8ffc8bfef96216e814bc (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.c | 19 |
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; |
7298 | err: | ||
7299 | drm_gem_object_unreference_unlocked(&obj->base); | ||
7300 | kfree(intel_fb); | ||
7301 | |||
7302 | return ERR_PTR(ret); | ||
7296 | } | 7303 | } |
7297 | 7304 | ||
7298 | static u32 | 7305 | static 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; |