drm: share address space for dma bufs
authorGerd Hoffmann <kraxel@redhat.com>
Wed, 27 Nov 2019 09:25:23 +0000 (10:25 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Fri, 6 Dec 2019 10:18:11 +0000 (11:18 +0100)
Use the shared address space of the drm device (see drm_open() in
drm_file.c) for dma-bufs too.  That removes a difference betweem drm
device mmap vmas and dma-buf mmap vmas and fixes corner cases like
dropping ptes (using madvise(DONTNEED) for example) not working
properly.

Also remove amdgpu driver's private dmabuf update.  It is not needed
any more now that we are doing this for everybody.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20191127092523.5620-3-kraxel@redhat.com
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
drivers/gpu/drm/drm_prime.c

index d5bcdfefbad645b1c9af49a8e67df71f77067b85..586db4fb46bd902900fc187db5c9b5cfe0e066cb 100644 (file)
@@ -361,10 +361,8 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj,
                return ERR_PTR(-EPERM);
 
        buf = drm_gem_prime_export(gobj, flags);
-       if (!IS_ERR(buf)) {
-               buf->file->f_mapping = gobj->dev->anon_inode->i_mapping;
+       if (!IS_ERR(buf))
                buf->ops = &amdgpu_dmabuf_ops;
-       }
 
        return buf;
 }
index a0f929c7117bb69e1cc8407f10fe247d17fa43b8..86d9b0e45c8c6325e391be65da146b63357c78fe 100644 (file)
@@ -240,6 +240,7 @@ void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
 struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
                                      struct dma_buf_export_info *exp_info)
 {
+       struct drm_gem_object *obj = exp_info->priv;
        struct dma_buf *dma_buf;
 
        dma_buf = dma_buf_export(exp_info);
@@ -247,7 +248,8 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
                return dma_buf;
 
        drm_dev_get(dev);
-       drm_gem_object_get(exp_info->priv);
+       drm_gem_object_get(obj);
+       dma_buf->file->f_mapping = obj->dev->anon_inode->i_mapping;
 
        return dma_buf;
 }