summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index ba31fd39e917..85c347251aa1 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -1206,6 +1206,8 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
struct mdss_fb_proc_info *pinfo = NULL, *temp_pinfo = NULL;
int ret = 0;
int pid = current->tgid;
+ bool unknown_pid = true;
+ struct task_struct *task;
if (!mfd->ref_cnt) {
pr_info("try to close unopened fb %d!\n", mfd->index);
@@ -1220,6 +1222,7 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
if (!release_all && (pinfo->pid != pid))
continue;
+ unknown_pid = false;
pr_debug("found process entry pid=%d ref=%d\n", pinfo->pid,
pinfo->ref_cnt);
@@ -1245,6 +1248,20 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all)
}
}
+ if (unknown_pid) {
+ task = current->group_leader;
+ pr_debug("unknown process %s pid=%d mfd->ref_cnt=%d\n",
+ task->comm, pid, mfd->ref_cnt);
+
+ mfd->ref_cnt--;
+ if (mfd->mdp.release_fnc) {
+ ret = mfd->mdp.release_fnc(mfd);
+ if (ret)
+ pr_err("error releasing fb%d pid=%d\n",
+ mfd->index, pinfo->pid);
+ }
+ }
+
if (!mfd->ref_cnt) {
ret = mdss_fb_blank_sub(FB_BLANK_POWERDOWN, info,
mfd->op_enable);