summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSree Sesha Aravind Vadrevu <svadrevu@codeaurora.org>2013-04-16 14:02:21 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:16:18 -0700
commite38e6af8db332d2d9733555d36cc0cfec6bd3825 (patch)
treec351405a1508d3377150d5cbcb189a956bd35db3
parented71ce6512d2d7a490c3e5eb36318241b3b67765 (diff)
msm: mdss: Avoid potential deadlock scenarios
Ensuring that deadlocks are prevented by clearing locks in all paths of execution. Change-Id: Ia79f9449c4b040366fa4ed21776c9442bd6fdda3 Signed-off-by: Sree Sesha Aravind Vadrevu <svadrevu@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c15
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_pipe.c10
2 files changed, 15 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 7d25287262e0..48bab7fb2eb3 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -842,12 +842,13 @@ static int mdss_mdp_overlay_unset(struct msm_fb_data_type *mfd, int ndx)
if (ndx == BORDERFILL_NDX) {
pr_debug("borderfill disable\n");
mdp5_data->borderfill_enable = false;
- return 0;
+ ret = 0;
+ goto done;
}
if (!mfd->panel_power_on) {
- mutex_unlock(&mdp5_data->ov_lock);
- return -EPERM;
+ ret = -EPERM;
+ goto done;
}
pr_debug("unset ndx=%x\n", ndx);
@@ -857,6 +858,7 @@ static int mdss_mdp_overlay_unset(struct msm_fb_data_type *mfd, int ndx)
else
ret = mdss_mdp_overlay_release(mfd, ndx);
+done:
mutex_unlock(&mdp5_data->ov_lock);
return ret;
@@ -998,14 +1000,14 @@ static int mdss_mdp_overlay_play(struct msm_fb_data_type *mfd,
return ret;
if (!mfd->panel_power_on) {
- mutex_unlock(&mdp5_data->ov_lock);
- return -EPERM;
+ ret = -EPERM;
+ goto done;
}
ret = mdss_mdp_overlay_start(mfd);
if (ret) {
pr_err("unable to start overlay %d (%d)\n", mfd->index, ret);
- return ret;
+ goto done;
}
if (req->id & MDSS_MDP_ROT_SESSION_MASK) {
@@ -1018,6 +1020,7 @@ static int mdss_mdp_overlay_play(struct msm_fb_data_type *mfd,
ret = mdss_mdp_overlay_queue(mfd, req);
}
+done:
mutex_unlock(&mdp5_data->ov_lock);
return ret;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_pipe.c b/drivers/video/fbdev/msm/mdss_mdp_pipe.c
index 302acc7c950e..0f6553049b6a 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_pipe.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_pipe.c
@@ -331,14 +331,16 @@ struct mdss_mdp_pipe *mdss_mdp_pipe_get(struct mdss_data_type *mdata, u32 ndx)
mutex_lock(&mdss_mdp_sspp_lock);
pipe = mdss_mdp_pipe_search(mdata, ndx);
- if (!pipe)
- return ERR_PTR(-EINVAL);
+ if (!pipe) {
+ pipe = ERR_PTR(-EINVAL);
+ goto error;
+ }
if (mdss_mdp_pipe_map(pipe))
- return ERR_PTR(-EACCES);
+ pipe = ERR_PTR(-EACCES);
+error:
mutex_unlock(&mdss_mdp_sspp_lock);
-
return pipe;
}