drm/xe/oa: Handle errors in xe_oa_register()

Let xe_oa_unregister() be handled by devm infra since it's only putting
the kobject. Also, since kobject_create_and_add may fail, handle the
error accordingly.

Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-11-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:07 -08:00
parent 00f6a86c3c
commit 960d71044e
3 changed files with 32 additions and 31 deletions

@ -877,15 +877,17 @@ int xe_device_probe(struct xe_device *xe)
err = xe_pxp_init(xe);
if (err)
goto err_fini_display;
goto err_remove_display;
err = drm_dev_register(&xe->drm, 0);
if (err)
goto err_fini_display;
goto err_remove_display;
xe_display_register(xe);
xe_oa_register(xe);
err = xe_oa_register(xe);
if (err)
goto err_unregister_display;
xe_pmu_register(&xe->pmu);
@ -902,7 +904,9 @@ int xe_device_probe(struct xe_device *xe)
return devm_add_action_or_reset(xe->drm.dev, xe_device_sanitize, xe);
err_fini_display:
err_unregister_display:
xe_display_unregister(xe);
err_remove_display:
xe_display_driver_remove(xe);
return err;
@ -971,8 +975,6 @@ void xe_device_remove(struct xe_device *xe)
xe_display_driver_remove(xe);
xe_oa_unregister(xe);
xe_heci_gsc_fini(xe);
xe_device_call_remove_actions(xe);

@ -2423,30 +2423,9 @@ int xe_oa_remove_config_ioctl(struct drm_device *dev, u64 data, struct drm_file
return ret;
}
/**
* xe_oa_register - Xe OA registration
* @xe: @xe_device
*
* Exposes the metrics sysfs directory upon completion of module initialization
*/
void xe_oa_register(struct xe_device *xe)
static void xe_oa_unregister(void *arg)
{
struct xe_oa *oa = &xe->oa;
if (!oa->xe)
return;
oa->metrics_kobj = kobject_create_and_add("metrics",
&xe->drm.primary->kdev->kobj);
}
/**
* xe_oa_unregister - Xe OA de-registration
* @xe: @xe_device
*/
void xe_oa_unregister(struct xe_device *xe)
{
struct xe_oa *oa = &xe->oa;
struct xe_oa *oa = arg;
if (!oa->metrics_kobj)
return;
@ -2455,6 +2434,27 @@ void xe_oa_unregister(struct xe_device *xe)
oa->metrics_kobj = NULL;
}
/**
* xe_oa_register - Xe OA registration
* @xe: @xe_device
*
* Exposes the metrics sysfs directory upon completion of module initialization
*/
int xe_oa_register(struct xe_device *xe)
{
struct xe_oa *oa = &xe->oa;
if (!oa->xe)
return 0;
oa->metrics_kobj = kobject_create_and_add("metrics",
&xe->drm.primary->kdev->kobj);
if (!oa->metrics_kobj)
return -ENOMEM;
return devm_add_action_or_reset(xe->drm.dev, xe_oa_unregister, oa);
}
static u32 num_oa_units_per_gt(struct xe_gt *gt)
{
return 1;

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