drm/xe: Call drmm_add_action_or_reset() early in xe_device_create()
authorGustavo Sousa <gustavo.sousa@intel.com>
Thu, 18 May 2023 21:56:50 +0000 (18:56 -0300)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:33:57 +0000 (18:33 -0500)
Otherwise no cleanup is actually done if we branch to err_put.

This works for now: currently we do know that, once inside
xe_device_destroy(), ttm_device_init() was successful so we can safely
call ttm_device_fini(); and, for xe->ordered_wq, there is an upcoming
commit to check its value before calling destroy_workqueue().

However, we might need change this in the future if we have more
initializers called that can fail in a way that we can not know which
one was it once inside xe_device_destroy().

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://lore.kernel.org/r/20230518215651.502159-2-gustavo.sousa@intel.com
Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_device.c

index 8039142ae1a1cc645907c756a6fa0a151ed95342..42456d0448278c251c94f548fc5adcf5e5613236 100644 (file)
@@ -181,6 +181,10 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
        if (WARN_ON(err))
                goto err_put;
 
+       err = drmm_add_action_or_reset(&xe->drm, xe_device_destroy, NULL);
+       if (err)
+               goto err_put;
+
        xe->info.devid = pdev->device;
        xe->info.revid = pdev->revision;
        xe->info.enable_guc = enable_guc;
@@ -205,10 +209,6 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
        drmm_mutex_init(&xe->drm, &xe->sb_lock);
        xe->enabled_irq_mask = ~0;
 
-       err = drmm_add_action_or_reset(&xe->drm, xe_device_destroy, NULL);
-       if (err)
-               goto err_put;
-
        return xe;
 
 err_put: