From e7e5bbf7cd4e599c0ca63a6bb1019058a9d60c4a Mon Sep 17 00:00:00 2001 From: Ujwal Patel Date: Tue, 28 Jul 2015 16:59:33 -0700 Subject: 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 --- drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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); -- cgit v1.2.3