Under mempressure, our goal is to allow ourselves sufficient time to
reclaim the RCU protected slabs without overly penalizing our clients.
Currently, we use a 1 jiffie wait if the client is still active as a
means of throttling the allocations, but we can instead wait for the end
of the RCU grace period of the clients previous allocation.

Suggested-by: Daniel Vetter <daniel.vet...@ffwll.ch>
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_request.c | 14 ++++++--------
 drivers/gpu/drm/i915/i915_request.h |  8 ++++++++
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_request.c 
b/drivers/gpu/drm/i915/i915_request.c
index 72bcb4ca0c45..a492385b2089 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -732,17 +732,13 @@ i915_request_alloc(struct intel_engine_cs *engine, struct 
i915_gem_context *ctx)
        rq = kmem_cache_alloc(i915->requests,
                              GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
        if (unlikely(!rq)) {
+               i915_retire_requests(i915);
+
                /* Ratelimit ourselves to prevent oom from malicious clients */
                rq = i915_gem_active_raw(&ce->ring->timeline->last_request,
                                         &i915->drm.struct_mutex);
-               if (rq && i915_request_wait(rq,
-                                           I915_WAIT_LOCKED |
-                                           I915_WAIT_INTERRUPTIBLE,
-                                           1) == -EINTR) {
-                       ret = -EINTR;
-                       goto err_unreserve;
-               }
-               i915_retire_requests(i915);
+               if (rq)
+                       cond_synchronize_rcu(rq->rcustate);
 
                /*
                 * We've forced the client to stall and catch up with whatever
@@ -762,6 +758,8 @@ i915_request_alloc(struct intel_engine_cs *engine, struct 
i915_gem_context *ctx)
                }
        }
 
+       rq->rcustate = get_state_synchronize_rcu();
+
        INIT_LIST_HEAD(&rq->active_list);
        rq->i915 = i915;
        rq->engine = engine;
diff --git a/drivers/gpu/drm/i915/i915_request.h 
b/drivers/gpu/drm/i915/i915_request.h
index 9898301ab7ef..7fa94b024968 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -100,6 +100,14 @@ struct i915_request {
        struct i915_timeline *timeline;
        struct intel_signal_node signaling;
 
+       /*
+        * The rcu epoch of when this request was allocated. Used to judiciously
+        * apply backpressure on future allocations to ensure that under
+        * mempressure there is sufficient RCU ticks for us to reclaim our
+        * RCU protected slabs.
+        */
+       unsigned long rcustate;
+
        /*
         * Fences for the various phases in the request's lifetime.
         *
-- 
2.19.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to