summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAdrian Salido-Moreno <adrianm@codeaurora.org>2013-01-28 17:02:44 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:14:47 -0700
commit5a5eadca6b554ace95b5f3fc47d5fa6ea35fbf54 (patch)
tree0190cf7df776b4585d80cecf15a147ed910f6551 /drivers
parent39e377118c086756e1c5cfdf1c890fcf43d796f4 (diff)
msm: mdss: handle memory mapping failures
Properly handle errors seen while mapping ion buffers, free memory only for planes which were succesfully mapped to avoid issues. CRs-Fixed: 444379 Change-Id: I70fc2402d2088f7766f4d958dbdc2bddbb53abcd Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 6c4a08f7f97b..5e9659f6297a 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -415,25 +415,28 @@ static inline int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd,
int num_planes,
u32 flags)
{
- int i;
+ int i, rc = 0;
+
+ if ((num_planes <= 0) || (num_planes > MAX_PLANES))
+ return -EINVAL;
memset(data, 0, sizeof(*data));
for (i = 0; i < num_planes; i++) {
data->p[i].flags = flags;
- mdss_mdp_get_img(&planes[i], &data->p[i]);
- if (data->p[0].len == 0)
+ rc = mdss_mdp_get_img(&planes[i], &data->p[i]);
+ if (rc) {
+ pr_err("failed to map buf p=%d flags=%x\n", i, flags);
+ while (i > 0) {
+ i--;
+ mdss_mdp_put_img(&data->p[i]);
+ }
break;
+ }
}
- if (i != num_planes) {
- for (; i >= 0; i--)
- mdss_mdp_put_img(&data->p[i]);
- return -ENOMEM;
- }
-
- data->num_planes = num_planes;
+ data->num_planes = i;
- return 0;
+ return rc;
}
static inline int mdss_mdp_overlay_free_buf(struct mdss_mdp_data *data)