[PATCH 4/9] drm/xe/xe_gt: Always call xe_force_wake_put/get in pairs

Nirmoy Das nirmoy.das at intel.com
Tue Jun 4 11:02:20 UTC 2024


xe_force_wake_get() increments the domain ref regardless of success
or failure so call xe_force_wake_put() even on failure to keep ref
count accurate.

Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>
---
 drivers/gpu/drm/xe/xe_gt.c         | 27 +++++++++++----------------
 drivers/gpu/drm/xe/xe_gt_debugfs.c | 10 ++++------
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
index 4e11662b78bd..8c899e203c45 100644
--- a/drivers/gpu/drm/xe/xe_gt.c
+++ b/drivers/gpu/drm/xe/xe_gt.c
@@ -363,7 +363,7 @@ static int gt_fw_domain_init(struct xe_gt *gt)
 	if (!xe_gt_is_media_type(gt)) {
 		err = xe_ggtt_init(gt_to_tile(gt)->mem.ggtt);
 		if (err)
-			goto err_force_wake;
+			goto err_dump_pat;
 		if (IS_SRIOV_PF(gt_to_xe(gt)))
 			xe_lmtt_init(&gt_to_tile(gt)->sriov.pf.lmtt);
 	}
@@ -376,16 +376,16 @@ static int gt_fw_domain_init(struct xe_gt *gt)
 
 	err = xe_hw_engines_init_early(gt);
 	if (err)
-		goto err_force_wake;
+		goto err_dump_pat;
 
 	err = xe_hw_engine_class_sysfs_init(gt);
 	if (err)
-		goto err_force_wake;
+		goto err_dump_pat;
 
 	/* Initialize CCS mode sysfs after early initialization of HW engines */
 	err = xe_gt_ccs_mode_sysfs_init(gt);
 	if (err)
-		goto err_force_wake;
+		goto err_dump_pat;
 
 	/*
 	 * Stash hardware-reported version.  Since this register does not exist
@@ -398,10 +398,10 @@ static int gt_fw_domain_init(struct xe_gt *gt)
 
 	return 0;
 
-err_force_wake:
+err_dump_pat:
 	dump_pat_on_error(gt);
-	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
 err_hw_fence_irq:
+	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i)
 		xe_hw_fence_irq_finish(&gt->fence_irq[i]);
 
@@ -414,7 +414,7 @@ static int all_fw_domain_init(struct xe_gt *gt)
 
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	if (err)
-		goto err_hw_fence_irq;
+		goto err_force_wake;
 
 	xe_gt_mcr_set_implicit_defaults(gt);
 	xe_reg_sr_apply_mmio(&gt->reg_sr, gt);
@@ -485,7 +485,6 @@ static int all_fw_domain_init(struct xe_gt *gt)
 
 err_force_wake:
 	xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-err_hw_fence_irq:
 	for (i = 0; i < XE_ENGINE_CLASS_MAX; ++i)
 		xe_hw_fence_irq_finish(&gt->fence_irq[i]);
 
@@ -502,7 +501,7 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
 
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
 	if (err)
-		goto out;
+		goto out_fw;
 
 	xe_gt_mcr_init_early(gt);
 	xe_pat_init(gt);
@@ -520,7 +519,6 @@ int xe_gt_init_hwconfig(struct xe_gt *gt)
 
 out_fw:
 	xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
-out:
 	return err;
 }
 
@@ -682,7 +680,7 @@ static int gt_reset(struct xe_gt *gt)
 
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	if (err)
-		goto err_msg;
+		goto err_out;
 
 	xe_uc_gucrc_disable(&gt->uc);
 	xe_uc_stop_prepare(&gt->uc);
@@ -710,7 +708,6 @@ static int gt_reset(struct xe_gt *gt)
 
 err_out:
 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
-err_msg:
 	XE_WARN_ON(xe_uc_start(&gt->uc));
 	xe_pm_runtime_put(gt_to_xe(gt));
 err_fail:
@@ -758,7 +755,7 @@ int xe_gt_suspend(struct xe_gt *gt)
 
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	if (err)
-		goto err_msg;
+		goto err_force_wake;
 
 	err = xe_uc_suspend(&gt->uc);
 	if (err)
@@ -773,7 +770,6 @@ int xe_gt_suspend(struct xe_gt *gt)
 
 err_force_wake:
 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
-err_msg:
 	xe_gt_err(gt, "suspend failed (%pe)\n", ERR_PTR(err));
 
 	return err;
@@ -786,7 +782,7 @@ int xe_gt_resume(struct xe_gt *gt)
 	xe_gt_dbg(gt, "resuming\n");
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
 	if (err)
-		goto err_msg;
+		goto err_force_wake;
 
 	err = do_gt_restart(gt);
 	if (err)
@@ -801,7 +797,6 @@ int xe_gt_resume(struct xe_gt *gt)
 
 err_force_wake:
 	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
-err_msg:
 	xe_gt_err(gt, "resume failed (%pe)\n", ERR_PTR(err));
 
 	return err;
diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c
index 66f897a9b6ca..9d98818045a7 100644
--- a/drivers/gpu/drm/xe/xe_gt_debugfs.c
+++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c
@@ -91,15 +91,13 @@ static int hw_engines(struct xe_gt *gt, struct drm_printer *p)
 
 	xe_pm_runtime_get(xe);
 	err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-	if (err) {
-		xe_pm_runtime_put(xe);
-		return err;
-	}
+	if (err)
+		goto err_out;
 
 	for_each_hw_engine(hwe, gt, id)
 		xe_hw_engine_print(hwe, p);
-
-	err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+err_out:
+	XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL));
 	xe_pm_runtime_put(xe);
 	if (err)
 		return err;
-- 
2.42.0



More information about the Intel-xe mailing list