drm/etnaviv: fix get pages error path in etnaviv_gem_vaddr
authorLucas Stach <l.stach@pengutronix.de>
Mon, 25 Jan 2016 14:37:28 +0000 (15:37 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Tue, 26 Jan 2016 17:54:00 +0000 (18:54 +0100)
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
drivers/gpu/drm/etnaviv/etnaviv_gem.c

index fd7d3e989e79a5dca9696c79f71262de539f239d..09a759e69dd28e842b775c196a0b700440e2a1e9 100644 (file)
@@ -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 +
index 9f77c3b94cc696c4683d18da3e7848fb040874c6..b22712fdd31e7bd99317e047cdbfa8f3c60fbebd 100644 (file)
@@ -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));