Quoting Lionel Landwerlin (2018-05-03 11:13:05)
> On 03/05/18 07:36, Chris Wilson wrote:
> > Limit the arbitration (where preemption may occur) to inside the batch,
> > and prevent it from happening on the pipecontrols/flushes we use to
> > write the breadcrumb seqno. Once the user batch is complete, we have
> > nothing left to do but serialise and emit the breadcrumb; switching
> > contexts at this point is futile so don't.
> >
> > Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> > Cc: MichaƂ Winiarski <michal.winiar...@intel.com>
> > Cc: Michel Thierry <michel.thie...@intel.com>
> > Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
> > ---
> >   drivers/gpu/drm/i915/intel_lrc.c | 9 ++++++---
> >   1 file changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_lrc.c 
> > b/drivers/gpu/drm/i915/intel_lrc.c
> > index e04798e98db2..70b722c36e65 100644
> > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > @@ -1934,7 +1934,7 @@ static int gen8_emit_bb_start(struct i915_request *rq,
> >               rq->ctx->ppgtt->pd_dirty_rings &= 
> > ~intel_engine_flag(rq->engine);
> >       }
> >   
> > -     cs = intel_ring_begin(rq, 4);
> > +     cs = intel_ring_begin(rq, 6);
> >       if (IS_ERR(cs))
> >               return PTR_ERR(cs);
> >   
> > @@ -1963,6 +1963,9 @@ static int gen8_emit_bb_start(struct i915_request *rq,
> >               (flags & I915_DISPATCH_RS ? MI_BATCH_RESOURCE_STREAMER : 0);
> >       *cs++ = lower_32_bits(offset);
> >       *cs++ = upper_32_bits(offset);
> > +
> > +     *cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
> > +     *cs++ = MI_NOOP;
> >       intel_ring_advance(rq, cs);
> >   
> >       return 0;
> > @@ -2105,7 +2108,7 @@ static void gen8_emit_breadcrumb(struct i915_request 
> > *request, u32 *cs)
> >       cs = gen8_emit_ggtt_write(cs, request->global_seqno,
> >                                 intel_hws_seqno_address(request->engine));
> >       *cs++ = MI_USER_INTERRUPT;
> > -     *cs++ = MI_NOOP;
> > +     *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
> >       request->tail = intel_ring_offset(request, cs);
> >       assert_ring_tail_valid(request->ring, request->tail);
> >   
> > @@ -2121,7 +2124,7 @@ static void gen8_emit_breadcrumb_rcs(struct 
> > i915_request *request, u32 *cs)
> >       cs = gen8_emit_ggtt_write_rcs(cs, request->global_seqno,
> >                                     
> > intel_hws_seqno_address(request->engine));
> >       *cs++ = MI_USER_INTERRUPT;
> > -     *cs++ = MI_NOOP;
> > +     *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
> >       request->tail = intel_ring_offset(request, cs);
> >       assert_ring_tail_valid(request->ring, request->tail);
> >   
> 
> Looks good to me. Just one question, you're adding a NOOP in one place, 
> dropping it in the other 2. What the rational?

Writes into the ring have to be in multiples of 2 dwords. It doesn't
strictly, as only the RING_TAIL has to be qword aligned and we could fix
up the odd dword at the end, but for now the code insists on every
packet being an even number of dwords, hence padding with NOPs.
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to