[PATCH 4/4] breadcrumbsref

Chris Wilson chris at chris-wilson.co.uk
Tue Jul 14 18:04:01 UTC 2020


---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 26 +++++++++++++++------
 drivers/gpu/drm/i915/i915_request.c         |  2 --
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 87fd06d3eb3f..0d77d74c8462 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -28,6 +28,7 @@
 
 #include "i915_drv.h"
 #include "i915_trace.h"
+#include "intel_context.h"
 #include "intel_gt_pm.h"
 #include "intel_gt_requests.h"
 
@@ -142,16 +143,16 @@ static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
 	intel_engine_add_retire(engine, tl);
 }
 
-static void __signal_request(struct i915_request *rq, struct list_head *signals)
+static bool __signal_request(struct i915_request *rq, struct list_head *signals)
 {
 	GEM_BUG_ON(!test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags));
 	clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
 
 	if (!__dma_fence_signal(&rq->fence))
-		return;
+		return false;
 
-	i915_request_get(rq);
 	list_add_tail(&rq->signal_link, signals);
+	return true;
 }
 
 static void signal_irq_work(struct irq_work *work)
@@ -176,6 +177,7 @@ static void signal_irq_work(struct irq_work *work)
 			struct i915_request *rq =
 				list_entry(pos, typeof(*rq), signal_link);
 
+			GEM_BUG_ON(rq->context != ce);
 			GEM_BUG_ON(!check_signal_order(ce, rq));
 			if (!__request_completed(rq))
 				break;
@@ -185,7 +187,8 @@ static void signal_irq_work(struct irq_work *work)
 			 * spinlock as the callback chain may end up adding
 			 * more signalers to the same context or engine.
 			 */
-			__signal_request(rq, &signal);
+			if (!__signal_request(rq, &signal))
+				i915_request_put(rq);
 		}
 
 		/*
@@ -199,6 +202,7 @@ static void signal_irq_work(struct irq_work *work)
 			if (&ce->signals == pos) { /* now empty */
 				list_del_init(&ce->signal_link);
 				add_retire(b, ce->timeline);
+				intel_context_put(ce);
 			}
 		}
 	}
@@ -293,11 +297,13 @@ void intel_engine_transfer_stale_breadcrumbs(struct intel_engine_cs *engine,
 			GEM_BUG_ON(rq->engine != engine);
 			GEM_BUG_ON(!__request_completed(rq));
 
-			__signal_request(rq, &b->signaled_requests);
+			if (!__signal_request(rq, &b->signaled_requests))
+				i915_request_put(rq);
 		}
 
 		INIT_LIST_HEAD(&ce->signals);
 		list_del_init(&ce->signal_link);
+		intel_context_put(ce);
 
 		irq_work_queue(&b->irq_work);
 	}
@@ -341,11 +347,14 @@ static void insert_breadcrumb(struct i915_request *rq,
 			break;
 	}
 	list_add(&rq->signal_link, pos);
-	if (pos == &ce->signals) /* catch transitions from empty list */
+	if (pos == &ce->signals) { /* catch transitions from empty list */
 		list_move_tail(&ce->signal_link, &b->signalers);
+		intel_context_get(ce);
+	}
 	GEM_BUG_ON(!check_signal_order(ce, rq));
 
 	set_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
+	i915_request_get(rq);
 }
 
 bool i915_request_enable_breadcrumb(struct i915_request *rq)
@@ -389,10 +398,13 @@ void i915_request_cancel_breadcrumb(struct i915_request *rq)
 		struct intel_context *ce = rq->context;
 
 		list_del(&rq->signal_link);
-		if (list_empty(&ce->signals))
+		if (list_empty(&ce->signals)) {
 			list_del_init(&ce->signal_link);
+			intel_context_put(ce);
+		}
 
 		clear_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags);
+		i915_request_put(rq);
 	}
 	spin_unlock(&b->irq_lock);
 }
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index df82b31dc35c..b9ab26f0b446 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -315,8 +315,6 @@ bool i915_request_retire(struct i915_request *rq)
 	i915_request_mark_complete(rq);
 	if (!i915_request_signaled(rq))
 		dma_fence_signal_locked(&rq->fence);
-	if (test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags))
-		i915_request_cancel_breadcrumb(rq);
 	if (i915_request_has_waitboost(rq)) {
 		GEM_BUG_ON(!atomic_read(&rq->engine->gt->rps.num_waiters));
 		atomic_dec(&rq->engine->gt->rps.num_waiters);
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list