]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/xe: Fix circular locking dependency
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 11 Sep 2025 21:20:25 +0000 (17:20 -0400)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 12 Sep 2025 13:38:08 +0000 (09:38 -0400)
Fix this:

 ======================================================
 WARNING: possible circular locking dependency detected
 6.17.0-rc4-lgci-xe-xe-pw-153723v2+ #1 Tainted: G S   U
 ------------------------------------------------------
 xe_pm/11324 is trying to acquire lock:
 ffff8881085f22a0 (&pc->freq_lock){+.+.}-{3:3}, at:
    xe_guc_pc_start+0x39f/0xf70 [xe]

but task is already holding lock:

 ffffffffa1020420 (xe_rpm_nod3cold_map){+.+.}-{0:0}, at:
    xe_rpm_lockmap_acquire+0x1a/0x70 [xe]

which lock already depends on the new lock.

Possible unsafe locking scenario:
      CPU0                    CPU1
      ----                    ----
 lock(xe_rpm_nod3cold_map);
                              lock(&pc->freq_lock);
                              lock(xe_rpm_nod3cold_map);
 lock(&pc->freq_lock);

Reported-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/6122
Fixes: 60d2b7899142 ("drm/xe/guc: Add SLPC power profile interface")
Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Reviewed-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Tested-by: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Link: https://lore.kernel.org/r/20250911212024.966757-2-rodrigo.vivi@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_gt_freq.c
drivers/gpu/drm/xe/xe_guc_pc.c

index 781e4890fb26f54eb1edc2828c5cf1481dae62c3..4ff1b6b58d6be4150ebbb7886e32290b7d0ccd7b 100644 (file)
@@ -246,7 +246,9 @@ static ssize_t power_profile_store(struct kobject *kobj,
        struct xe_guc_pc *pc = dev_to_pc(dev);
        int err;
 
+       xe_pm_runtime_get(dev_to_xe(dev));
        err = xe_guc_pc_set_power_profile(pc, buff);
+       xe_pm_runtime_put(dev_to_xe(dev));
 
        return err ?: count;
 }
index 68a5bf8e394629199af83e2ec328261c2e206930..53fdf59524c41af0963d896c731dba1f3393c0c7 100644 (file)
@@ -1215,7 +1215,7 @@ int xe_guc_pc_set_power_profile(struct xe_guc_pc *pc, const char *buf)
                return -EINVAL;
 
        guard(mutex)(&pc->freq_lock);
-       xe_pm_runtime_get(pc_to_xe(pc));
+       xe_pm_runtime_get_noresume(pc_to_xe(pc));
 
        ret = pc_action_set_param(pc,
                                  SLPC_PARAM_POWER_PROFILE,