[Intel-gfx] [PATCH] drm/i915: Do an optimistic is-busy? check first

Chris Wilson chris at chris-wilson.co.uk
Thu Sep 5 16:29:01 CEST 2013


The busy-ioctl is frequently called as it is used by clients treating
buffer objects like fences and polling for completion. These frequent
calls are especially subject to contention with multiple clients leading
to a lot of busy-waiting due to mutex_spin_on_owner()). We can, in most
cases, report whether the bo is idle without touching struct_mutex, and
only resort to hitting the lock if we need to queue flushes for the bo.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3b942ce..fed0b39 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4068,18 +4068,34 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
 {
 	struct drm_i915_gem_busy *args = data;
 	struct drm_i915_gem_object *obj;
+	struct intel_ring_buffer *ring;
 	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;
+		goto out_unlocked;
 	}
 
+	/* Do an optimistic check for activity - we don't care about userspace
+	 * racing with itself, that is always problematic.
+	 */
+	ring = obj->ring;
+	if (ring && obj->last_read_seqno == ring->outstanding_lazy_seqno)
+		goto lock_and_flush;
+
+	args->busy = ring ? intel_ring_flag(ring) << 16 | 1 : 0;
+	ret = 0;
+
+out_unlocked:
+	drm_gem_object_unreference_unlocked(&obj->base);
+	return ret;
+
+lock_and_flush:
+	ret = i915_mutex_lock_interruptible(dev);
+	if (ret)
+		goto out_unlocked;
+
 	/* 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
@@ -4094,7 +4110,6 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
 	}
 
 	drm_gem_object_unreference(&obj->base);
-unlock:
 	mutex_unlock(&dev->struct_mutex);
 	return ret;
 }
-- 
1.8.4.rc3




More information about the Intel-gfx mailing list