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:
parent
00f6a86c3c
commit
960d71044e
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user