aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2016-01-25 09:37:28 -0500
committerLucas Stach <l.stach@pengutronix.de>2016-01-26 12:54:00 -0500
commit9f07bb0d4ada68f05b2e51c10720d4688e6adea4 (patch)
tree85cccf618bffa4a1680902ee0b004714d7591f81
parent45d16a6d94580cd3c6baed69b5fe441ece599fc4 (diff)
drm/etnaviv: fix get pages error path in etnaviv_gem_vaddr
In case that etnaviv_gem_get_pages is unable to get the required pages the object mutex needs to be unlocked. Also return NULL in this case instead of propagating the error, as callers of this function might not be prepared to handle a pointer error, but expect this call to follow the semantics of a plain vmap to return NULL in case of an error. Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_dump.c2
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c6
2 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_dump.c b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
index fd7d3e989e79..09a759e69dd2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_dump.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_dump.c
@@ -216,7 +216,7 @@ void etnaviv_core_dump(struct etnaviv_gpu *gpu)
216 iter.hdr->iova = cpu_to_le64(vram->iova); 216 iter.hdr->iova = cpu_to_le64(vram->iova);
217 217
218 vaddr = etnaviv_gem_vaddr(&obj->base); 218 vaddr = etnaviv_gem_vaddr(&obj->base);
219 if (vaddr && !IS_ERR(vaddr)) 219 if (vaddr)
220 memcpy(iter.data, vaddr, obj->base.size); 220 memcpy(iter.data, vaddr, obj->base.size);
221 221
222 etnaviv_core_dump_header(&iter, ETDUMP_BUF_BO, iter.data + 222 etnaviv_core_dump_header(&iter, ETDUMP_BUF_BO, iter.data +
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index 9f77c3b94cc6..b22712fdd31e 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -361,8 +361,10 @@ void *etnaviv_gem_vaddr(struct drm_gem_object *obj)
361 if (!etnaviv_obj->vaddr) { 361 if (!etnaviv_obj->vaddr) {
362 struct page **pages = etnaviv_gem_get_pages(etnaviv_obj); 362 struct page **pages = etnaviv_gem_get_pages(etnaviv_obj);
363 363
364 if (IS_ERR(pages)) 364 if (IS_ERR(pages)) {
365 return ERR_CAST(pages); 365 mutex_unlock(&etnaviv_obj->lock);
366 return NULL;
367 }
366 368
367 etnaviv_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, 369 etnaviv_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
368 VM_MAP, pgprot_writecombine(PAGE_KERNEL)); 370 VM_MAP, pgprot_writecombine(PAGE_KERNEL));