summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-01-08 11:52:55 -0800
committerEric Anholt <eric@anholt.net>2013-01-08 14:51:36 -0800
commit50d0324f3f124b1a0bed2b8d137c6c26287eff00 (patch)
tree640b2b49b1b169586c063e56cd79f0e7bc5de706
parent4fb9377a357348d7e1a469d0febcad311236163f (diff)
drm/i915: Hold the table lock across all our object lookups in execbuf.
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 6cd3e1c1629..f7084ec95fd 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -551,8 +551,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
/* reacquire the objects */
eb_reset(eb);
for (i = 0; i < count; i++) {
- obj = to_intel_bo(drm_gem_object_lookup(dev, file,
- exec[i].handle));
+ obj = to_intel_bo(drm_gem_object_lookup_locked(file,
+ exec[i].handle));
if (&obj->base == NULL) {
DRM_DEBUG("Invalid object handle %d at index %d\n",
exec[i].handle, i);
@@ -869,12 +869,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
}
/* Look up object handles */
+ mutex_lock(&file->table_lock);
INIT_LIST_HEAD(&objects);
for (i = 0; i < args->buffer_count; i++) {
struct drm_i915_gem_object *obj;
- obj = to_intel_bo(drm_gem_object_lookup(dev, file,
- exec[i].handle));
+ obj = to_intel_bo(drm_gem_object_lookup_locked(file,
+ exec[i].handle));
if (&obj->base == NULL) {
DRM_DEBUG("Invalid object handle %d at index %d\n",
exec[i].handle, i);
@@ -993,6 +994,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
i915_gem_execbuffer_retire_commands(dev, file, ring);
err:
+ mutex_unlock(&file->table_lock);
eb_destroy(eb);
while (!list_empty(&objects)) {
struct drm_i915_gem_object *obj;