[PATCH 1/9] drm/xe: Introduce xe_pm_runtime_get_noresume for inner callers
Matthew Auld
matthew.auld at intel.com
Wed Apr 10 08:20:19 UTC 2024
On 10/04/2024 02:58, Rodrigo Vivi wrote:
> Let's ensure that we have an option for inner callers that will
> raise WARN if device is not active and not protected by outer callers.
>
> Make this also a void function forcing every caller to unconditionally
> put the reference back afterwards.
>
> This will be very important for cases where we want to hold the
> reference before scheduling a work in a queue. Then the work job
> will be responsible for putting it back.
>
> While at this, already convert a case from mem_access_get_ongoing where
> it is not checking for the reference and put it back, what would
> cause the underflow.
>
> v2: Fix identation.
> v3: Convert equivalent missing put from mem_access towards pm_runtime.
>
> Reviewed-by: Matthew Auld <matthew.auld at intel.com> #v1
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
r-b still applies to v3.
> ---
> drivers/gpu/drm/xe/xe_exec_queue.c | 4 ++--
> drivers/gpu/drm/xe/xe_pm.c | 20 ++++++++++++++++++++
> drivers/gpu/drm/xe/xe_pm.h | 1 +
> 3 files changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
> index 71bd52dfebcf..50ec661116a2 100644
> --- a/drivers/gpu/drm/xe/xe_exec_queue.c
> +++ b/drivers/gpu/drm/xe/xe_exec_queue.c
> @@ -128,7 +128,7 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)
> * already grabbed the rpm ref outside any sensitive locks.
> */
> if (!(q->flags & EXEC_QUEUE_FLAG_PERMANENT) && (q->flags & EXEC_QUEUE_FLAG_VM || !q->vm))
> - drm_WARN_ON(&xe->drm, !xe_device_mem_access_get_if_ongoing(xe));
> + xe_pm_runtime_get_noresume(xe);
>
> return 0;
>
> @@ -217,7 +217,7 @@ void xe_exec_queue_fini(struct xe_exec_queue *q)
> for (i = 0; i < q->width; ++i)
> xe_lrc_finish(q->lrc + i);
> if (!(q->flags & EXEC_QUEUE_FLAG_PERMANENT) && (q->flags & EXEC_QUEUE_FLAG_VM || !q->vm))
> - xe_device_mem_access_put(gt_to_xe(q->gt));
> + xe_pm_runtime_put(gt_to_xe(q->gt));
> __xe_exec_queue_free(q);
> }
>
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 9ef03f23a2d7..1692cf08e950 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -489,6 +489,26 @@ bool xe_pm_runtime_get_if_in_use(struct xe_device *xe)
> return pm_runtime_get_if_in_use(xe->drm.dev) > 0;
> }
>
> +/**
> + * xe_pm_runtime_get_noresume - Bump runtime PM usage counter without resuming
> + * @xe: xe device instance
> + *
> + * This function should be used in inner places where it is surely already
> + * protected by outer-bound callers of `xe_pm_runtime_get`.
> + * It will warn if not protected.
> + * The reference should be put back after this function regardless, since it
> + * will always bump the usage counter, regardless.
> + */
> +void xe_pm_runtime_get_noresume(struct xe_device *xe)
> +{
> + bool ref;
> +
> + ref = xe_pm_runtime_get_if_in_use(xe);
> +
> + if (drm_WARN(&xe->drm, !ref, "Missing outer runtime PM protection\n"))
> + pm_runtime_get_noresume(xe->drm.dev);
> +}
> +
> /**
> * xe_pm_runtime_resume_and_get - Resume, then get a runtime_pm ref if awake.
> * @xe: xe device instance
> diff --git a/drivers/gpu/drm/xe/xe_pm.h b/drivers/gpu/drm/xe/xe_pm.h
> index 0cb38ca244fe..119b630ad1d1 100644
> --- a/drivers/gpu/drm/xe/xe_pm.h
> +++ b/drivers/gpu/drm/xe/xe_pm.h
> @@ -31,6 +31,7 @@ int xe_pm_runtime_get_ioctl(struct xe_device *xe);
> void xe_pm_runtime_put(struct xe_device *xe);
> int xe_pm_runtime_get_if_active(struct xe_device *xe);
> bool xe_pm_runtime_get_if_in_use(struct xe_device *xe);
> +void xe_pm_runtime_get_noresume(struct xe_device *xe);
> bool xe_pm_runtime_resume_and_get(struct xe_device *xe);
> void xe_pm_assert_unbounded_bridge(struct xe_device *xe);
> int xe_pm_set_vram_threshold(struct xe_device *xe, u32 threshold);
More information about the Intel-xe
mailing list