drm/radeon: fix error handling in radeon_driver_open_kms
authorjsg <jsg@openbsd.org>
Thu, 27 Jan 2022 23:26:35 +0000 (23:26 +0000)
committerjsg <jsg@openbsd.org>
Thu, 27 Jan 2022 23:26:35 +0000 (23:26 +0000)
From Christian Koenig
f22f67b43775fffb09f371ea861779cdbbb763ec in linux 5.15.y/5.15.17
4722f463896cc0ef1a6f1c3cb2e171e949831249 in mainline linux

sys/dev/pci/drm/radeon/radeon_kms.c

index 8a711de..a2d53f7 100644 (file)
@@ -1383,18 +1383,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 */
@@ -1402,7 +1402,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,
@@ -1410,19 +1410,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;