idr_init(&mgr->ctx_handles);
 }
 
-void amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr)
+long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout)
 {
        unsigned num_entities = amdgput_ctx_total_num_entities();
        struct amdgpu_ctx *ctx;
        struct idr *idp;
        uint32_t id, i;
-       long max_wait = MAX_WAIT_SCHED_ENTITY_Q_EMPTY;
 
        idp = &mgr->ctx_handles;
 
                        struct drm_sched_entity *entity;
 
                        entity = &ctx->entities[0][i].entity;
-                       max_wait = drm_sched_entity_flush(entity, max_wait);
+                       timeout = drm_sched_entity_flush(entity, timeout);
                }
        }
        mutex_unlock(&mgr->lock);
+       return timeout;
 }
 
 void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr)
 
 
 void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr);
 void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr);
-void amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr);
+long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout);
 void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr);
 
 #endif
 
 {
        struct drm_file *file_priv = f->private_data;
        struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
+       long timeout = MAX_WAIT_SCHED_ENTITY_Q_EMPTY;
 
-       amdgpu_ctx_mgr_entity_flush(&fpriv->ctx_mgr);
+       timeout = amdgpu_ctx_mgr_entity_flush(&fpriv->ctx_mgr, timeout);
+       timeout = amdgpu_vm_wait_idle(&fpriv->vm, timeout);
 
-       return 0;
+       return timeout >= 0 ? 0 : timeout;
 }
 
-
 static const struct file_operations amdgpu_driver_kms_fops = {
        .owner = THIS_MODULE,
        .open = drm_open,
 
                 adev->vm_manager.fragment_size);
 }
 
+/**
+ * amdgpu_vm_wait_idle - wait for the VM to become idle
+ *
+ * @vm: VM object to wait for
+ * @timeout: timeout to wait for VM to become idle
+ */
+long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)
+{
+       return reservation_object_wait_timeout_rcu(vm->root.base.bo->tbo.resv,
+                                                  true, true, timeout);
+}
+
 /**
  * amdgpu_vm_init - initialize a vm instance
  *
 
 
 void amdgpu_vm_manager_init(struct amdgpu_device *adev);
 void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
+
+long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout);
 int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                   int vm_context, unsigned int pasid);
 int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid);