drm/xe/oa: Move fini to xe_oa

Like done with other functions, cleanup the error handling in
xe_device_probe() by moving the OA fini to be handled by xe_oa
itself, which relies on devm to call the cleanup function.

Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-9-lucas.demarchi@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
This commit is contained in:
Lucas De Marchi
2025-02-13 11:29:05 -08:00
parent f5ebe80e32
commit d3f557d52e
3 changed files with 25 additions and 31 deletions

View File

@@ -873,7 +873,7 @@ int xe_device_probe(struct xe_device *xe)
err = xe_display_init(xe);
if (err)
goto err_fini_oa;
return err;
err = xe_pxp_init(xe);
if (err)
@@ -905,9 +905,6 @@ int xe_device_probe(struct xe_device *xe)
err_fini_display:
xe_display_driver_remove(xe);
err_fini_oa:
xe_oa_fini(xe);
return err;
}
@@ -980,8 +977,6 @@ void xe_device_remove(struct xe_device *xe)
xe_device_remove_display(xe);
xe_oa_fini(xe);
xe_heci_gsc_fini(xe);
xe_device_call_remove_actions(xe);

View File

@@ -2641,6 +2641,27 @@ static void xe_oa_init_supported_formats(struct xe_oa *oa)
}
}
static int destroy_config(int id, void *p, void *data)
{
xe_oa_config_put(p);
return 0;
}
static void xe_oa_fini(void *arg)
{
struct xe_device *xe = arg;
struct xe_oa *oa = &xe->oa;
if (!oa->xe)
return;
idr_for_each(&oa->metrics_idr, destroy_config, oa);
idr_destroy(&oa->metrics_idr);
oa->xe = NULL;
}
/**
* xe_oa_init - OA initialization during device probe
* @xe: @xe_device
@@ -2672,31 +2693,10 @@ int xe_oa_init(struct xe_device *xe)
}
xe_oa_init_supported_formats(oa);
return 0;
return devm_add_action_or_reset(xe->drm.dev, xe_oa_fini, xe);
exit:
oa->xe = NULL;
return ret;
}
static int destroy_config(int id, void *p, void *data)
{
xe_oa_config_put(p);
return 0;
}
/**
* xe_oa_fini - OA de-initialization during device remove
* @xe: @xe_device
*/
void xe_oa_fini(struct xe_device *xe)
{
struct xe_oa *oa = &xe->oa;
if (!oa->xe)
return;
idr_for_each(&oa->metrics_idr, destroy_config, oa);
idr_destroy(&oa->metrics_idr);
oa->xe = NULL;
}

View File

@@ -15,7 +15,6 @@ struct xe_gt;
struct xe_hw_engine;
int xe_oa_init(struct xe_device *xe);
void xe_oa_fini(struct xe_device *xe);
void xe_oa_register(struct xe_device *xe);
void xe_oa_unregister(struct xe_device *xe);
int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *file);