Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > Assume that intel_wakereg_get() may take the mutex, and perform other > sleeping actions in the course of its callbacks and so use might_sleep() > to ensure that all callers abide. Anything that cannot sleep has to use > e.g. intel_wakeref_get_if_active() to guarantee its avoidance of the > non-atomic paths. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/gt/intel_gt_pm.h | 5 +++++ > drivers/gpu/drm/i915/gt/intel_lrc.c | 2 +- > .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +- > drivers/gpu/drm/i915/intel_wakeref.h | 17 +++++++++++++++-- > 4 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_pm.h b/drivers/gpu/drm/i915/gt/intel_gt_pm.h > index 990efc27a4e4..4a9e48c12bd4 100644 > --- a/drivers/gpu/drm/i915/gt/intel_gt_pm.h > +++ b/drivers/gpu/drm/i915/gt/intel_gt_pm.h > @@ -22,6 +22,11 @@ static inline void intel_gt_pm_get(struct intel_gt *gt) > intel_wakeref_get(>->wakeref); > } > > +static inline void __intel_gt_pm_get(struct intel_gt *gt) > +{ > + __intel_wakeref_get(>->wakeref); > +} > + > static inline bool intel_gt_pm_get_if_awake(struct intel_gt *gt) > { > return intel_wakeref_get_if_active(>->wakeref); > diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c > index b65bc06855b0..516306ebc839 100644 > --- a/drivers/gpu/drm/i915/gt/intel_lrc.c > +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c > @@ -1121,7 +1121,7 @@ __execlists_schedule_in(struct i915_request *rq) > BUILD_BUG_ON(NUM_CONTEXT_TAG > GEN12_MAX_CONTEXT_HW_ID); > } > > - intel_gt_pm_get(engine->gt); > + __intel_gt_pm_get(engine->gt); > execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN); > intel_engine_context_in(engine); > > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > index dcccbd640809..6f94af7ad1de 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c > @@ -529,7 +529,7 @@ static struct i915_request *schedule_in(struct i915_request *rq, int idx) > * required if we generalise the inflight tracking. > */ > > - intel_gt_pm_get(rq->engine->gt); > + __intel_gt_pm_get(rq->engine->gt); > return i915_request_get(rq); > } > > diff --git a/drivers/gpu/drm/i915/intel_wakeref.h b/drivers/gpu/drm/i915/intel_wakeref.h > index da6e8fd506e6..3897bfea72d9 100644 > --- a/drivers/gpu/drm/i915/intel_wakeref.h > +++ b/drivers/gpu/drm/i915/intel_wakeref.h > @@ -59,9 +59,7 @@ void __intel_wakeref_put_last(struct intel_wakeref *wf, unsigned long flags); > > /** > * intel_wakeref_get: Acquire the wakeref > - * @i915: the drm_i915_private device > * @wf: the wakeref > - * @fn: callback for acquired the wakeref, called only on first acquire. > * > * Acquire a hold on the wakeref. The first user to do so, will acquire > * the runtime pm wakeref and then call the @fn underneath the wakeref > @@ -76,12 +74,27 @@ void __intel_wakeref_put_last(struct intel_wakeref *wf, unsigned long flags); > static inline int > intel_wakeref_get(struct intel_wakeref *wf) > { > + might_sleep(); > if (unlikely(!atomic_inc_not_zero(&wf->count))) > return __intel_wakeref_get_first(wf); > > return 0; > } > > +/** > + * __intel_wakeref_get: Acquire the wakeref, again > + * @wf: the wakeref > + * > + * Increment the wakeref counter, but only valid if it is already held by > + * the caller. > + */ > +static inline void > +__intel_wakeref_get(struct intel_wakeref *wf) > +{ > + INTEL_WAKEREF_BUG_ON(!atomic_read(&wf->count)); > + atomic_inc(&wf->count); > +} > + > /** > * intel_wakeref_get_if_in_use: Acquire the wakeref > * @wf: the wakeref > -- > 2.24.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx