msm: eva: enhance DSP session resource management

Improve debugability and error handling in future.

Change-Id: I4f116e106f243143f4f62eb28fbf338e219018c6
Signed-off-by: George Shen <sqiao@codeaurora.org>
This commit is contained in:
George Shen
2021-02-17 23:42:14 -08:00
parent db00dd2137
commit 6f2d4b9361
7 changed files with 148 additions and 112 deletions

View File

@@ -1011,17 +1011,30 @@ int msm_cvp_session_deinit_buffers(struct msm_cvp_inst *inst)
mutex_unlock(&inst->dma_cache.lock);
mutex_lock(&inst->cvpdspbufs.lock);
list_for_each_entry_safe(cbuf, dummy, &inst->cvpdspbufs.list,
list) {
list_for_each_entry_safe(cbuf, dummy, &inst->cvpdspbufs.list, list) {
print_internal_buffer(CVP_MEM, "remove dspbufs", inst, cbuf);
rc = cvp_dsp_deregister_buffer(hash32_ptr(session),
cbuf->fd, cbuf->smem->dma_buf->size, cbuf->size,
cbuf->offset, cbuf->index,
(uint32_t)cbuf->smem->device_addr);
if (rc)
dprintk(CVP_ERR,
if (cbuf->ownership == CLIENT) {
rc = cvp_dsp_deregister_buffer(hash32_ptr(session),
cbuf->fd, cbuf->smem->dma_buf->size, cbuf->size,
cbuf->offset, cbuf->index,
(uint32_t)cbuf->smem->device_addr);
if (rc)
dprintk(CVP_ERR,
"%s: failed dsp deregistration fd=%d rc=%d",
__func__, cbuf->fd, rc);
} else if (cbuf->ownership == DSP) {
rc = cvp_dsp_fastrpc_unmap(inst->process_id, cbuf);
if (rc)
dprintk(CVP_ERR,
"%s: failed to unmap buf from DSP\n",
__func__);
rc = cvp_release_dsp_buffers(inst, cbuf);
if (rc)
dprintk(CVP_ERR,
"%s Fail to free buffer 0x%x\n",
__func__, rc);
}
msm_cvp_unmap_smem(inst, cbuf->smem, "unmap dsp");
msm_cvp_smem_put_dma_buf(cbuf->smem->dma_buf);
@@ -1232,7 +1245,7 @@ int cvp_allocate_dsp_bufs(struct msm_cvp_inst *inst,
return -EINVAL;
}
dprintk(CVP_ERR, "%s smem_flags 0x%x\n", __func__, smem_flags);
dprintk(CVP_MEM, "%s smem_flags 0x%x\n", __func__, smem_flags);
buf->smem = kmem_cache_zalloc(cvp_driver->smem_cache, GFP_KERNEL);
if (!buf->smem) {
dprintk(CVP_ERR, "%s Out of memory\n", __func__);
@@ -1246,11 +1259,11 @@ int cvp_allocate_dsp_bufs(struct msm_cvp_inst *inst,
goto err_no_mem;
}
dprintk(CVP_ERR, "%s dma_buf %pK\n", __func__, buf->smem->dma_buf);
dprintk(CVP_MEM, "%s dma_buf %pK\n", __func__, buf->smem->dma_buf);
buf->size = buf->smem->size;
buf->type = HFI_BUFFER_INTERNAL_PERSIST_1;
buf->ownership = CLIENT;
buf->ownership = DSP;
return rc;
@@ -1282,13 +1295,18 @@ int cvp_release_dsp_buffers(struct msm_cvp_inst *inst,
return -EINVAL;
}
if (buf->ownership == CLIENT) {
if (buf->ownership == DSP) {
dprintk(CVP_MEM,
"%s: %x : fd %x %s size %d",
"free dsp buf", hash32_ptr(inst->session), buf->fd,
"%s: %x : fd %x %s size %d",
__func__, hash32_ptr(inst->session), buf->fd,
smem->dma_buf->name, buf->size);
msm_cvp_smem_free(smem);
kmem_cache_free(cvp_driver->smem_cache, smem);
} else {
dprintk(CVP_ERR,
"%s: wrong owner %d %x : fd %x %s size %d",
__func__, buf->ownership, hash32_ptr(inst->session),
buf->fd, smem->dma_buf->name, buf->size);
}
return rc;