Skip to content

Commit b3fbda1

Browse files
mbrost05lucasdemarchi
authored andcommitted
drm/xe: Do not wake device during a GT reset
Waking the device during a GT reset can lead to unintended memory allocation, which is not allowed since GT resets occur in the reclaim path. Prevent this by holding a PM reference while a reset is in flight. Fixes: dd08ebf ("drm/xe: Introduce a new DRM driver for Intel GPUs") Cc: [email protected] Signed-off-by: Matthew Brost <[email protected]> Reviewed-by: Matthew Auld <[email protected]> Link: https://lore.kernel.org/r/[email protected] (cherry picked from commit 480b358e7d8ef69fd8f1b0cad6e07c7d70a36ee4) Signed-off-by: Lucas De Marchi <[email protected]>
1 parent edce042 commit b3fbda1

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

drivers/gpu/drm/xe/xe_gt.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -813,21 +813,23 @@ static int gt_reset(struct xe_gt *gt)
813813
unsigned int fw_ref;
814814
int err;
815815

816-
if (xe_device_wedged(gt_to_xe(gt)))
817-
return -ECANCELED;
816+
if (xe_device_wedged(gt_to_xe(gt))) {
817+
err = -ECANCELED;
818+
goto err_pm_put;
819+
}
818820

819821
/* We only support GT resets with GuC submission */
820-
if (!xe_device_uc_enabled(gt_to_xe(gt)))
821-
return -ENODEV;
822+
if (!xe_device_uc_enabled(gt_to_xe(gt))) {
823+
err = -ENODEV;
824+
goto err_pm_put;
825+
}
822826

823827
xe_gt_info(gt, "reset started\n");
824828

825829
err = gt_wait_reset_unblock(gt);
826830
if (!err)
827831
xe_gt_warn(gt, "reset block failed to get lifted");
828832

829-
xe_pm_runtime_get(gt_to_xe(gt));
830-
831833
if (xe_fault_inject_gt_reset()) {
832834
err = -ECANCELED;
833835
goto err_fail;
@@ -874,6 +876,7 @@ static int gt_reset(struct xe_gt *gt)
874876
xe_gt_err(gt, "reset failed (%pe)\n", ERR_PTR(err));
875877

876878
xe_device_declare_wedged(gt_to_xe(gt));
879+
err_pm_put:
877880
xe_pm_runtime_put(gt_to_xe(gt));
878881

879882
return err;
@@ -895,7 +898,9 @@ void xe_gt_reset_async(struct xe_gt *gt)
895898
return;
896899

897900
xe_gt_info(gt, "reset queued\n");
898-
queue_work(gt->ordered_wq, &gt->reset.worker);
901+
xe_pm_runtime_get_noresume(gt_to_xe(gt));
902+
if (!queue_work(gt->ordered_wq, &gt->reset.worker))
903+
xe_pm_runtime_put(gt_to_xe(gt));
899904
}
900905

901906
void xe_gt_suspend_prepare(struct xe_gt *gt)

0 commit comments

Comments
 (0)