Skip to content

Commit 50a5923

Browse files
mattropeThomas Hellström
authored andcommitted
drm/xe/pm: Add scope-based cleanup helper for runtime PM
Add a scope-based helpers for runtime PM that may be used to simplify cleanup logic and potentially avoid goto-based cleanup. For example, using guard(xe_pm_runtime)(xe); will get runtime PM and cause a corresponding put to occur automatically when the current scope is exited. 'xe_pm_runtime_noresume' can be used as a guard replacement for the corresponding 'noresume' variant. There's also an xe_pm_runtime_ioctl conditional guard that can be used as a replacement for xe_runtime_ioctl(): ACQUIRE(xe_pm_runtime_ioctl, pm)(xe); if ((ret = ACQUIRE_ERR(xe_pm_runtime_ioctl, &pm)) < 0) /* failed */ In a few rare cases (such as gt_reset_worker()) we need to ensure that runtime PM is dropped when the function is exited by any means (including error paths), but the function does not need to acquire runtime PM because that has already been done earlier by a different function. For these special cases, an 'xe_pm_runtime_release_only' guard can be used to handle the release without doing an acquisition. These guards will be used in future patches to eliminate some of our goto-based cleanup. v2: - Specify success condition for xe_pm runtime_ioctl as _RET >= 0 so that positive values will be properly identified as success and trigger destructor cleanup properly. v3: - Add comments to the kerneldoc for the existing 'get' functions indicating that scope-based handling should be preferred where possible. (Gustavo) Cc: Gustavo Sousa <gustavo.sousa@intel.com> Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com> Link: https://patch.msgid.link/20251118164338.3572146-31-matthew.d.roper@intel.com Signed-off-by: Matt Roper <matthew.d.roper@intel.com> (cherry picked from commit 59e7528) Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
1 parent 62433ef commit 50a5923

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

drivers/gpu/drm/xe/xe_pm.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,13 @@ static void xe_pm_runtime_lockdep_prime(void)
726726
/**
727727
* xe_pm_runtime_get - Get a runtime_pm reference and resume synchronously
728728
* @xe: xe device instance
729+
*
730+
* When possible, scope-based runtime PM (through guard(xe_pm_runtime)) is
731+
* be preferred over direct usage of this function. Manual get/put handling
732+
* should only be used when the function contains goto-based logic which
733+
* can break scope-based handling, or when the lifetime of the runtime PM
734+
* reference does not match a specific scope (e.g., runtime PM obtained in one
735+
* function and released in a different one).
729736
*/
730737
void xe_pm_runtime_get(struct xe_device *xe)
731738
{
@@ -758,6 +765,13 @@ void xe_pm_runtime_put(struct xe_device *xe)
758765
* xe_pm_runtime_get_ioctl - Get a runtime_pm reference before ioctl
759766
* @xe: xe device instance
760767
*
768+
* When possible, scope-based runtime PM (through
769+
* ACQUIRE(xe_pm_runtime_ioctl, ...)) is be preferred over direct usage of this
770+
* function. Manual get/put handling should only be used when the function
771+
* contains goto-based logic which can break scope-based handling, or when the
772+
* lifetime of the runtime PM reference does not match a specific scope (e.g.,
773+
* runtime PM obtained in one function and released in a different one).
774+
*
761775
* Returns: Any number greater than or equal to 0 for success, negative error
762776
* code otherwise.
763777
*/
@@ -827,6 +841,13 @@ static bool xe_pm_suspending_or_resuming(struct xe_device *xe)
827841
* It will warn if not protected.
828842
* The reference should be put back after this function regardless, since it
829843
* will always bump the usage counter, regardless.
844+
*
845+
* When possible, scope-based runtime PM (through guard(xe_pm_runtime_noresume))
846+
* is be preferred over direct usage of this function. Manual get/put handling
847+
* should only be used when the function contains goto-based logic which can
848+
* break scope-based handling, or when the lifetime of the runtime PM reference
849+
* does not match a specific scope (e.g., runtime PM obtained in one function
850+
* and released in a different one).
830851
*/
831852
void xe_pm_runtime_get_noresume(struct xe_device *xe)
832853
{

drivers/gpu/drm/xe/xe_pm.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#ifndef _XE_PM_H_
77
#define _XE_PM_H_
88

9+
#include <linux/cleanup.h>
910
#include <linux/pm_runtime.h>
1011

1112
#define DEFAULT_VRAM_THRESHOLD 300 /* in MB */
@@ -37,4 +38,20 @@ int xe_pm_block_on_suspend(struct xe_device *xe);
3738
void xe_pm_might_block_on_suspend(void);
3839
int xe_pm_module_init(void);
3940

41+
static inline void __xe_pm_runtime_noop(struct xe_device *xe) {}
42+
43+
DEFINE_GUARD(xe_pm_runtime, struct xe_device *,
44+
xe_pm_runtime_get(_T), xe_pm_runtime_put(_T))
45+
DEFINE_GUARD(xe_pm_runtime_noresume, struct xe_device *,
46+
xe_pm_runtime_get_noresume(_T), xe_pm_runtime_put(_T))
47+
DEFINE_GUARD_COND(xe_pm_runtime, _ioctl, xe_pm_runtime_get_ioctl(_T), _RET >= 0)
48+
49+
/*
50+
* Used when a function needs to release runtime PM in all possible cases
51+
* and error paths, but the wakeref was already acquired by a different
52+
* function (i.e., get() has already happened so only a put() is needed).
53+
*/
54+
DEFINE_GUARD(xe_pm_runtime_release_only, struct xe_device *,
55+
__xe_pm_runtime_noop(_T), xe_pm_runtime_put(_T));
56+
4057
#endif

0 commit comments

Comments
 (0)