[Intel-gfx] [PATCH] drm/i915/execlists: Trim irq handler
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Mar 27 09:10:54 UTC 2017
On 25/03/2017 20:10, Chris Wilson wrote:
> I noticed that gcc was spilling the CSB to the stack, so rearrange the
> code to be more compact. Spilling in this function is slightly more
> interesting due to the mmio reads acting as memory barriers and so
> end up flushing the stack spills. Still miniscule to having to do at
> least the pair of uncached reads :(
>
> function old new delta
> intel_lrc_irq_handler 1039 878 -161
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_lrc.c | 27 ++++++++++++---------------
> 1 file changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index d45e6d13545a..e9822b0b308d 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -506,7 +506,7 @@ static void intel_lrc_irq_handler(unsigned long data)
> dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine));
> u32 __iomem *buf =
> dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_BUF_LO(engine, 0));
> - unsigned int csb, head, tail;
> + unsigned int head, tail;
>
> /* The write will be ordered by the uncached read (itself
> * a memory barrier), so we do not need another in the form
> @@ -519,17 +519,14 @@ static void intel_lrc_irq_handler(unsigned long data)
> * is set and we do a new loop.
> */
> __clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
> - csb = readl(csb_mmio);
> - head = GEN8_CSB_READ_PTR(csb);
> - tail = GEN8_CSB_WRITE_PTR(csb);
> - if (head == tail)
> - break;
> + head = readl(csb_mmio);
> + tail = GEN8_CSB_WRITE_PTR(head);
> + head = GEN8_CSB_READ_PTR(head);
> + while (head != tail) {
> + unsigned int status;
>
> - if (tail < head)
> - tail += GEN8_CSB_ENTRIES;
> - do {
> - unsigned int idx = ++head % GEN8_CSB_ENTRIES;
> - unsigned int status = readl(buf + 2 * idx);
> + if (++head == GEN8_CSB_ENTRIES)
> + head = 0;
>
> /* We are flying near dragons again.
> *
> @@ -548,11 +545,12 @@ static void intel_lrc_irq_handler(unsigned long data)
> * status notifier.
> */
>
> + status = readl(buf + 2 * head);
> if (!(status & GEN8_CTX_STATUS_COMPLETED_MASK))
> continue;
>
> /* Check the context/desc id for this event matches */
> - GEM_DEBUG_BUG_ON(readl(buf + 2 * idx + 1) !=
> + GEM_DEBUG_BUG_ON(readl(buf + 2 * head + 1) !=
> port[0].context_id);
>
> GEM_BUG_ON(port[0].count == 0);
> @@ -570,10 +568,9 @@ static void intel_lrc_irq_handler(unsigned long data)
>
> GEM_BUG_ON(port[0].count == 0 &&
> !(status & GEN8_CTX_STATUS_ACTIVE_IDLE));
> - } while (head < tail);
> + }
>
> - writel(_MASKED_FIELD(GEN8_CSB_READ_PTR_MASK,
> - GEN8_CSB_WRITE_PTR(csb) << 8),
> + writel(_MASKED_FIELD(GEN8_CSB_READ_PTR_MASK, head << 8),
> csb_mmio);
> }
>
>
Looks correct, even I think a bit easier to understand.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list