diff mbox series

[2/2] drm/i915: Restrict wait to client's timeline on i915_request alloc failure

Message ID 20180912143819.18804-2-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [1/2] drm/i915: Limit the backpressure for i915_request allocation | expand

Commit Message

Chris Wilson Sept. 12, 2018, 2:38 p.m. UTC
Let's try not to overly penalize the unlucky client by making them wait
for others to complete their work, and only apply the ratelimit if they
themselves have outstanding work. Still, we apply global reclaim to the
client (we need to scavenge some memory for it) so it doesn't got away
completely scot free.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_request.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 588bc5a4d18b..4866de572d73 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -733,12 +733,21 @@  i915_request_alloc(struct intel_engine_cs *engine, struct i915_gem_context *ctx)
 			      GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
 	if (unlikely(!rq)) {
 		/* Ratelimit ourselves to prevent oom from malicious clients */
-		ret = i915_gem_wait_for_idle(i915,
-					     I915_WAIT_LOCKED |
-					     I915_WAIT_INTERRUPTIBLE,
-					     1);
-		if (ret)
-			goto err_unreserve;
+		rq = i915_gem_active_raw(&ce->ring->timeline->last_request,
+					 &i915->drm.struct_mutex);
+		if (rq) {
+			long timeout;
+
+			timeout = i915_request_wait(rq,
+						    I915_WAIT_LOCKED |
+						    I915_WAIT_INTERRUPTIBLE,
+						    1);
+			if (timeout < 0) {
+				ret = timeout;
+				goto err_unreserve;
+			}
+		}
+		i915_retire_requests(i915);
 
 		/*
 		 * We've forced the client to stall and catch up with whatever