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