mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 15:11:48 -04:00
qseecom: Proper handling of unmapping dmabuf
After unmapping the dmabuf, the pointers for dmabuf and sg lists should be explicitly made NULL. This change takes care of releasing the already unmapped dma buf pointers and sg pointers. Change-Id: Ia33231af761eddbdd6f71fda2c16b37289724b2e Signed-off-by: Anmolpreet Kaur <anmolpre@codeaurora.org>
This commit is contained in:
parent
fafcdeebed
commit
c99a759add
1 changed files with 41 additions and 10 deletions
|
|
@ -190,6 +190,13 @@ struct sglist_info {
|
|||
#define MAKE_WHITELIST_VERSION(major, minor, patch) \
|
||||
(((major & 0x3FF) << 22) | ((minor & 0x3FF) << 12) | (patch & 0xFFF))
|
||||
|
||||
#define MAKE_NULL(sgt, attach, dmabuf) do {\
|
||||
sgt = NULL;\
|
||||
attach = NULL;\
|
||||
dmabuf = NULL;\
|
||||
} while (0)
|
||||
|
||||
|
||||
struct qseecom_registered_listener_list {
|
||||
struct list_head list;
|
||||
struct qseecom_register_listener_req svc;
|
||||
|
|
@ -1432,6 +1439,7 @@ static int qseecom_vaddr_map(int ion_fd,
|
|||
err_unmap:
|
||||
dma_buf_end_cpu_access(new_dma_buf, DMA_BIDIRECTIONAL);
|
||||
qseecom_dmabuf_unmap(new_sgt, new_attach, new_dma_buf);
|
||||
MAKE_NULL(*sgt, *attach, *dmabuf);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1508,9 +1516,11 @@ static int __qseecom_set_sb_memory(struct qseecom_registered_listener_list *svc,
|
|||
}
|
||||
return 0;
|
||||
err:
|
||||
if (svc->dmabuf)
|
||||
if (svc->dmabuf) {
|
||||
qseecom_vaddr_unmap(svc->sb_virt, svc->sgt, svc->attach,
|
||||
svc->dmabuf);
|
||||
MAKE_NULL(svc->sgt, svc->attach, svc->dmabuf);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1636,9 +1646,11 @@ static int __qseecom_unregister_listener(struct qseecom_dev_handle *data,
|
|||
}
|
||||
|
||||
exit:
|
||||
if (ptr_svc->dmabuf)
|
||||
if (ptr_svc->dmabuf) {
|
||||
qseecom_vaddr_unmap(ptr_svc->sb_virt,
|
||||
ptr_svc->sgt, ptr_svc->attach, ptr_svc->dmabuf);
|
||||
MAKE_NULL(ptr_svc->sgt, ptr_svc->attach, ptr_svc->dmabuf);
|
||||
}
|
||||
__qseecom_free_tzbuf(&ptr_svc->sglistinfo_shm);
|
||||
list_del(&ptr_svc->list);
|
||||
kzfree(ptr_svc);
|
||||
|
|
@ -2049,9 +2061,12 @@ static int qseecom_set_client_mem_param(struct qseecom_dev_handle *data,
|
|||
|
||||
return ret;
|
||||
exit:
|
||||
if (data->client.dmabuf)
|
||||
if (data->client.dmabuf) {
|
||||
qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt,
|
||||
data->client.attach, data->client.dmabuf);
|
||||
MAKE_NULL(data->client.sgt,
|
||||
data->client.attach, data->client.dmabuf);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -2992,8 +3007,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
|
|||
}
|
||||
|
||||
loadapp_err:
|
||||
if (dmabuf)
|
||||
if (dmabuf) {
|
||||
qseecom_vaddr_unmap(vaddr, sgt, attach, dmabuf);
|
||||
MAKE_NULL(sgt, attach, dmabuf);
|
||||
}
|
||||
checkapp_err:
|
||||
__qseecom_disable_clk_scale_down(data);
|
||||
enable_clk_err:
|
||||
|
|
@ -3129,9 +3146,12 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data,
|
|||
}
|
||||
|
||||
unload_exit:
|
||||
if (data->client.dmabuf)
|
||||
if (data->client.dmabuf) {
|
||||
qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt,
|
||||
data->client.attach, data->client.dmabuf);
|
||||
MAKE_NULL(data->client.sgt,
|
||||
data->client.attach, data->client.dmabuf);
|
||||
}
|
||||
data->released = true;
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -4063,8 +4083,10 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
|
|||
}
|
||||
return ret;
|
||||
err:
|
||||
if (!IS_ERR_OR_NULL(sg_ptr))
|
||||
if (!IS_ERR_OR_NULL(sg_ptr)) {
|
||||
qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf);
|
||||
MAKE_NULL(sg_ptr, attach, dmabuf);
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -4301,8 +4323,10 @@ err:
|
|||
data->client.sec_buf_fd[i].size,
|
||||
data->client.sec_buf_fd[i].vbase,
|
||||
data->client.sec_buf_fd[i].pbase);
|
||||
if (!IS_ERR_OR_NULL(sg_ptr))
|
||||
if (!IS_ERR_OR_NULL(sg_ptr)) {
|
||||
qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf);
|
||||
MAKE_NULL(sg_ptr, attach, dmabuf);
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -5867,8 +5891,10 @@ exit_register_bus_bandwidth_needs:
|
|||
}
|
||||
|
||||
exit_cpu_restore:
|
||||
if (dmabuf)
|
||||
if (dmabuf) {
|
||||
qseecom_vaddr_unmap(va, sgt, attach, dmabuf);
|
||||
MAKE_NULL(sgt, attach, dmabuf);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -7122,8 +7148,10 @@ clean:
|
|||
}
|
||||
return ret;
|
||||
err:
|
||||
if (!IS_ERR_OR_NULL(sg_ptr))
|
||||
if (!IS_ERR_OR_NULL(sg_ptr)) {
|
||||
qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf);
|
||||
MAKE_NULL(sg_ptr, attach, dmabuf);
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -8314,10 +8342,13 @@ static int qseecom_release(struct inode *inode, struct file *file)
|
|||
break;
|
||||
case QSEECOM_SECURE_SERVICE:
|
||||
case QSEECOM_GENERIC:
|
||||
if (data->client.dmabuf)
|
||||
if (data->client.dmabuf) {
|
||||
qseecom_vaddr_unmap(data->client.sb_virt,
|
||||
data->client.sgt, data->client.attach,
|
||||
data->client.dmabuf);
|
||||
MAKE_NULL(data->client.sgt, data->client.attach,
|
||||
data->client.dmabuf);
|
||||
}
|
||||
break;
|
||||
case QSEECOM_UNAVAILABLE_CLIENT_APP:
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue