diff options
| author | Adrian Salido-Moreno <adrianm@codeaurora.org> | 2013-09-24 20:56:00 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:21:40 -0700 |
| commit | f17f3a014c33f750510eb1275fa72dd3f104c501 (patch) | |
| tree | 5297d4e8496bfe72113c98ad37a8868b1d36906f | |
| parent | ad310ea9b17d96dd98121f1ada7d9fb41523aa85 (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.c | 6 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 2 |
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++; } |
