Message ID | 20170317112722.2848-1-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Mar 17, 2017 at 11:27:22AM +0000, Chris Wilson wrote: > Do an early read of the execlists' queue before we take the spinlock and > start checking. This is safe as the first writer to the execlists queue > will cause the tasklet to be run again after a memory barrier. > > v2: Keep guc in sync with execlists queue changes > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Michał Winiarski <michal.winiarski@intel.com> > Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> > Reviewed-by: Michał Winiarski <michal.winiarski@intel.com> > --- > drivers/gpu/drm/i915/i915_guc_submission.c | 4 ++++ > drivers/gpu/drm/i915/intel_lrc.c | 4 ++++ > 2 files changed, 8 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c > index a3636b31ebc3..78718a8e70c3 100644 > --- a/drivers/gpu/drm/i915/i915_guc_submission.c > +++ b/drivers/gpu/drm/i915/i915_guc_submission.c > @@ -577,6 +577,10 @@ static bool i915_guc_dequeue(struct intel_engine_cs *engine) > struct rb_node *rb; > bool submit = false; > > + /* After execlist_first is updated, a new tasklet must be scheduled */ Hmm, I think this comment is litlle misleading when placed right to the "if" that do early return. Either extend it with the info from the commit message, or move down. -Michal > + if (!READ_ONCE(engine->execlist_first)) > + return false; > + > spin_lock_irqsave(&engine->timeline->lock, flags); > rb = engine->execlist_first; > while (rb) { > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c > index becde55b02a3..7adc588d1a19 100644 > --- a/drivers/gpu/drm/i915/intel_lrc.c > +++ b/drivers/gpu/drm/i915/intel_lrc.c > @@ -403,6 +403,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine) > struct rb_node *rb; > bool submit = false; > > + /* After execlist_first is updated, a new tasklet must be scheduled */ > + if (!READ_ONCE(engine->execlist_first)) > + return; > + > last = port->request; > if (last) > /* WaIdleLiteRestore:bdw,skl > -- > 2.11.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c index a3636b31ebc3..78718a8e70c3 100644 --- a/drivers/gpu/drm/i915/i915_guc_submission.c +++ b/drivers/gpu/drm/i915/i915_guc_submission.c @@ -577,6 +577,10 @@ static bool i915_guc_dequeue(struct intel_engine_cs *engine) struct rb_node *rb; bool submit = false; + /* After execlist_first is updated, a new tasklet must be scheduled */ + if (!READ_ONCE(engine->execlist_first)) + return false; + spin_lock_irqsave(&engine->timeline->lock, flags); rb = engine->execlist_first; while (rb) { diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index becde55b02a3..7adc588d1a19 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -403,6 +403,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine) struct rb_node *rb; bool submit = false; + /* After execlist_first is updated, a new tasklet must be scheduled */ + if (!READ_ONCE(engine->execlist_first)) + return; + last = port->request; if (last) /* WaIdleLiteRestore:bdw,skl