diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-02-12 02:53:18 -0500 |
|---|---|---|
| committer | Jani Nikula <jani.nikula@intel.com> | 2015-02-24 08:30:42 -0500 |
| commit | 6c31a614c43ae274546f736b2a33363e149c3dc2 (patch) | |
| tree | 789a38d65a150244fe4b8ade763340a600960452 | |
| parent | b3a38998f042b862f5ba4d7f2268f3a8dfb4883a (diff) | |
drm/i915: Check obj->vma_list under the struct_mutex
When we walk the list of vma, or even for protecting against concurrent
framebuffer creation, we must hold the struct_mutex or else a second
thread can corrupt the list as we walk it.
Fixes regression from
commit d7f46fc4e7323887494db13f063a8e59861fefb0
Author: Ben Widawsky <benjamin.widawsky@intel.com>
Date: Fri Dec 6 14:10:55 2013 -0800
drm/i915: Make pin count per VMA
References: https://bugs.freedesktop.org/show_bug.cgi?id=89085
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: stable@vger.kernel.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_tiling.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 7a24bd1a51f6..6377b22269ad 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -335,9 +335,10 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 335 | return -EINVAL; | 335 | return -EINVAL; |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | mutex_lock(&dev->struct_mutex); | ||
| 338 | if (i915_gem_obj_is_pinned(obj) || obj->framebuffer_references) { | 339 | if (i915_gem_obj_is_pinned(obj) || obj->framebuffer_references) { |
| 339 | drm_gem_object_unreference_unlocked(&obj->base); | 340 | ret = -EBUSY; |
| 340 | return -EBUSY; | 341 | goto err; |
| 341 | } | 342 | } |
| 342 | 343 | ||
| 343 | if (args->tiling_mode == I915_TILING_NONE) { | 344 | if (args->tiling_mode == I915_TILING_NONE) { |
| @@ -369,7 +370,6 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 369 | } | 370 | } |
| 370 | } | 371 | } |
| 371 | 372 | ||
| 372 | mutex_lock(&dev->struct_mutex); | ||
| 373 | if (args->tiling_mode != obj->tiling_mode || | 373 | if (args->tiling_mode != obj->tiling_mode || |
| 374 | args->stride != obj->stride) { | 374 | args->stride != obj->stride) { |
| 375 | /* We need to rebind the object if its current allocation | 375 | /* We need to rebind the object if its current allocation |
| @@ -424,6 +424,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
| 424 | obj->bit_17 = NULL; | 424 | obj->bit_17 = NULL; |
| 425 | } | 425 | } |
| 426 | 426 | ||
| 427 | err: | ||
| 427 | drm_gem_object_unreference(&obj->base); | 428 | drm_gem_object_unreference(&obj->base); |
| 428 | mutex_unlock(&dev->struct_mutex); | 429 | mutex_unlock(&dev->struct_mutex); |
| 429 | 430 | ||
