From: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> etnaviv_gem_mmap_offset() returned zero if drm_gem_create_mmap_offset() failed. This is incorrect behaviour as etnaviv_ioctl_gem_info() does not detect this condition, so it returns success. Fix this by re-architecting etnaviv_gem_mmap_offset(). Merge mmap_offset() into this function, and change its prototype to accept a pointer to the "offset" return value, thereby allowing it to return a standard negative errno code. Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> --- drivers/staging/etnaviv/etnaviv_drv.c | 4 ++-- drivers/staging/etnaviv/etnaviv_drv.h | 2 +- drivers/staging/etnaviv/etnaviv_gem.c | 26 +++++++------------------- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/drivers/staging/etnaviv/etnaviv_drv.c b/drivers/staging/etnaviv/etnaviv_drv.c index 1071c449f3d4..9962318075c5 100644 --- a/drivers/staging/etnaviv/etnaviv_drv.c +++ b/drivers/staging/etnaviv/etnaviv_drv.c @@ -438,7 +438,7 @@ static int etnaviv_ioctl_gem_info(struct drm_device *dev, void *data, { struct drm_etnaviv_gem_info *args = data; struct drm_gem_object *obj; - int ret = 0; + int ret; if (args->pad) return -EINVAL; @@ -447,7 +447,7 @@ static int etnaviv_ioctl_gem_info(struct drm_device *dev, void *data, if (!obj) return -ENOENT; - args->offset = etnaviv_gem_mmap_offset(obj); + ret = etnaviv_gem_mmap_offset(obj, &args->offset); drm_gem_object_unreference_unlocked(obj); diff --git a/drivers/staging/etnaviv/etnaviv_drv.h b/drivers/staging/etnaviv/etnaviv_drv.h index 9abb7f8c2dc0..37992342bbf0 100644 --- a/drivers/staging/etnaviv/etnaviv_drv.h +++ b/drivers/staging/etnaviv/etnaviv_drv.h @@ -73,7 +73,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma); int etnaviv_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); -uint64_t etnaviv_gem_mmap_offset(struct drm_gem_object *obj); +int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, uint64_t *offset); int etnaviv_gem_get_iova_locked(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, uint32_t *iova); int etnaviv_gem_get_iova(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, diff --git a/drivers/staging/etnaviv/etnaviv_gem.c b/drivers/staging/etnaviv/etnaviv_gem.c index 522e5a6c3612..38dee80d996c 100644 --- a/drivers/staging/etnaviv/etnaviv_gem.c +++ b/drivers/staging/etnaviv/etnaviv_gem.c @@ -270,33 +270,21 @@ out: } /** get mmap offset */ -static uint64_t mmap_offset(struct drm_gem_object *obj) +int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, uint64_t *offset) { struct drm_device *dev = obj->dev; int ret; - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); - + mutex_lock(&dev->struct_mutex); /* Make it mmapable */ ret = drm_gem_create_mmap_offset(obj); - - if (ret) { + if (ret) dev_err(dev->dev, "could not allocate mmap offset\n"); - return 0; - } - - return drm_vma_node_offset_addr(&obj->vma_node); -} - -uint64_t etnaviv_gem_mmap_offset(struct drm_gem_object *obj) -{ - uint64_t offset; - - mutex_lock(&obj->dev->struct_mutex); - offset = mmap_offset(obj); - mutex_unlock(&obj->dev->struct_mutex); + else + *offset = drm_vma_node_offset_addr(&obj->vma_node); + mutex_unlock(&dev->struct_mutex); - return offset; + return ret; } /* should be called under struct_mutex.. although it can be called -- 2.5.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel