summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Salido-Moreno <adrianm@codeaurora.org>2013-09-24 20:56:00 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:21:40 -0700
commitf17f3a014c33f750510eb1275fa72dd3f104c501 (patch)
tree5297d4e8496bfe72113c98ad37a8868b1d36906f
parentad310ea9b17d96dd98121f1ada7d9fb41523aa85 (diff)
msm: mdss: release all overlay resources on last fb release
There are cases where the last frame buffer reference is released from a different pid than the one who originally allocated the resource. In these cases we can still deallocate all resources currently allocated as we know that all references on fb dev have been released. Change-Id: Ice2ca8df765cb8c4537a89fec887cb125d820d7a Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c6
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c2
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 3504d9c8c770..bfe2f9bbbc15 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -1198,6 +1198,12 @@ static int mdss_fb_release(struct fb_info *info, int user)
if (!pinfo || (pinfo->pid != pid)) {
pr_warn("unable to find process info for fb%d pid=%d\n",
mfd->index, pid);
+ if (mfd->mdp.release_fnc) {
+ ret = mfd->mdp.release_fnc(mfd);
+ if (ret)
+ pr_err("error releasing fb%d resources\n",
+ mfd->index);
+ }
} else {
pr_debug("found process entry pid=%d ref=%d\n",
pinfo->pid, pinfo->ref_cnt);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 50bf4539b60d..1cd4e070db23 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -1053,7 +1053,7 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd)
mutex_lock(&mdp5_data->ov_lock);
mutex_lock(&mfd->lock);
list_for_each_entry(pipe, &mdp5_data->pipes_used, used_list) {
- if (pipe->pid == pid) {
+ if (!mfd->ref_cnt || (pipe->pid == pid)) {
unset_ndx |= pipe->ndx;
cnt++;
}