[PATCH] drm/prime: Fix mmap fake offset for drm_gem_object_funcs.mmap

Gerd Hoffmann kraxel at redhat.com
Thu Oct 24 09:02:40 UTC 2019


On Wed, Oct 23, 2019 at 05:22:26PM -0500, Rob Herring wrote:
> Commit c40069cb7bd6 ("drm: add mmap() to drm_gem_object_funcs")
> introduced a GEM object mmap() hook which is expected to subtract the
> fake offset from vm_pgoff.

Long-term it is probably a good idea to just remove the fake offset
handling from drivers.  But that'll only work once all drivers switched
away from custom fops->mmap handlers so we can handle the offset -> obj
lookup in the drm core for everybody.

So let's go this way for now.

Acked-by: Gerd Hoffmann <kraxel at redhat.com>

> However, for mmap() on dmabufs, there is not
> a fake offset. To fix this, we need to add the fake offset just like the
> driver->fops->mmap() code path.
> 
> Fixes: c40069cb7bd6 ("drm: add mmap() to drm_gem_object_funcs")
> Cc: Gerd Hoffmann <kraxel at redhat.com>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Signed-off-by: Rob Herring <robh at kernel.org>
> ---
> I ran into this while working on converting vgem to shmem helpers and
> the IGT vgem_basic dmabuf-mmap test failed. This fixes shmem, but I
> have checked any other users of the new mmap hook.
> Rob
> 
>  drivers/gpu/drm/drm_prime.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 0814211b0f3f..5d06690a2e9d 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -713,6 +713,8 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
>  	struct file *fil;
>  	int ret;
>  
> +	vma->vm_pgoff += drm_vma_node_start(&obj->vma_node);
> +
>  	if (obj->funcs && obj->funcs->mmap) {
>  		ret = obj->funcs->mmap(obj, vma);
>  		if (ret)
> @@ -737,8 +739,6 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
>  	if (ret)
>  		goto out;
>  
> -	vma->vm_pgoff += drm_vma_node_start(&obj->vma_node);
> -
>  	ret = obj->dev->driver->fops->mmap(fil, vma);
>  
>  	drm_vma_node_revoke(&obj->vma_node, priv);
> -- 
> 2.20.1
> 



More information about the dri-devel mailing list