]> www.infradead.org Git - users/hch/configfs.git/commitdiff
drm/i915/gt: Tidy up checking active timelines during retirement
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 23 Dec 2019 15:08:33 +0000 (15:08 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 23 Dec 2019 17:33:42 +0000 (17:33 +0000)
Use the status of the timeline request list as we retire it to determine
if the timeline is still active.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Acked-by: Andi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191223150833.2329366-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_gt_requests.c

index b4f04614230e4228cfa47373abfec91289d3e680..9e75fa1b6bc1ca896ea67bb448139ac4dd6b4ce2 100644 (file)
 #include "intel_gt_requests.h"
 #include "intel_timeline.h"
 
-static void retire_requests(struct intel_timeline *tl)
+static bool retire_requests(struct intel_timeline *tl)
 {
        struct i915_request *rq, *rn;
 
        list_for_each_entry_safe(rq, rn, &tl->requests, link)
                if (!i915_request_retire(rq))
-                       break;
+                       return false;
+
+       /* And check nothing new was submitted */
+       return !i915_active_fence_isset(&tl->last_request);
 }
 
 static bool flush_submission(struct intel_gt *gt)
@@ -29,6 +32,9 @@ static bool flush_submission(struct intel_gt *gt)
        enum intel_engine_id id;
        bool active = false;
 
+       if (!intel_gt_pm_is_awake(gt))
+               return false;
+
        for_each_engine(engine, gt, id) {
                active |= intel_engine_flush_submission(engine);
                active |= flush_work(&engine->retire_work);
@@ -145,7 +151,7 @@ long intel_gt_retire_requests_timeout(struct intel_gt *gt, long timeout)
                        }
                }
 
-               retire_requests(tl);
+               active_count += !retire_requests(tl);
 
                spin_lock(&timelines->lock);
 
@@ -153,8 +159,6 @@ long intel_gt_retire_requests_timeout(struct intel_gt *gt, long timeout)
                list_safe_reset_next(tl, tn, link);
                if (atomic_dec_and_test(&tl->active_count))
                        list_del(&tl->link);
-               else
-                       active_count += i915_active_fence_isset(&tl->last_request);
 
                mutex_unlock(&tl->mutex);