From 09b18bfd9e7bee5e2a4e9173f546f95d7a4c7e52 Mon Sep 17 00:00:00 2001 From: Praveen Kurapati Date: Tue, 29 Sep 2020 21:49:36 +0530 Subject: [PATCH] msm:ipa4: Fix race condition Add change to fix race condition when freeing QMI handles during SSR scenario. Change-Id: Ie83f0386ea3bd9b40c4964327415421a144d4715 Signed-off-by: Praveen Kurapati --- drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index f379a4fbe0ba..e9d1c84f968b 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -474,6 +474,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, @@ -482,6 +483,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; @@ -1507,9 +1512,11 @@ 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 */ + mutex_lock(&ipa3_qmi_lock); qmi_handle_release(ipa_q6_clnt); vfree(ipa_q6_clnt); ipa_q6_clnt = NULL; + mutex_unlock(&ipa3_qmi_lock); return; } @@ -1849,6 +1856,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); @@ -1860,7 +1868,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;