msm: ipa: gsb: Protect mutual exclusive memory
Resumed iface counter a global variable, common
between different iface handle is not protected.
Protect it with mutex lock.
Change-Id: I17a0970c0d8cdfce0f80792063b27c349f0b4cbb
Signed-off-by: Mohammed <mjavid@codeaurora.org>
diff --git a/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c b/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c
index 6bb9f8b..f3dfd9b 100644
--- a/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c
+++ b/drivers/platform/msm/ipa/ipa_clients/ipa_gsb.c
@@ -852,16 +852,19 @@
return 0;
}
+ mutex_lock(&ipa_gsb_ctx->lock);
if (ipa_gsb_ctx->num_connected_iface == 0) {
ret = ipa_pm_activate_sync(ipa_gsb_ctx->pm_hdl);
if (ret) {
IPA_GSB_ERR("failed to activate ipa pm\n");
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
ret = ipa_gsb_connect_sys_pipe();
if (ret) {
IPA_GSB_ERR("fail to connect pipe\n");
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
@@ -877,7 +880,7 @@
ipa_gsb_ctx->num_resumed_iface++;
IPA_GSB_DBG("num resumed iface: %d\n",
ipa_gsb_ctx->num_resumed_iface);
-
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return 0;
}
@@ -938,6 +941,7 @@
goto fail;
}
+ mutex_lock(&ipa_gsb_ctx->lock);
if (ipa_gsb_ctx->num_connected_iface == 1) {
ret = ipa_gsb_disconnect_sys_pipe();
if (ret) {
@@ -968,6 +972,7 @@
}
fail:
+ mutex_unlock(&ipa_gsb_ctx->lock);
atomic_set(&ipa_gsb_ctx->disconnect_in_progress, 0);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
@@ -1009,10 +1014,12 @@
return 0;
}
+ mutex_lock(&ipa_gsb_ctx->lock);
if (ipa_gsb_ctx->num_resumed_iface == 0) {
ret = ipa_pm_activate_sync(ipa_gsb_ctx->pm_hdl);
if (ret) {
IPA_GSB_ERR("fail to activate ipa pm\n");
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
@@ -1023,6 +1030,7 @@
IPA_GSB_ERR(
"fail to start con ep %d\n",
ret);
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
@@ -1033,6 +1041,7 @@
IPA_GSB_DBG_LOW("num resumed iface: %d\n",
ipa_gsb_ctx->num_resumed_iface);
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return 0;
}
@@ -1073,6 +1082,7 @@
return 0;
}
+ mutex_lock(&ipa_gsb_ctx->lock);
if (ipa_gsb_ctx->num_resumed_iface == 1) {
ret = ipa_stop_gsi_channel(
ipa_gsb_ctx->cons_hdl);
@@ -1080,6 +1090,7 @@
IPA_GSB_ERR(
"fail to stop cons ep %d\n",
ret);
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
@@ -1088,6 +1099,7 @@
if (ret) {
IPA_GSB_ERR("fail to deactivate ipa pm\n");
ipa_start_gsi_channel(ipa_gsb_ctx->cons_hdl);
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return ret;
}
@@ -1098,6 +1110,7 @@
IPA_GSB_DBG_LOW("num resumed iface: %d\n",
ipa_gsb_ctx->num_resumed_iface);
+ mutex_unlock(&ipa_gsb_ctx->lock);
mutex_unlock(&ipa_gsb_ctx->iface_lock[hdl]);
return 0;
}