int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
 {
        struct radeon_device *rdev = dev->dev_private;
+       struct radeon_fpriv *fpriv;
+       struct radeon_vm *vm;
        int r;
 
        file_priv->driver_priv = NULL;
 
        /* new gpu have virtual address space support */
        if (rdev->family >= CHIP_CAYMAN) {
-               struct radeon_fpriv *fpriv;
-               struct radeon_vm *vm;
 
                fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
                if (unlikely(!fpriv)) {
                if (rdev->accel_working) {
                        vm = &fpriv->vm;
                        r = radeon_vm_init(rdev, vm);
-                       if (r) {
-                               kfree(fpriv);
-                               goto out_suspend;
-                       }
+                       if (r)
+                               goto out_fpriv;
 
                        r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
-                       if (r) {
-                               radeon_vm_fini(rdev, vm);
-                               kfree(fpriv);
-                               goto out_suspend;
-                       }
+                       if (r)
+                               goto out_vm_fini;
 
                        /* map the ib pool buffer read only into
                         * virtual address space */
                        vm->ib_bo_va = radeon_vm_bo_add(rdev, vm,
                                                        rdev->ring_tmp_bo.bo);
+                       if (!vm->ib_bo_va) {
+                               r = -ENOMEM;
+                               goto out_vm_fini;
+                       }
+
                        r = radeon_vm_bo_set_addr(rdev, vm->ib_bo_va,
                                                  RADEON_VA_IB_OFFSET,
                                                  RADEON_VM_PAGE_READABLE |
                                                  RADEON_VM_PAGE_SNOOPED);
-                       if (r) {
-                               radeon_vm_fini(rdev, vm);
-                               kfree(fpriv);
-                               goto out_suspend;
-                       }
+                       if (r)
+                               goto out_vm_fini;
                }
                file_priv->driver_priv = fpriv;
        }
 
+       if (!r)
+               goto out_suspend;
+
+out_vm_fini:
+       radeon_vm_fini(rdev, vm);
+out_fpriv:
+       kfree(fpriv);
 out_suspend:
        pm_runtime_mark_last_busy(dev->dev);
        pm_runtime_put_autosuspend(dev->dev);