drm/i915: Reduce test_and_set_bit to set_bit in i915_request_submit()
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 14 Jan 2021 13:56:12 +0000 (13:56 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Jan 2021 08:00:03 +0000 (08:00 +0000)
Avoid the full blown memory barrier of test_and_set_bit() by noting the
completed request and removing it from the lists.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Andi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210114135612.13210-5-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_request.c

index 973ecea..22e39d9 100644 (file)
@@ -551,8 +551,10 @@ bool __i915_request_submit(struct i915_request *request)
         * dropped upon retiring. (Otherwise if resubmit a *retired*
         * request, this would be a horrible use-after-free.)
         */
-       if (__i915_request_is_complete(request))
-               goto xfer;
+       if (__i915_request_is_complete(request)) {
+               list_del_init(&request->sched.link);
+               goto active;
+       }
 
        if (unlikely(intel_context_is_banned(request->context)))
                i915_request_set_error_once(request, -EIO);
@@ -587,11 +589,11 @@ bool __i915_request_submit(struct i915_request *request)
        engine->serial++;
        result = true;
 
-xfer:
-       if (!test_and_set_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags)) {
-               list_move_tail(&request->sched.link, &engine->active.requests);
-               clear_bit(I915_FENCE_FLAG_PQUEUE, &request->fence.flags);
-       }
+       GEM_BUG_ON(test_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags));
+       list_move_tail(&request->sched.link, &engine->active.requests);
+active:
+       clear_bit(I915_FENCE_FLAG_PQUEUE, &request->fence.flags);
+       set_bit(I915_FENCE_FLAG_ACTIVE, &request->fence.flags);
 
        /*
         * XXX Rollback bonded-execution on __i915_request_unsubmit()?