Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 227afbfe authored by Christian König's avatar Christian König Committed by Greg Kroah-Hartman
Browse files

drm/radeon: fix error handling in radeon_driver_open_kms



commit 4722f463896cc0ef1a6f1c3cb2e171e949831249 upstream.

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: default avatarChristian König <christian.koenig@amd.com>
Tested-by: default avatarJan Stancek <jstancek@redhat.com>
Tested-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d820cb63
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -652,18 +652,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 */
@@ -671,7 +671,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,
@@ -679,19 +679,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;