Message ID | 20230513015545.2807282-5-umesh.nerlige.ramappa@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add MTL PMU support for multi-gt | expand |
On Fri, 12 May 2023 18:55:43 -0700, Umesh Nerlige Ramappa wrote: > > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > > We do not want to have timers per tile and waste CPU cycles and energy via > multiple wake-up sources, for a relatively un-important task of PMU > sampling, so keeping a single timer works well. But we also do not want > the first GT which goes idle to turn off the timer. > > Add some reference counting, via a mask of unparked GTs, to solve this. > > v2: Drop the check for unparked in i915_sample (Ashutosh) Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> > > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com> > Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com> > --- > drivers/gpu/drm/i915/i915_pmu.c | 9 +++++++-- > drivers/gpu/drm/i915/i915_pmu.h | 4 ++++ > 2 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c > index 2b63ee31e1b3..725b01b00775 100644 > --- a/drivers/gpu/drm/i915/i915_pmu.c > +++ b/drivers/gpu/drm/i915/i915_pmu.c > @@ -251,7 +251,9 @@ void i915_pmu_gt_parked(struct intel_gt *gt) > * Signal sampling timer to stop if only engine events are enabled and > * GPU went idle. > */ > - pmu->timer_enabled = pmu_needs_timer(pmu, false); > + pmu->unparked &= ~BIT(gt->info.id); > + if (pmu->unparked == 0) > + pmu->timer_enabled = pmu_needs_timer(pmu, false); > > spin_unlock_irq(&pmu->lock); > } > @@ -268,7 +270,10 @@ void i915_pmu_gt_unparked(struct intel_gt *gt) > /* > * Re-enable sampling timer when GPU goes active. > */ > - __i915_pmu_maybe_start_timer(pmu); > + if (pmu->unparked == 0) > + __i915_pmu_maybe_start_timer(pmu); > + > + pmu->unparked |= BIT(gt->info.id); > > spin_unlock_irq(&pmu->lock); > } > diff --git a/drivers/gpu/drm/i915/i915_pmu.h b/drivers/gpu/drm/i915/i915_pmu.h > index a686fd7ccedf..3a811266ac6a 100644 > --- a/drivers/gpu/drm/i915/i915_pmu.h > +++ b/drivers/gpu/drm/i915/i915_pmu.h > @@ -76,6 +76,10 @@ struct i915_pmu { > * @lock: Lock protecting enable mask and ref count handling. > */ > spinlock_t lock; > + /** > + * @unparked: GT unparked mask. > + */ > + unsigned int unparked; > /** > * @timer: Timer for internal i915 PMU sampling. > */ > -- > 2.36.1 >
diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c index 2b63ee31e1b3..725b01b00775 100644 --- a/drivers/gpu/drm/i915/i915_pmu.c +++ b/drivers/gpu/drm/i915/i915_pmu.c @@ -251,7 +251,9 @@ void i915_pmu_gt_parked(struct intel_gt *gt) * Signal sampling timer to stop if only engine events are enabled and * GPU went idle. */ - pmu->timer_enabled = pmu_needs_timer(pmu, false); + pmu->unparked &= ~BIT(gt->info.id); + if (pmu->unparked == 0) + pmu->timer_enabled = pmu_needs_timer(pmu, false); spin_unlock_irq(&pmu->lock); } @@ -268,7 +270,10 @@ void i915_pmu_gt_unparked(struct intel_gt *gt) /* * Re-enable sampling timer when GPU goes active. */ - __i915_pmu_maybe_start_timer(pmu); + if (pmu->unparked == 0) + __i915_pmu_maybe_start_timer(pmu); + + pmu->unparked |= BIT(gt->info.id); spin_unlock_irq(&pmu->lock); } diff --git a/drivers/gpu/drm/i915/i915_pmu.h b/drivers/gpu/drm/i915/i915_pmu.h index a686fd7ccedf..3a811266ac6a 100644 --- a/drivers/gpu/drm/i915/i915_pmu.h +++ b/drivers/gpu/drm/i915/i915_pmu.h @@ -76,6 +76,10 @@ struct i915_pmu { * @lock: Lock protecting enable mask and ref count handling. */ spinlock_t lock; + /** + * @unparked: GT unparked mask. + */ + unsigned int unparked; /** * @timer: Timer for internal i915 PMU sampling. */