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

Commit fb7aadf1 authored by Avaneesh Kumar Dwivedi's avatar Avaneesh Kumar Dwivedi
Browse files

soc: qcom: Free qmi handle in a worker thread



This change on arrival of ssr event schdule a worker thread,
which when run carry out task of qmi handle destruction.
It is a desired change to make ssr notification callback as
light as possible and avoid blocking it for long in corner cases.

Change-Id: I832fabce7569b1b8b966b7c49cda1b00cff2c472
Signed-off-by: default avatarAvaneesh Kumar Dwivedi <akdwived@codeaurora.org>
parent 783427f7
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ struct ind_req_resp {
 */
struct qmi_client_info {
	int instance_id;
	int subsys_state;
	struct work_struct svc_arrive;
	struct work_struct svc_exit;
	struct work_struct svc_rcv_msg;
@@ -436,7 +437,7 @@ static void root_service_exit_work(struct work_struct *work)
{
	struct qmi_client_info *data = container_of(work,
					struct qmi_client_info, svc_exit);
	root_service_service_exit(data, ROOT_PD_DOWN);
	root_service_service_exit(data, data->subsys_state);
}

static int service_event_notify(struct notifier_block *this,
@@ -453,6 +454,7 @@ static int service_event_notify(struct notifier_block *this,
		break;
	case QMI_SERVER_EXIT:
		pr_debug("Root PD service DOWN\n");
		data->subsys_state = ROOT_PD_DOWN;
		queue_work(data->svc_event_wq, &data->svc_exit);
		break;
	default:
@@ -468,7 +470,6 @@ static int ssr_event_notify(struct notifier_block *this,
	struct qmi_client_info *info = container_of(this,
					struct qmi_client_info, ssr_notifier);
	struct notif_data *notif = data;
	enum pd_subsys_state state;

	switch (code) {
	case	SUBSYS_BEFORE_SHUTDOWN:
@@ -476,16 +477,16 @@ static int ssr_event_notify(struct notifier_block *this,
						notif->crashed);
		switch (notif->crashed) {
		case CRASH_STATUS_ERR_FATAL:
			state = ROOT_PD_ERR_FATAL;
			info->subsys_state = ROOT_PD_ERR_FATAL;
			break;
		case CRASH_STATUS_WDOG_BITE:
			state = ROOT_PD_WDOG_BITE;
			info->subsys_state = ROOT_PD_WDOG_BITE;
			break;
		default:
			state = ROOT_PD_SHUTDOWN;
			info->subsys_state = ROOT_PD_SHUTDOWN;
			break;
		}
		root_service_service_exit(info, state);
		queue_work(info->svc_event_wq, &info->svc_exit);
		break;
	default:
		break;