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

Commit e36650a9 authored by Avaneesh Kumar Dwivedi's avatar Avaneesh Kumar Dwivedi Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: service-notifier: use worker thread to send SSR notification



In some rare scenarios, observed dead lock due to clients blocked on
SSR notification. To avoid dead lock, use worker thread to send SSR
notification in case of SSR event.

Change-Id: I832fabce7569b1b8b966b7c49cda1b00cff2c472
Signed-off-by: default avatarAvaneesh Kumar Dwivedi <akdwived@codeaurora.org>
parent 377d32fa
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;