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

Commit 05a53952 authored by Zhen Kong's avatar Zhen Kong
Browse files

qseecom: optimize qseecom_unregister_listener operation



Make change to search listener svc entry just once and then use
this svc entry pointer directly when unmapping dma buffer address.
This change can also avoid calling a might sleep function in
qseecom_vaddr_unmap() within irq disabled context.

Change-Id: Ie7c18ce37c60558ac20ab784710c11f8350723a3
Signed-off-by: default avatarZhen Kong <zkong@codeaurora.org>
parent b2bdf7dc
Loading
Loading
Loading
Loading
+14 −25
Original line number Diff line number Diff line
@@ -1365,11 +1365,16 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data,
static int qseecom_unregister_listener(struct qseecom_dev_handle *data)
{
	int ret = 0;
	unsigned long flags;
	struct qseecom_register_listener_ireq req;
	struct qseecom_registered_listener_list *ptr_svc = NULL;
	struct qseecom_command_scm_resp resp;

	ptr_svc = __qseecom_find_svc(data->listener.id);
	if (!ptr_svc) {
		pr_err("Unregiser invalid listener ID %d\n", data->listener.id);
		return -ENODATA;
	}

	req.qsee_cmd_id = QSEOS_DEREGISTER_LISTENER;
	req.listener_id = data->listener.id;
	resp.result = QSEOS_RESULT_INCOMPLETE;
@@ -1389,15 +1394,7 @@ static int qseecom_unregister_listener(struct qseecom_dev_handle *data)
	}

	data->abort = 1;
	spin_lock_irqsave(&qseecom.registered_listener_list_lock, flags);
	list_for_each_entry(ptr_svc, &qseecom.registered_listener_list_head,
			list) {
		if (ptr_svc->svc.listener_id == data->listener.id) {
	wake_up_all(&ptr_svc->rcv_req_wq);
			break;
		}
	}
	spin_unlock_irqrestore(&qseecom.registered_listener_list_lock, flags);

	while (atomic_read(&data->ioctl_count) > 1) {
		if (wait_event_freezable(data->abort_wq,
@@ -1408,21 +1405,13 @@ static int qseecom_unregister_listener(struct qseecom_dev_handle *data)
		}
	}

	spin_lock_irqsave(&qseecom.registered_listener_list_lock, flags);
	list_for_each_entry(ptr_svc,
			&qseecom.registered_listener_list_head, list) {
		if (ptr_svc->svc.listener_id == data->listener.id) {
			if (ptr_svc->sb_virt) {
	if (ptr_svc->sb_virt)
		qseecom_vaddr_unmap(ptr_svc->sb_virt,
					ptr_svc->sgt, ptr_svc->attach,
					ptr_svc->dmabuf);
			}
			ptr_svc->sgt, ptr_svc->attach, ptr_svc->dmabuf);

	list_del(&ptr_svc->list);
	kzfree(ptr_svc);
			break;
		}
	}
	spin_unlock_irqrestore(&qseecom.registered_listener_list_lock, flags);

	data->released = true;
	return ret;
}