drm/xe/oa: Move fini to xe_oa
authorLucas De Marchi <lucas.demarchi@intel.com>
Thu, 13 Feb 2025 19:29:05 +0000 (11:29 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 14 Feb 2025 19:42:55 +0000 (11:42 -0800)
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>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_oa.c
drivers/gpu/drm/xe/xe_oa.h

index 398fad6c53658a5b35d111092459b091c120cb9c..d0b1c280ddd3a8ee8d2996f761bff415b55f7819 100644 (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);
index fa873f3d0a9d10ea9b22f065f9eaa64b34cd9817..2c640185bdecaadb1220cf44baf45fe3c075d3ea 100644 (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;
-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);
+       return devm_add_action_or_reset(xe->drm.dev, xe_oa_fini, xe);
 
+exit:
        oa->xe = NULL;
+       return ret;
 }
index 87a38820c317d7e158aad167cb4460475ef87db7..eb36ce250c615a335ecce56ad909c9137f32f351 100644 (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);