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

Commit 6bf9c6cb authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: Proper handling of unmapping dmabuf"

parents 136c3ae0 270e738a
Loading
Loading
Loading
Loading
+42 −11
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
/*
 * QTI Secure Execution Environment Communicator (QSEECOM) driver
 *
 * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
 */

#define pr_fmt(fmt) "QSEECOM: %s: " fmt, __func__
@@ -191,6 +191,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;
@@ -1422,6 +1429,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;
}
@@ -1496,9 +1504,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;
}

@@ -1624,9 +1634,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);
@@ -2028,9 +2040,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;
}

@@ -2972,8 +2987,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)

loadapp_err:
	__qseecom_disable_clk_scale_down(data);
	if (dmabuf)
	if (dmabuf) {
		qseecom_vaddr_unmap(vaddr, sgt, attach, dmabuf);
		MAKE_NULL(sgt, attach, dmabuf);
	}
enable_clk_err:
	if (qseecom.support_bus_scaling) {
		mutex_lock(&qsee_bw_mutex);
@@ -3117,9 +3134,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;
}
@@ -4052,8 +4072,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;
}

@@ -4291,8 +4313,10 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
				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;
}

@@ -5852,8 +5876,10 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data,
	}

exit_cpu_restore:
	if (dmabuf)
	if (dmabuf) {
		qseecom_vaddr_unmap(va, sgt, attach, dmabuf);
		MAKE_NULL(sgt, attach, dmabuf);
	}
	return ret;
}

@@ -7104,8 +7130,10 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req,
	}
	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;
}

@@ -8300,10 +8328,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;