msm: camera: memmgr: reduce mutex lock duration
Allow concurrent calls to unmap buffer by reducing the mutex lock duration, and allow same fd for mapping user iova, use book keeping for user smmu. CRs-Fixed: 2559879 Change-Id: Ic3c92d4fa0ca7d1c29e621172e0b058420e1501d Signed-off-by: Haibin Liu <haibinl@codeaurora.org>
This commit is contained in:
@@ -254,8 +254,11 @@ int cam_mem_get_io_buf(int32_t buf_handle, int32_t mmu_handle,
|
||||
if (idx >= CAM_MEM_BUFQ_MAX || idx <= 0)
|
||||
return -ENOENT;
|
||||
|
||||
if (!tbl.bufq[idx].active)
|
||||
if (!tbl.bufq[idx].active) {
|
||||
CAM_ERR(CAM_MEM, "Buffer at idx=%d is already unmapped,",
|
||||
idx);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
mutex_lock(&tbl.bufq[idx].q_lock);
|
||||
if (buf_handle != tbl.bufq[idx].buf_handle) {
|
||||
@@ -310,8 +313,11 @@ int cam_mem_get_cpu_buf(int32_t buf_handle, uintptr_t *vaddr_ptr, size_t *len)
|
||||
if (idx >= CAM_MEM_BUFQ_MAX || idx <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!tbl.bufq[idx].active)
|
||||
if (!tbl.bufq[idx].active) {
|
||||
CAM_ERR(CAM_MEM, "Buffer at idx=%d is already unmapped,",
|
||||
idx);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
if (buf_handle != tbl.bufq[idx].buf_handle)
|
||||
return -EINVAL;
|
||||
@@ -353,6 +359,8 @@ int cam_mem_mgr_cache_ops(struct cam_mem_cache_ops_cmd *cmd)
|
||||
mutex_lock(&tbl.bufq[idx].q_lock);
|
||||
|
||||
if (!tbl.bufq[idx].active) {
|
||||
CAM_ERR(CAM_MEM, "Buffer at idx=%d is already unmapped,",
|
||||
idx);
|
||||
rc = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
@@ -1061,6 +1069,13 @@ static int cam_mem_util_unmap(int32_t idx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Deactivate the buffer queue to prevent multiple unmap */
|
||||
mutex_lock(&tbl.bufq[idx].q_lock);
|
||||
tbl.bufq[idx].active = false;
|
||||
tbl.bufq[idx].vaddr = 0;
|
||||
mutex_unlock(&tbl.bufq[idx].q_lock);
|
||||
mutex_unlock(&tbl.m_lock);
|
||||
|
||||
if (tbl.bufq[idx].flags & CAM_MEM_FLAG_KMD_ACCESS) {
|
||||
if (tbl.bufq[idx].dma_buf && tbl.bufq[idx].kmdvaddr) {
|
||||
rc = cam_mem_util_unmap_cpu_va(tbl.bufq[idx].dma_buf,
|
||||
@@ -1091,10 +1106,10 @@ static int cam_mem_util_unmap(int32_t idx,
|
||||
tbl.bufq[idx].dma_buf = NULL;
|
||||
}
|
||||
|
||||
mutex_lock(&tbl.m_lock);
|
||||
mutex_lock(&tbl.bufq[idx].q_lock);
|
||||
tbl.bufq[idx].flags = 0;
|
||||
tbl.bufq[idx].buf_handle = -1;
|
||||
tbl.bufq[idx].vaddr = 0;
|
||||
memset(tbl.bufq[idx].hdls, 0,
|
||||
sizeof(int32_t) * CAM_MEM_MMU_MAX_HANDLE);
|
||||
|
||||
@@ -1113,7 +1128,6 @@ static int cam_mem_util_unmap(int32_t idx,
|
||||
tbl.bufq[idx].is_internal = false;
|
||||
tbl.bufq[idx].len = 0;
|
||||
tbl.bufq[idx].num_hdl = 0;
|
||||
tbl.bufq[idx].active = false;
|
||||
memset(&tbl.bufq[idx].timestamp, 0, sizeof(struct timespec64));
|
||||
mutex_unlock(&tbl.bufq[idx].q_lock);
|
||||
mutex_destroy(&tbl.bufq[idx].q_lock);
|
||||
|
Reference in New Issue
Block a user