* 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;
 
        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);
 }
 
 
        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
 
 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);