From c99a759add6cd401801f9382037ce24669c951f6 Mon Sep 17 00:00:00 2001 From: Anmolpreet Kaur Date: Sat, 29 Feb 2020 11:03:27 +0530 Subject: [PATCH] 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 --- drivers/misc/qseecom.c | 51 +++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 9be68883664f..76d1526bb6ee 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -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;