diff mbox

[1/2] drm/etnaviv: fix get pages error path in etnaviv_gem_vaddr

Message ID 1453823126-3899-1-git-send-email-l.stach@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Lucas Stach Jan. 26, 2016, 3:45 p.m. UTC
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>
---
 drivers/gpu/drm/etnaviv/etnaviv_dump.c | 2 +-
 drivers/gpu/drm/etnaviv/etnaviv_gem.c  | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

Comments

Russell King - ARM Linux Jan. 26, 2016, 4:45 p.m. UTC | #1
On Tue, Jan 26, 2016 at 04:45:25PM +0100, Lucas Stach wrote:
> 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.

If we're giving it vmap() semantics, then let's add another patch
which calls this function etnaviv_gem_vmap()...
diff mbox

Patch

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)
 		iter.hdr->iova = cpu_to_le64(vram->iova);
 
 		vaddr = etnaviv_gem_vaddr(&obj->base);
-		if (vaddr && !IS_ERR(vaddr))
+		if (vaddr)
 			memcpy(iter.data, vaddr, obj->base.size);
 
 		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)
 	if (!etnaviv_obj->vaddr) {
 		struct page **pages = etnaviv_gem_get_pages(etnaviv_obj);
 
-		if (IS_ERR(pages))
-			return ERR_CAST(pages);
+		if (IS_ERR(pages)) {
+			mutex_unlock(&etnaviv_obj->lock);
+			return NULL;
+		}
 
 		etnaviv_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
 				VM_MAP, pgprot_writecombine(PAGE_KERNEL));