Replace the stack-allocated dma_resv in xe_pm_runtime_lockdep_prime()
with a dynamically allocated one using dma_resv_alloc(). This aligns
with the move away from embedded dma_resv structures and towards
reference-counted dynamic allocation.

The lockdep priming function is used to establish lock ordering
dependencies between runtime PM and dma_resv locks. The resv is only
used temporarily for lockdep annotation and is immediately freed after
use with dma_resv_put().

If allocation fails, we silently return since this is optional lockdep
annotation that only affects dependency checking, not functional
behavior.

Signed-off-by: Christian König <[email protected]>
Assisted-by: Claude:Sonnet 4
---
 drivers/gpu/drm/xe/xe_pm.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 99562f691080..33b19bcb6f71 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -762,15 +762,20 @@ static void xe_rpm_might_enter_cb(const struct xe_device 
*xe)
  */
 static void xe_pm_runtime_lockdep_prime(void)
 {
-       struct dma_resv lockdep_resv;
+       struct dma_resv *lockdep_resv;
+
+       lockdep_resv = dma_resv_alloc();
+       if (!lockdep_resv)
+               return;
 
-       dma_resv_init(&lockdep_resv);
        lock_map_acquire(&xe_pm_runtime_d3cold_map);
        /* D3Cold takes the dma_resv locks to evict bos */
-       dma_resv_lock(&lockdep_resv, NULL);
-       dma_resv_unlock(&lockdep_resv);
+       dma_resv_lock(lockdep_resv, NULL);
+       dma_resv_unlock(lockdep_resv);
        lock_map_release(&xe_pm_runtime_d3cold_map);
 
+       dma_resv_put(lockdep_resv);
+
        /* Shrinkers might like to wake up the device under reclaim. */
        fs_reclaim_acquire(GFP_KERNEL);
        lock_map_acquire(&xe_pm_runtime_nod3cold_map);
-- 
2.43.0

Reply via email to