drm/xe: make gt_remove use devm

No need to hand roll the onion unwind here, just move gt_remove over to
devm which will already have the correct ordering.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240522102143.128069-31-matthew.auld@intel.com
This commit is contained in:
Matthew Auld 2024-05-22 11:21:56 +01:00
parent 1bd985ff9f
commit cd506a33b0
3 changed files with 9 additions and 30 deletions

View File

@ -538,7 +538,6 @@ int xe_device_probe(struct xe_device *xe)
struct xe_tile *tile;
struct xe_gt *gt;
int err;
u8 last_gt;
u8 id;
xe_pat_init_early(xe);
@ -626,18 +625,16 @@ int xe_device_probe(struct xe_device *xe)
goto err_irq_shutdown;
for_each_gt(gt, xe, id) {
last_gt = id;
err = xe_gt_init(gt);
if (err)
goto err_fini_gt;
goto err_irq_shutdown;
}
xe_heci_gsc_init(xe);
err = xe_display_init(xe);
if (err)
goto err_fini_gt;
goto err_irq_shutdown;
err = drm_dev_register(&xe->drm, 0);
if (err)
@ -653,15 +650,6 @@ int xe_device_probe(struct xe_device *xe)
err_fini_display:
xe_display_driver_remove(xe);
err_fini_gt:
for_each_gt(gt, xe, id) {
if (id < last_gt)
xe_gt_remove(gt);
else
break;
}
err_irq_shutdown:
xe_irq_shutdown(xe);
err:
@ -679,18 +667,12 @@ static void xe_device_remove_display(struct xe_device *xe)
void xe_device_remove(struct xe_device *xe)
{
struct xe_gt *gt;
u8 id;
xe_device_remove_display(xe);
xe_display_fini(xe);
xe_heci_gsc_fini(xe);
for_each_gt(gt, xe, id)
xe_gt_remove(gt);
xe_irq_shutdown(xe);
}

View File

@ -93,16 +93,14 @@ void xe_gt_sanitize(struct xe_gt *gt)
gt->uc.guc.submission_state.enabled = false;
}
/**
* xe_gt_remove() - Clean up the GT structures before driver removal
* @gt: the GT object
*
* This function should only act on objects/structures that must be cleaned
* before the driver removal callback is complete and therefore can't be
* deferred to a drmm action.
/*
* Clean up the GT structures before driver removal. This function should only
* act on objects/structures that must be cleaned before the driver removal
* callback is complete and therefore can't be deferred to a drmm action.
*/
void xe_gt_remove(struct xe_gt *gt)
static void gt_remove(void *arg)
{
struct xe_gt *gt = arg;
int i;
xe_uc_remove(&gt->uc);
@ -568,7 +566,7 @@ int xe_gt_init(struct xe_gt *gt)
xe_gt_record_user_engines(gt);
return 0;
return devm_add_action_or_reset(gt_to_xe(gt)->drm.dev, gt_remove, gt);
}
void xe_gt_record_user_engines(struct xe_gt *gt)

View File

@ -56,7 +56,6 @@ int xe_gt_suspend(struct xe_gt *gt);
int xe_gt_resume(struct xe_gt *gt);
void xe_gt_reset_async(struct xe_gt *gt);
void xe_gt_sanitize(struct xe_gt *gt);
void xe_gt_remove(struct xe_gt *gt);
/**
* xe_gt_any_hw_engine_by_reset_domain - scan the list of engines and return the