The user queue object destroy requires ensuring its VA hasn't been unmapped illegally prior to the queue being destroyed. Otherwise, the kernel driver should report an invalidated error to the user IOCLT request.
Signed-off-by: Prike Liang <prike.li...@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c index 3854b1696d4d..6267993deb8c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -470,6 +470,17 @@ amdgpu_userq_destroy(struct drm_file *filp, int queue_id) amdgpu_bo_unpin(queue->db_obj.obj); amdgpu_bo_unreserve(queue->db_obj.obj); } + + /* + * At this point the userq obj va should be mapped, + * otherwise will return error to user. + */ + if (!amdgpu_userq_buffer_vas_mapped(&fpriv->vm, queue)) { + drm_warn(adev_to_drm(uq_mgr->adev), "the userq obj va already unmaped\n"); + mutex_unlock(&uq_mgr->userq_mutex); + return -EINVAL; + } + r = amdgpu_userq_unmap_helper(uq_mgr, queue); if (r != AMDGPU_USERQ_STATE_UNMAPPED) { drm_dbg_driver(adev_to_drm(uq_mgr->adev), "Can't unmap the queue for destroying.\n"); @@ -477,6 +488,8 @@ amdgpu_userq_destroy(struct drm_file *filp, int queue_id) /*TODO: before return may need to a reset*/ return r; } + + amdgpu_userq_buffer_vas_put(&fpriv->vm, queue); amdgpu_userq_cleanup(uq_mgr, queue, queue_id); mutex_unlock(&uq_mgr->userq_mutex); @@ -600,6 +613,12 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args) goto unlock; } + /* refer to the userq objects vm bo*/ + amdgpu_userq_buffer_va_get(queue->vm, args->in.doorbell_handle); + amdgpu_userq_buffer_va_get(queue->vm, args->in.queue_va); + amdgpu_userq_buffer_va_get(queue->vm, args->in.rptr_va); + amdgpu_userq_buffer_va_get(queue->vm, args->in.wptr_va); + qid = idr_alloc(&uq_mgr->userq_idr, queue, 1, AMDGPU_MAX_USERQ_COUNT, GFP_KERNEL); if (qid < 0) { drm_file_err(uq_mgr->file, "Failed to allocate a queue id\n"); -- 2.34.1