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:
Haibin Liu
2019-09-27 20:05:04 +08:00
parent 8e44ef7540
commit 891c47b17e
2 changed files with 50 additions and 6 deletions

View File

@@ -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);