Re: [PATCH] drm/i915/gt: Remove direct invocation of breadcrumb signaling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 02/12/2019 11:08, Chris Wilson wrote:
Only signal the breadcrumbs from inside the irq_work, simplifying our
interface and calling conventions.

Making Icelake signaling latency look better? :) A few more words about motivation would be good.

Regards,

Tvrtko


Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
---
  drivers/gpu/drm/i915/gt/intel_breadcrumbs.c   | 27 +++++++------------
  drivers/gpu/drm/i915/gt/intel_engine.h        |  4 +--
  drivers/gpu/drm/i915/gt/intel_gt_irq.c        | 12 ++++-----
  drivers/gpu/drm/i915/gt/intel_lrc.c           |  2 +-
  drivers/gpu/drm/i915/gt/intel_reset.c         |  4 +--
  .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
  drivers/gpu/drm/i915/gt/intel_rps.c           |  2 +-
  drivers/gpu/drm/i915/gt/mock_engine.c         |  2 +-
  drivers/gpu/drm/i915/i915_irq.c               |  8 +++---
  drivers/gpu/drm/i915/i915_request.c           |  2 +-
  10 files changed, 27 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 55317081d48b..6acf8208ba79 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -127,16 +127,15 @@ __dma_fence_signal__notify(struct dma_fence *fence,
  	}
  }
-void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine)
+static void signal_irq_work(struct irq_work *work)
  {
-	struct intel_breadcrumbs *b = &engine->breadcrumbs;
+	struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
  	const ktime_t timestamp = ktime_get();
  	struct intel_context *ce, *cn;
  	struct list_head *pos, *next;
-	unsigned long flags;
  	LIST_HEAD(signal);
- spin_lock_irqsave(&b->irq_lock, flags);
+	spin_lock(&b->irq_lock);
if (b->irq_armed && list_empty(&b->signalers))
  		__intel_breadcrumbs_disarm_irq(b);
@@ -182,31 +181,23 @@ void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine)
  		}
  	}
- spin_unlock_irqrestore(&b->irq_lock, flags);
+	spin_unlock(&b->irq_lock);
list_for_each_safe(pos, next, &signal) {
  		struct i915_request *rq =
  			list_entry(pos, typeof(*rq), signal_link);
  		struct list_head cb_list;
- spin_lock_irqsave(&rq->lock, flags);
+		spin_lock(&rq->lock);
  		list_replace(&rq->fence.cb_list, &cb_list);
  		__dma_fence_signal__timestamp(&rq->fence, timestamp);
  		__dma_fence_signal__notify(&rq->fence, &cb_list);
-		spin_unlock_irqrestore(&rq->lock, flags);
+		spin_unlock(&rq->lock);
i915_request_put(rq);
  	}
  }
-static void signal_irq_work(struct irq_work *work)
-{
-	struct intel_engine_cs *engine =
-		container_of(work, typeof(*engine), breadcrumbs.irq_work);
-
-	intel_engine_breadcrumbs_irq(engine);
-}
-
  static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
  {
  	struct intel_engine_cs *engine =
@@ -281,9 +272,9 @@ bool i915_request_enable_breadcrumb(struct i915_request *rq)
/*
  		 * We keep the seqno in retirement order, so we can break
-		 * inside intel_engine_breadcrumbs_irq as soon as we've passed
-		 * the last completed request (or seen a request that hasn't
-		 * event started). We could iterate the timeline->requests list,
+		 * inside intel_engine_signal_breadcrumbs as soon as we've
+		 * passed the last completed request (or seen a request that
+		 * hasn't event started). We could walk the timeline->requests,
  		 * but keeping a separate signalers_list has the advantage of
  		 * hopefully being much smaller than the full list and so
  		 * provides faster iteration and detection when there are no
diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h
index 01765a7ec18f..e1750d083c90 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -206,13 +206,11 @@ void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
  void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
static inline void
-intel_engine_queue_breadcrumbs(struct intel_engine_cs *engine)
+intel_engine_signal_breadcrumbs(struct intel_engine_cs *engine)
  {
  	irq_work_queue(&engine->breadcrumbs.irq_work);
  }
-void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine);
-
  void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine);
  void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_irq.c b/drivers/gpu/drm/i915/gt/intel_gt_irq.c
index 332b12a574fb..f796bdf1ed30 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_irq.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_irq.c
@@ -28,7 +28,7 @@ cs_irq_handler(struct intel_engine_cs *engine, u32 iir)
  		tasklet = true;
if (iir & GT_RENDER_USER_INTERRUPT) {
-		intel_engine_queue_breadcrumbs(engine);
+		intel_engine_signal_breadcrumbs(engine);
  		tasklet |= intel_engine_needs_breadcrumb_tasklet(engine);
  	}
@@ -245,9 +245,9 @@ void gen11_gt_irq_postinstall(struct intel_gt *gt)
  void gen5_gt_irq_handler(struct intel_gt *gt, u32 gt_iir)
  {
  	if (gt_iir & GT_RENDER_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine_class[RENDER_CLASS][0]);
+		intel_engine_signal_breadcrumbs(gt->engine_class[RENDER_CLASS][0]);
  	if (gt_iir & ILK_BSD_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine_class[VIDEO_DECODE_CLASS][0]);
+		intel_engine_signal_breadcrumbs(gt->engine_class[VIDEO_DECODE_CLASS][0]);
  }
static void gen7_parity_error_irq_handler(struct intel_gt *gt, u32 iir)
@@ -271,11 +271,11 @@ static void gen7_parity_error_irq_handler(struct intel_gt *gt, u32 iir)
  void gen6_gt_irq_handler(struct intel_gt *gt, u32 gt_iir)
  {
  	if (gt_iir & GT_RENDER_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine_class[RENDER_CLASS][0]);
+		intel_engine_signal_breadcrumbs(gt->engine_class[RENDER_CLASS][0]);
  	if (gt_iir & GT_BSD_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine_class[VIDEO_DECODE_CLASS][0]);
+		intel_engine_signal_breadcrumbs(gt->engine_class[VIDEO_DECODE_CLASS][0]);
  	if (gt_iir & GT_BLT_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine_class[COPY_ENGINE_CLASS][0]);
+		intel_engine_signal_breadcrumbs(gt->engine_class[COPY_ENGINE_CLASS][0]);
if (gt_iir & (GT_BLT_CS_ERROR_INTERRUPT |
  		      GT_BSD_CS_ERROR_INTERRUPT |
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index fef4b7e823f5..ab6f2171e7ac 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1475,7 +1475,7 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve,
  	if (!list_empty(&ve->context.signal_link)) {
  		list_move_tail(&ve->context.signal_link,
  			       &engine->breadcrumbs.signalers);
-		intel_engine_queue_breadcrumbs(engine);
+		intel_engine_signal_breadcrumbs(engine);
  	}
  	spin_unlock(&old->breadcrumbs.irq_lock);
  }
diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c
index 36189238e13c..7d65aaf7f814 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -736,7 +736,7 @@ static void reset_finish_engine(struct intel_engine_cs *engine)
  	engine->reset.finish(engine);
  	intel_uncore_forcewake_put(engine->uncore, FORCEWAKE_ALL);
- intel_engine_breadcrumbs_irq(engine);
+	intel_engine_signal_breadcrumbs(engine);
  }
static void reset_finish(struct intel_gt *gt, intel_engine_mask_t awake)
@@ -765,7 +765,7 @@ static void nop_submit_request(struct i915_request *request)
  	i915_request_mark_complete(request);
  	spin_unlock_irqrestore(&engine->active.lock, flags);
- intel_engine_queue_breadcrumbs(engine);
+	intel_engine_signal_breadcrumbs(engine);
  }
static void __intel_gt_set_wedged(struct intel_gt *gt)
diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
index dcdeef0a776f..0c189807fe36 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
@@ -722,7 +722,7 @@ static int xcs_resume(struct intel_engine_cs *engine)
  	}
/* Papering over lost _interrupts_ immediately following the restart */
-	intel_engine_queue_breadcrumbs(engine);
+	intel_engine_signal_breadcrumbs(engine);
  out:
  	intel_uncore_forcewake_put(engine->uncore, FORCEWAKE_ALL);
diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c b/drivers/gpu/drm/i915/gt/intel_rps.c
index 08a38a3b90b0..836bbc296158 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -1566,7 +1566,7 @@ void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir)
  		return;
if (pm_iir & PM_VEBOX_USER_INTERRUPT)
-		intel_engine_breadcrumbs_irq(gt->engine[VECS0]);
+		intel_engine_signal_breadcrumbs(gt->engine[VECS0]);
if (pm_iir & PM_VEBOX_CS_ERROR_INTERRUPT)
  		DRM_DEBUG("Command parser error, pm_iir 0x%08x\n", pm_iir);
diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
index 83f549d203a0..39df9d49a134 100644
--- a/drivers/gpu/drm/i915/gt/mock_engine.c
+++ b/drivers/gpu/drm/i915/gt/mock_engine.c
@@ -77,7 +77,7 @@ static void advance(struct i915_request *request)
  	i915_request_mark_complete(request);
  	GEM_BUG_ON(!i915_request_completed(request));
- intel_engine_queue_breadcrumbs(request->engine);
+	intel_engine_signal_breadcrumbs(request->engine);
  }
static void hw_delay_complete(struct timer_list *t)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 8b338744eddf..88689ff50d61 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -3601,7 +3601,7 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg)
  		intel_uncore_write16(&dev_priv->uncore, GEN2_IIR, iir);
if (iir & I915_USER_INTERRUPT)
-			intel_engine_breadcrumbs_irq(dev_priv->engine[RCS0]);
+			intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
if (iir & I915_MASTER_ERROR_INTERRUPT)
  			i8xx_error_irq_handler(dev_priv, eir, eir_stuck);
@@ -3706,7 +3706,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
  		I915_WRITE(GEN2_IIR, iir);
if (iir & I915_USER_INTERRUPT)
-			intel_engine_breadcrumbs_irq(dev_priv->engine[RCS0]);
+			intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
if (iir & I915_MASTER_ERROR_INTERRUPT)
  			i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
@@ -3848,10 +3848,10 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
  		I915_WRITE(GEN2_IIR, iir);
if (iir & I915_USER_INTERRUPT)
-			intel_engine_breadcrumbs_irq(dev_priv->engine[RCS0]);
+			intel_engine_signal_breadcrumbs(dev_priv->engine[RCS0]);
if (iir & I915_BSD_USER_INTERRUPT)
-			intel_engine_breadcrumbs_irq(dev_priv->engine[VCS0]);
+			intel_engine_signal_breadcrumbs(dev_priv->engine[VCS0]);
if (iir & I915_MASTER_ERROR_INTERRUPT)
  			i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index a558f64186fa..3109b8a79b9f 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -415,7 +415,7 @@ bool __i915_request_submit(struct i915_request *request)
  	if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags) &&
  	    !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &request->fence.flags) &&
  	    !i915_request_enable_breadcrumb(request))
-		intel_engine_queue_breadcrumbs(engine);
+		intel_engine_signal_breadcrumbs(engine);
__notify_execute_cb(request);
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux