diff options
| author | Ujwal Patel <ujwalp@codeaurora.org> | 2015-07-28 16:59:33 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:44:43 -0700 |
| commit | e7e5bbf7cd4e599c0ca63a6bb1019058a9d60c4a (patch) | |
| tree | d819bfc3f95e9972b076f2deb488ad3e16ce7b85 | |
| parent | cc113de0a1edd7e56e40d360723435138b083a89 (diff) | |
msm: mdss: prevent slow path error during DSI underflow recovery
When DSI underflow is reported, ctl reset is preformed which requires
certain critical regions to be protected by mutex. However this reset
itself doesn't need to be protected by koff_lock spinlock and thus move
it out of spinlock to prevent mutex locking while holding spinlocks.
Change-Id: I9a5da66c3db5c3839fa45a25898a5d610134594e
Signed-off-by: Ujwal Patel <ujwalp@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index 1663e060d569..62832f4c2c66 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -822,6 +822,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) { struct mdss_mdp_cmd_ctx *ctx = data; unsigned long flags; + bool reset_done = false; if (!data) { pr_err("%s: invalid ctx\n", __func__); @@ -842,9 +843,13 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) return; } - spin_lock_irqsave(&ctx->koff_lock, flags); if (atomic_read(&ctx->koff_cnt)) { mdss_mdp_ctl_reset(ctx->ctl); + reset_done = true; + } + + spin_lock_irqsave(&ctx->koff_lock, flags); + if (reset_done && atomic_read(&ctx->koff_cnt)) { pr_debug("%s: intf_num=%d\n", __func__, ctx->ctl->intf_num); atomic_dec(&ctx->koff_cnt); |
