[PATCH 50/50] bread

Chris Wilson chris at chris-wilson.co.uk
Fri Jan 11 23:25:46 UTC 2019


---
 drivers/gpu/drm/i915/intel_breadcrumbs.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index be928bd204d3..f9fd967bb50c 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -385,20 +385,23 @@ bool intel_engine_enable_signaling(struct i915_request *rq)
 		return true;
 
 	spin_lock(&b->irq_lock);
-	if (test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags)) {
+	if (test_bit(I915_FENCE_FLAG_ACTIVE, &rq->fence.flags) &&
+	    !i915_request_completed(rq)) {
 		struct intel_context *ce = rq->hw_context;
-		struct i915_request *pos;
+		struct list_head *pos;
 
 		__intel_breadcrumbs_arm_irq(b);
 
-		list_for_each_entry_reverse(pos, &ce->signals, signal_link) {
-			if (i915_seqno_passed(rq->fence.seqno,
-					      pos->fence.seqno))
+		list_for_each_prev(pos, &ce->signals) {
+			struct i915_request *it =
+				list_entry(pos, typeof(*it), signal_link);
+
+			if (i915_seqno_passed(rq->fence.seqno, it->fence.seqno))
 				break;
 		}
-		list_add(&rq->signal_link, &pos->signal_link);
-
-		list_move_tail(&ce->signal_link, &b->signalers);
+		list_add(&rq->signal_link, pos);
+		if (pos == &ce->signals)
+			list_move_tail(&ce->signal_link, &b->signalers);
 
 		set_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
 	}
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list