[Intel-gfx] [PATCH] drm/i915/execlists: Cache ELSP register offset

Michel Thierry michel.thierry at intel.com
Thu Dec 7 22:19:05 UTC 2017


On 07/12/17 12:45, Chris Wilson wrote:
> Currently on every submission, we recalculate the ELSP register offset
> for the engine, after chasing the pointers to find the iomem base. Since
> this is fixed for the lifetime of the driver record the offset in the
> execlists struct.
> 
> In practice the difference is negligible, it just happens to remove 27
> bytes of eyesore pointer dancing from next to the hottest instruction
> (which is itself due to stalling for a cache miss) in perf profiles of
> the execlists_submission_tasklet().
> 
> 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        | 12 ++++++------
>   drivers/gpu/drm/i915/intel_ringbuffer.h |  5 +++++
>   2 files changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 2a8160f603ab..93b5ce6307af 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -431,8 +431,7 @@ static inline void elsp_write(u64 desc, u32 __iomem *elsp)
>   static void execlists_submit_ports(struct intel_engine_cs *engine)
>   {
>          struct execlist_port *port = engine->execlists.port;
> -       u32 __iomem *elsp =
> -               engine->i915->regs + i915_mmio_reg_offset(RING_ELSP(engine));
> +       u32 __iomem *elsp = engine->execlists.elsp;
>          unsigned int n;
> 
>          for (n = execlists_num_ports(&engine->execlists); n--; ) {

Since you're moving this, probably it can now use engine->execlists.elsp 
directly (as inject_preempt_context does), i.e.:

---
@@ -431,7 +431,6 @@ static inline void elsp_write(u64 desc, u32 __iomem 
*elsp)
  static void execlists_submit_ports(struct intel_engine_cs *engine)
  {
         struct execlist_port *port = engine->execlists.port;
-       u32 __iomem *elsp = engine->execlists.elsp;
         unsigned int n;

         for (n = execlists_num_ports(&engine->execlists); n--; ) {
@@ -457,7 +456,7 @@ static void execlists_submit_ports(struct 
intel_engine_cs *engine)
                         desc = 0;
                 }

-               elsp_write(desc, elsp);
+               elsp_write(desc, engine->execlists.elsp);
         }
         execlists_clear_active(&engine->execlists, EXECLISTS_ACTIVE_HWACK);
  }
---

Anyway,

Reviewed-by: Michel Thierry <michel.thierry at intel.com>

> @@ -496,8 +495,6 @@ static void inject_preempt_context(struct intel_engine_cs *engine)
>   {
>          struct intel_context *ce =
>                  &engine->i915->preempt_context->engine[engine->id];
> -       u32 __iomem *elsp =
> -               engine->i915->regs + i915_mmio_reg_offset(RING_ELSP(engine));
>          unsigned int n;
> 
>          GEM_BUG_ON(engine->i915->preempt_context->hw_id != PREEMPT_ID);
> @@ -510,9 +507,9 @@ static void inject_preempt_context(struct intel_engine_cs *engine)
> 
>          GEM_TRACE("\n");
>          for (n = execlists_num_ports(&engine->execlists); --n; )
> -               elsp_write(0, elsp);
> +               elsp_write(0, engine->execlists.elsp);
> 
> -       elsp_write(ce->lrc_desc, elsp);
> +       elsp_write(ce->lrc_desc, engine->execlists.elsp);
>          execlists_clear_active(&engine->execlists, EXECLISTS_ACTIVE_HWACK);
>   }
> 
> @@ -1509,6 +1506,9 @@ static int gen8_init_common_ring(struct intel_engine_cs *engine)
>          execlists->csb_head = -1;
>          execlists->active = 0;
> 
> +       execlists->elsp =
> +               dev_priv->regs + i915_mmio_reg_offset(RING_ELSP(engine));
> +
>          /* After a GPU reset, we may have requests to replay */
>          if (execlists->first)
>                  tasklet_schedule(&execlists->tasklet);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index c68ab3ead83c..183165b9b3fb 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -199,6 +199,11 @@ struct intel_engine_execlists {
>           */
>          bool no_priolist;
> 
> +       /**
> +        * @elsp: the ExecList Submission Port register
> +        */
> +       u32 __iomem *elsp;
> +
>          /**
>           * @port: execlist port states
>           *
> --
> 2.15.1




More information about the Intel-gfx mailing list