[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