@@ -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
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(-)