Quoting Chris Wilson (2019-04-17 08:56:26)
> @@ -294,8 +304,8 @@ void i915_request_cancel_breadcrumb(struct i915_request
> *rq)
> {
> struct intel_breadcrumbs *b = &rq->engine->breadcrumbs;
>
> - if (!test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags))
> - return;
> + lockdep_assert_held(&rq->lock);
> + lockdep_assert_irqs_disabled();
>
> spin_lock(&b->irq_lock);
> if (test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags)) {
@@ -307,6 +307,12 @@ void i915_request_cancel_breadcrumb(struct i915_request
*rq)
lockdep_assert_held(&rq->lock);
lockdep_assert_irqs_disabled();
+ /*
+ * We must wait for b->irq_lock so that we know the interrupt handler
+ * has released its reference to the intel_context and has completed
+ * the DMA_FENCE_FLAG_SIGNALED_BIT/I915_FENCE_FLAG_SIGNAL dance (if
+ * required).
+ */
spin_lock(&b->irq_lock);
if (test_bit(I915_FENCE_FLAG_SIGNAL, &rq->fence.flags)) {
struct intel_context *ce = rq->hw_context;
Just a touch of explanation,
-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx