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

Commit fe677506 authored by Praveen Kurapati's avatar Praveen Kurapati Committed by Gerrit - the friendly Code Review server
Browse files

msm:ipa4: Fix race condition



Add change to fix race condition when freeing QMI
handles during SSR scenario.

Change-Id: Ie83f0386ea3bd9b40c4964327415421a144d4715
Signed-off-by: default avatarPraveen Kurapati <pkurapat@codeaurora.org>
parent 2ddb7d0a
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -475,6 +475,7 @@ static int ipa3_qmi_send_req_wait(struct qmi_handle *client_handle,
		return ret;
	}

	mutex_lock(&ipa3_qmi_lock);
	ret = qmi_send_request(client_handle,
		&ipa3_qmi_ctx->server_sq,
		&txn,
@@ -483,6 +484,10 @@ static int ipa3_qmi_send_req_wait(struct qmi_handle *client_handle,
		req_desc->ei_array,
		req);

	if (unlikely(!ipa_q6_clnt))
		return -EINVAL;
	mutex_unlock(&ipa3_qmi_lock);

	if (ret < 0) {
		qmi_txn_cancel(&txn);
		return ret;
@@ -1580,11 +1585,16 @@ static void ipa3_q6_clnt_svc_arrive(struct work_struct *work)
		IPAWANERR(
		"ipa3_qmi_init_modem_send_sync_msg failed due to SSR!\n");
		/* Cleanup when ipa3_wwan_remove is called */
		if (ipa_q6_clnt != NULL) {
			qmi_handle_release(ipa_q6_clnt);
			mutex_lock(&ipa3_qmi_lock);
			vfree(ipa_q6_clnt);
			ipa_q6_clnt = NULL;
			mutex_unlock(&ipa3_qmi_lock);
			return;
		}
		IPAWANERR("Exit from service arrive fun\n");
	}

	if (rc != 0) {
		IPAWANERR("ipa3_qmi_init_modem_send_sync_msg failed\n");
@@ -1929,6 +1939,7 @@ void ipa3_qmi_service_exit(void)
	/* qmi-client */

	/* Release client handle */
	mutex_lock(&ipa3_qmi_lock);
	if (ipa_q6_clnt != NULL) {
		qmi_handle_release(ipa_q6_clnt);
		vfree(ipa_q6_clnt);
@@ -1940,7 +1951,6 @@ void ipa3_qmi_service_exit(void)
	}

	/* clean the QMI msg cache */
	mutex_lock(&ipa3_qmi_lock);
	if (ipa3_qmi_ctx != NULL) {
		vfree(ipa3_qmi_ctx);
		ipa3_qmi_ctx = NULL;
@@ -2262,6 +2272,8 @@ int ipa3_qmi_enable_per_client_stats(

	IPAWANDBG("Sending QMI_IPA_ENABLE_PER_CLIENT_STATS_REQ_V01\n");

	if (unlikely(!ipa_q6_clnt))
		return -ETIMEDOUT;
	rc = ipa3_qmi_send_req_wait(ipa_q6_clnt,
		&req_desc, req,
		&resp_desc, resp,
@@ -2299,6 +2311,8 @@ int ipa3_qmi_get_per_client_packet_stats(

	IPAWANDBG("Sending QMI_IPA_GET_STATS_PER_CLIENT_REQ_V01\n");

	if (unlikely(!ipa_q6_clnt))
		return -ETIMEDOUT;
	rc = ipa3_qmi_send_req_wait(ipa_q6_clnt,
		&req_desc, req,
		&resp_desc, resp,
@@ -2356,6 +2370,8 @@ int ipa3_qmi_send_mhi_cleanup_request(struct ipa_mhi_cleanup_req_msg_v01 *req)
	resp_desc.msg_id = QMI_IPA_MHI_CLEANUP_RESP_V01;
	resp_desc.ei_array = ipa_mhi_cleanup_resp_msg_v01_ei;

	if (unlikely(!ipa_q6_clnt))
		return -ETIMEDOUT;
	rc = ipa3_qmi_send_req_wait(ipa_q6_clnt,
		&req_desc, req,
		&resp_desc, &resp,