Skip to content

Commit cbb6a74

Browse files
committed
drm/xe: Introduce xe_pm_runtime_get_noresume for inner callers
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@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240417203952.25503-1-rodrigo.vivi@intel.com Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
1 parent 2817a1f commit cbb6a74

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

drivers/gpu/drm/xe/xe_exec_queue.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)
128128
* already grabbed the rpm ref outside any sensitive locks.
129129
*/
130130
if (!(q->flags & EXEC_QUEUE_FLAG_PERMANENT) && (q->flags & EXEC_QUEUE_FLAG_VM || !q->vm))
131-
drm_WARN_ON(&xe->drm, !xe_device_mem_access_get_if_ongoing(xe));
131+
xe_pm_runtime_get_noresume(xe);
132132

133133
return 0;
134134

@@ -217,7 +217,7 @@ void xe_exec_queue_fini(struct xe_exec_queue *q)
217217
for (i = 0; i < q->width; ++i)
218218
xe_lrc_finish(q->lrc + i);
219219
if (!(q->flags & EXEC_QUEUE_FLAG_PERMANENT) && (q->flags & EXEC_QUEUE_FLAG_VM || !q->vm))
220-
xe_device_mem_access_put(gt_to_xe(q->gt));
220+
xe_pm_runtime_put(gt_to_xe(q->gt));
221221
__xe_exec_queue_free(q);
222222
}
223223

drivers/gpu/drm/xe/xe_pm.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,26 @@ bool xe_pm_runtime_get_if_in_use(struct xe_device *xe)
485485
return pm_runtime_get_if_in_use(xe->drm.dev) > 0;
486486
}
487487

488+
/**
489+
* xe_pm_runtime_get_noresume - Bump runtime PM usage counter without resuming
490+
* @xe: xe device instance
491+
*
492+
* This function should be used in inner places where it is surely already
493+
* protected by outer-bound callers of `xe_pm_runtime_get`.
494+
* It will warn if not protected.
495+
* The reference should be put back after this function regardless, since it
496+
* will always bump the usage counter, regardless.
497+
*/
498+
void xe_pm_runtime_get_noresume(struct xe_device *xe)
499+
{
500+
bool ref;
501+
502+
ref = xe_pm_runtime_get_if_in_use(xe);
503+
504+
if (drm_WARN(&xe->drm, !ref, "Missing outer runtime PM protection\n"))
505+
pm_runtime_get_noresume(xe->drm.dev);
506+
}
507+
488508
/**
489509
* xe_pm_runtime_resume_and_get - Resume, then get a runtime_pm ref if awake.
490510
* @xe: xe device instance

drivers/gpu/drm/xe/xe_pm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ int xe_pm_runtime_get_ioctl(struct xe_device *xe);
3131
void xe_pm_runtime_put(struct xe_device *xe);
3232
int xe_pm_runtime_get_if_active(struct xe_device *xe);
3333
bool xe_pm_runtime_get_if_in_use(struct xe_device *xe);
34+
void xe_pm_runtime_get_noresume(struct xe_device *xe);
3435
bool xe_pm_runtime_resume_and_get(struct xe_device *xe);
3536
void xe_pm_assert_unbounded_bridge(struct xe_device *xe);
3637
int xe_pm_set_vram_threshold(struct xe_device *xe, u32 threshold);

0 commit comments

Comments
 (0)