Message ID | 20200720092312.16975-6-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/10] drm/i915/gem: Remove disordered per-file request list for throttling | expand |
On 20/07/2020 10:23, Chris Wilson wrote: > Move the __intel_breadcrumbs_arm_irq earlier, next to the disarm_irq, so > that we can make use of it in the following patch. > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > --- > drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 88 ++++++++++----------- > 1 file changed, 44 insertions(+), 44 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c > index 621cf9d1d7ad..d6008034869f 100644 > --- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c > +++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c > @@ -54,6 +54,37 @@ static void irq_disable(struct intel_engine_cs *engine) > spin_unlock(&engine->gt->irq_lock); > } > > +static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b) > +{ > + lockdep_assert_held(&b->irq_lock); > + > + if (b->irq_armed) > + return; > + > + GEM_BUG_ON(!b->irq_engine); > + if (!intel_gt_pm_get_if_awake(b->irq_engine->gt)) > + return; > + > + /* > + * The breadcrumb irq will be disarmed on the interrupt after the > + * waiters are signaled. This gives us a single interrupt window in > + * which we can add a new waiter and avoid the cost of re-enabling > + * the irq. > + */ > + WRITE_ONCE(b->irq_armed, true); > + > + /* > + * Since we are waiting on a request, the GPU should be busy > + * and should have its own rpm reference. This is tracked > + * by i915->gt.awake, we can forgo holding our own wakref > + * for the interrupt as before i915->gt.awake is released (when > + * the driver is idle) we disarm the breadcrumbs. > + */ > + > + if (!b->irq_enabled++) > + irq_enable(b->irq_engine); > +} > + > static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b) > { > lockdep_assert_held(&b->irq_lock); > @@ -69,19 +100,6 @@ static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b) > intel_gt_pm_put_async(b->irq_engine->gt); > } > > -void intel_breadcrumbs_park(struct intel_breadcrumbs *b) > -{ > - unsigned long flags; > - > - if (!READ_ONCE(b->irq_armed)) > - return; > - > - spin_lock_irqsave(&b->irq_lock, flags); > - if (b->irq_armed) > - __intel_breadcrumbs_disarm_irq(b); > - spin_unlock_irqrestore(&b->irq_lock, flags); > -} > - > static inline bool __request_completed(const struct i915_request *rq) > { > return i915_seqno_passed(__hwsp_seqno(rq), rq->fence.seqno); > @@ -215,37 +233,6 @@ static void signal_irq_work(struct irq_work *work) > } > } > > -static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b) > -{ > - lockdep_assert_held(&b->irq_lock); > - > - if (b->irq_armed) > - return; > - > - GEM_BUG_ON(!b->irq_engine); > - if (!intel_gt_pm_get_if_awake(b->irq_engine->gt)) > - return; > - > - /* > - * The breadcrumb irq will be disarmed on the interrupt after the > - * waiters are signaled. This gives us a single interrupt window in > - * which we can add a new waiter and avoid the cost of re-enabling > - * the irq. > - */ > - WRITE_ONCE(b->irq_armed, true); > - > - /* > - * Since we are waiting on a request, the GPU should be busy > - * and should have its own rpm reference. This is tracked > - * by i915->gt.awake, we can forgo holding our own wakref > - * for the interrupt as before i915->gt.awake is released (when > - * the driver is idle) we disarm the breadcrumbs. > - */ > - > - if (!b->irq_enabled++) > - irq_enable(b->irq_engine); > -} > - > struct intel_breadcrumbs * > intel_breadcrumbs_create(struct intel_engine_cs *irq_engine) > { > @@ -285,6 +272,19 @@ void intel_breadcrumbs_reset(struct intel_breadcrumbs *b) > spin_unlock_irqrestore(&b->irq_lock, flags); > } > > +void intel_breadcrumbs_park(struct intel_breadcrumbs *b) > +{ > + unsigned long flags; > + > + if (!READ_ONCE(b->irq_armed)) > + return; > + > + spin_lock_irqsave(&b->irq_lock, flags); > + if (b->irq_armed) > + __intel_breadcrumbs_disarm_irq(b); > + spin_unlock_irqrestore(&b->irq_lock, flags); > +} > + > void intel_breadcrumbs_free(struct intel_breadcrumbs *b) > { > kfree(b); > Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Regards, Tvrtko
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c index 621cf9d1d7ad..d6008034869f 100644 --- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c +++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c @@ -54,6 +54,37 @@ static void irq_disable(struct intel_engine_cs *engine) spin_unlock(&engine->gt->irq_lock); } +static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b) +{ + lockdep_assert_held(&b->irq_lock); + + if (b->irq_armed) + return; + + GEM_BUG_ON(!b->irq_engine); + if (!intel_gt_pm_get_if_awake(b->irq_engine->gt)) + return; + + /* + * The breadcrumb irq will be disarmed on the interrupt after the + * waiters are signaled. This gives us a single interrupt window in + * which we can add a new waiter and avoid the cost of re-enabling + * the irq. + */ + WRITE_ONCE(b->irq_armed, true); + + /* + * Since we are waiting on a request, the GPU should be busy + * and should have its own rpm reference. This is tracked + * by i915->gt.awake, we can forgo holding our own wakref + * for the interrupt as before i915->gt.awake is released (when + * the driver is idle) we disarm the breadcrumbs. + */ + + if (!b->irq_enabled++) + irq_enable(b->irq_engine); +} + static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b) { lockdep_assert_held(&b->irq_lock); @@ -69,19 +100,6 @@ static void __intel_breadcrumbs_disarm_irq(struct intel_breadcrumbs *b) intel_gt_pm_put_async(b->irq_engine->gt); } -void intel_breadcrumbs_park(struct intel_breadcrumbs *b) -{ - unsigned long flags; - - if (!READ_ONCE(b->irq_armed)) - return; - - spin_lock_irqsave(&b->irq_lock, flags); - if (b->irq_armed) - __intel_breadcrumbs_disarm_irq(b); - spin_unlock_irqrestore(&b->irq_lock, flags); -} - static inline bool __request_completed(const struct i915_request *rq) { return i915_seqno_passed(__hwsp_seqno(rq), rq->fence.seqno); @@ -215,37 +233,6 @@ static void signal_irq_work(struct irq_work *work) } } -static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b) -{ - lockdep_assert_held(&b->irq_lock); - - if (b->irq_armed) - return; - - GEM_BUG_ON(!b->irq_engine); - if (!intel_gt_pm_get_if_awake(b->irq_engine->gt)) - return; - - /* - * The breadcrumb irq will be disarmed on the interrupt after the - * waiters are signaled. This gives us a single interrupt window in - * which we can add a new waiter and avoid the cost of re-enabling - * the irq. - */ - WRITE_ONCE(b->irq_armed, true); - - /* - * Since we are waiting on a request, the GPU should be busy - * and should have its own rpm reference. This is tracked - * by i915->gt.awake, we can forgo holding our own wakref - * for the interrupt as before i915->gt.awake is released (when - * the driver is idle) we disarm the breadcrumbs. - */ - - if (!b->irq_enabled++) - irq_enable(b->irq_engine); -} - struct intel_breadcrumbs * intel_breadcrumbs_create(struct intel_engine_cs *irq_engine) { @@ -285,6 +272,19 @@ void intel_breadcrumbs_reset(struct intel_breadcrumbs *b) spin_unlock_irqrestore(&b->irq_lock, flags); } +void intel_breadcrumbs_park(struct intel_breadcrumbs *b) +{ + unsigned long flags; + + if (!READ_ONCE(b->irq_armed)) + return; + + spin_lock_irqsave(&b->irq_lock, flags); + if (b->irq_armed) + __intel_breadcrumbs_disarm_irq(b); + spin_unlock_irqrestore(&b->irq_lock, flags); +} + void intel_breadcrumbs_free(struct intel_breadcrumbs *b) { kfree(b);
Move the __intel_breadcrumbs_arm_irq earlier, next to the disarm_irq, so that we can make use of it in the following patch. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> --- drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 88 ++++++++++----------- 1 file changed, 44 insertions(+), 44 deletions(-)