Re: [PATCH 01/71] drm/i915/execlists: Drop preemption arbitrations points along the ring

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

 




On 03/05/2018 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 <chris@xxxxxxxxxxxxxxxxxx>
Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx>
Cc: Michel Thierry <michel.thierry@xxxxxxxxx>
Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx>
---
  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);

Sounds to me like a completely sensible thing to do.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux