drm/radeon: fix error handling in radeon_driver_open_kms
authorChristian König <christian.koenig@amd.com>
Mon, 17 Jan 2022 09:31:26 +0000 (10:31 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Jan 2022 22:41:18 +0000 (17:41 -0500)
The return value was never initialized so the cleanup code executed when
it isn't even necessary.

Just add proper error handling.

Fixes: ab50cb9df889 ("drm/radeon/radeon_kms: Fix a NULL pointer dereference in radeon_driver_open_kms()")
Signed-off-by: Christian König <christian.koenig@amd.com>
Tested-by: Jan Stancek <jstancek@redhat.com>
Tested-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon_kms.c

index e248855..11ad210 100644 (file)
@@ -666,18 +666,18 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
                if (unlikely(!fpriv)) {
                        r = -ENOMEM;
-                       goto out_suspend;
+                       goto err_suspend;
                }
 
                if (rdev->accel_working) {
                        vm = &fpriv->vm;
                        r = radeon_vm_init(rdev, vm);
                        if (r)
-                               goto out_fpriv;
+                               goto err_fpriv;
 
                        r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
                        if (r)
-                               goto out_vm_fini;
+                               goto err_vm_fini;
 
                        /* map the ib pool buffer read only into
                         * virtual address space */
@@ -685,7 +685,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                                                        rdev->ring_tmp_bo.bo);
                        if (!vm->ib_bo_va) {
                                r = -ENOMEM;
-                               goto out_vm_fini;
+                               goto err_vm_fini;
                        }
 
                        r = radeon_vm_bo_set_addr(rdev, vm->ib_bo_va,
@@ -693,19 +693,21 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
                                                  RADEON_VM_PAGE_READABLE |
                                                  RADEON_VM_PAGE_SNOOPED);
                        if (r)
-                               goto out_vm_fini;
+                               goto err_vm_fini;
                }
                file_priv->driver_priv = fpriv;
        }
 
-       if (!r)
-               goto out_suspend;
+       pm_runtime_mark_last_busy(dev->dev);
+       pm_runtime_put_autosuspend(dev->dev);
+       return 0;
 
-out_vm_fini:
+err_vm_fini:
        radeon_vm_fini(rdev, vm);
-out_fpriv:
+err_fpriv:
        kfree(fpriv);
-out_suspend:
+
+err_suspend:
        pm_runtime_mark_last_busy(dev->dev);
        pm_runtime_put_autosuspend(dev->dev);
        return r;