Merge "qseecom: Proper handling of unmapping dmabuf"

This commit is contained in:
qctecmdr 2020-03-23 06:12:35 -07:00 • committed by Gerrit - the friendly Code Review server
commit b2632f07d9

View file

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