Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58588fb6 authored by Pavan Kumar Chilamkurthi's avatar Pavan Kumar Chilamkurthi
Browse files

msm: camera: memmgr: Add error handling get slot failure



Not calling unmap_hw_va if get_slot() fails causes a stale
entry in smmu CB. since get_slot failed, memmgr table
returns error and memmgr, umd doesn't keep info about this
map entry though smmu CB still has this mapping - This
causes any further map calls on the same 'fd' as smmu
return MAP_EXISTS but CSL bookkeeping doesn't have it.

CRs-Fixed: 2788167
Change-Id: Ibb1450f089b9f175ccdbcfb4f5ecc245a5539bd1
Signed-off-by: default avatarPavan Kumar Chilamkurthi <pchilamk@codeaurora.org>
parent 6f7608c0
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -830,6 +830,14 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd)

	is_internal = cam_mem_util_is_map_internal(cmd->fd);

	idx = cam_mem_get_slot();
	if (idx < 0) {
		CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d, fd=%d",
			idx, cmd->fd);
		rc = -ENOMEM;
		goto slot_fail;
	}

	if ((cmd->flags & CAM_MEM_FLAG_HW_READ_WRITE) ||
		(cmd->flags & CAM_MEM_FLAG_PROTECTED_MODE)) {
		rc = cam_mem_util_map_hw_va(cmd->flags,
@@ -855,12 +863,6 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd)
		}
	}

	idx = cam_mem_get_slot();
	if (idx < 0) {
		rc = -ENOMEM;
		goto map_fail;
	}

	mutex_lock(&tbl.bufq[idx].q_lock);
	tbl.bufq[idx].fd = cmd->fd;
	tbl.bufq[idx].dma_buf = NULL;
@@ -893,8 +895,9 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd)
		tbl.bufq[idx].len);

	return rc;

map_fail:
	cam_mem_put_slot(idx);
slot_fail:
	dma_buf_put(dmabuf);
	return rc;
}
@@ -1266,6 +1269,7 @@ int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp,

	idx = cam_mem_get_slot();
	if (idx < 0) {
		CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx);
		rc = -ENOMEM;
		goto slot_fail;
	}
@@ -1414,6 +1418,7 @@ int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp,

	idx = cam_mem_get_slot();
	if (idx < 0) {
		CAM_ERR(CAM_MEM, "Failed in getting mem slot, idx=%d", idx);
		rc = -ENOMEM;
		goto slot_fail;
	}