diff options
| author | Skylar Chang <chiaweic@codeaurora.org> | 2017-08-17 12:53:23 -0700 |
|---|---|---|
| committer | Skylar Chang <chiaweic@codeaurora.org> | 2017-08-25 11:05:10 -0700 |
| commit | 4387acb96bda683303d85d47d93e8418ed719364 (patch) | |
| tree | 9b65856e3203ec9d1745ba43ceabfbd3f8797d02 | |
| parent | 812c879d357451e6164ec1de020660f659abd71f (diff) | |
msm: ipa: protect q6_proxy_clk_vote
Add a mutex to protect q6_proxy_clk_vote.
The proxy vote/unvote may be called from different contexts
which can result in a a race condition.
Change-Id: I402090be5ff35897ed61499a13bf52eb60a1f5cf
CRs-Fixed: 2094724
Acked-by: Ady Abraham <adya@qti.qualcomm.com>
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
| -rw-r--r-- | drivers/platform/msm/ipa/ipa_v3/ipa.c | 1 | ||||
| -rw-r--r-- | drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 1 | ||||
| -rw-r--r-- | drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 14 |
3 files changed, 14 insertions, 2 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 3a54c97f5320..2615db4e9755 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -4621,6 +4621,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, mutex_init(&ipa3_ctx->lock); mutex_init(&ipa3_ctx->nat_mem.lock); + mutex_init(&ipa3_ctx->q6_proxy_clk_vote_mutex); idr_init(&ipa3_ctx->ipa_idr); spin_lock_init(&ipa3_ctx->idr_lock); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 4278dc45aad2..f12eb6ded556 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1231,6 +1231,7 @@ struct ipa3_context { u32 enable_clock_scaling; u32 curr_ipa_clk_rate; bool q6_proxy_clk_vote_valid; + struct mutex q6_proxy_clk_vote_mutex; u32 ipa_num_pipes; struct ipa3_wlan_comm_memb wc_memb; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 545c2b599a6f..4979f62b928f 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -2983,10 +2983,15 @@ bool ipa3_is_client_handle_valid(u32 clnt_hdl) */ void ipa3_proxy_clk_unvote(void) { - if (ipa3_is_ready() && ipa3_ctx->q6_proxy_clk_vote_valid) { + if (!ipa3_is_ready()) + return; + + mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex); + if (ipa3_ctx->q6_proxy_clk_vote_valid) { IPA_ACTIVE_CLIENTS_DEC_SPECIAL("PROXY_CLK_VOTE"); ipa3_ctx->q6_proxy_clk_vote_valid = false; } + mutex_unlock(&ipa3_ctx->q6_proxy_clk_vote_mutex); } /** @@ -2996,10 +3001,15 @@ void ipa3_proxy_clk_unvote(void) */ void ipa3_proxy_clk_vote(void) { - if (ipa3_is_ready() && !ipa3_ctx->q6_proxy_clk_vote_valid) { + if (!ipa3_is_ready()) + return; + + mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex); + if (!ipa3_ctx->q6_proxy_clk_vote_valid) { IPA_ACTIVE_CLIENTS_INC_SPECIAL("PROXY_CLK_VOTE"); ipa3_ctx->q6_proxy_clk_vote_valid = true; } + mutex_unlock(&ipa3_ctx->q6_proxy_clk_vote_mutex); } /** |
