[Intel-gfx] [PATCH 62/70] drm/i915: Reduce locking inside busy ioctl
Chris Wilson
chris at chris-wilson.co.uk
Tue Apr 7 09:28:20 PDT 2015
We can do the trivial check for an inactive buffer without acquiring the
struct_mutex reducing contention. If we are required to flush the object
and check for retirements, then we do indeed have to resort to taking
the struct_mutex
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_gem.c | 49 ++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 43baac2c1e20..f9ea8c932a6a 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4522,34 +4522,37 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
struct drm_i915_gem_object *obj;
int ret;
- ret = i915_mutex_lock_interruptible(dev);
- if (ret)
- return ret;
-
obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
- if (&obj->base == NULL) {
- ret = -ENOENT;
- goto unlock;
- }
+ if (&obj->base == NULL)
+ return -ENOENT;
- /* Count all active objects as busy, even if they are currently not used
- * by the gpu. Users of this interface expect objects to eventually
- * become non-busy without any further actions, therefore emit any
- * necessary flushes here.
- */
- ret = i915_gem_object_flush_active(obj);
- if (ret)
- goto unref;
+ if (obj->active) {
+ ret = i915_mutex_lock_interruptible(dev);
+ if (ret)
+ goto unref;
- BUILD_BUG_ON(I915_NUM_RINGS > 16);
- args->busy = obj->active << 16;
- if (obj->last_write_req)
- args->busy |= obj->last_write_req->ring->id;
+ /* Count all active objects as busy, even if they are
+ * currently not used by the gpu. Users of this interface
+ * expect objects to eventually become non-busy without any
+ * further actions, therefore emit any necessary flushes here.
+ */
+ ret = i915_gem_object_flush_active(obj);
+ if (ret == 0) {
+ BUILD_BUG_ON(I915_NUM_RINGS > 16);
+ args->busy = obj->active << 16;
+ if (obj->last_write_req)
+ args->busy |= obj->last_write_req->ring->id;
+ }
+ drm_gem_object_unreference(&obj->base);
+ mutex_unlock(&dev->struct_mutex);
+ } else {
+ ret = 0;
+ args->busy = 0;
unref:
- drm_gem_object_unreference(&obj->base);
-unlock:
- mutex_unlock(&dev->struct_mutex);
+ drm_gem_object_unreference_unlocked(&obj->base);
+ }
+
return ret;
}
--
2.1.4
More information about the Intel-gfx
mailing list