]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/oa: Handle errors in xe_oa_register()
authorLucas De Marchi <lucas.demarchi@intel.com>
Thu, 13 Feb 2025 19:29:07 +0000 (11:29 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 14 Feb 2025 19:42:55 +0000 (11:42 -0800)
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>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_oa.c
drivers/gpu/drm/xe/xe_oa.h

index 6d01932f934c56e85bd3efeab8f78217a8c9f797..89a85f193f3af5692c7038e2c2540d324d41c207 100644 (file)
@@ -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);
index 2c640185bdecaadb1220cf44baf45fe3c075d3ea..d89e6cabf5a56e2c2c6053109bfd889958bc177b 100644 (file)
@@ -2423,36 +2423,36 @@ err_unlock:
        return ret;
 }
 
+static void xe_oa_unregister(void *arg)
+{
+       struct xe_oa *oa = arg;
+
+       if (!oa->metrics_kobj)
+               return;
+
+       kobject_put(oa->metrics_kobj);
+       oa->metrics_kobj = NULL;
+}
+
 /**
  * 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)
+int xe_oa_register(struct xe_device *xe)
 {
        struct xe_oa *oa = &xe->oa;
 
        if (!oa->xe)
-               return;
+               return 0;
 
        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;
-
        if (!oa->metrics_kobj)
-               return;
+               return -ENOMEM;
 
-       kobject_put(oa->metrics_kobj);
-       oa->metrics_kobj = NULL;
+       return devm_add_action_or_reset(xe->drm.dev, xe_oa_unregister, oa);
 }
 
 static u32 num_oa_units_per_gt(struct xe_gt *gt)
index eb36ce250c615a335ecce56ad909c9137f32f351..e510826f9efc6cbbd1f9e79bb5f9fd9921051bb4 100644 (file)
@@ -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);