]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
drm/ttm: Quick-test mmap offset in ttm_bo_mmap()
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 7 Feb 2019 08:59:30 +0000 (09:59 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Mar 2019 20:03:53 +0000 (15:03 -0500)
A BO's address has to be at least the minimum offset. Sharing this
test in ttm_bo_mmap() removes code from drivers. A full buffer-address
validation is still done within drm_vma_offset_lockup_locked().

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Christian König <christian.koenig@amd.com>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
12 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/ast/ast_ttm.c
drivers/gpu/drm/bochs/bochs_mm.c
drivers/gpu/drm/cirrus/cirrus_ttm.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
drivers/gpu/drm/mgag200/mgag200_ttm.c
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/qxl/qxl_ttm.c
drivers/gpu/drm/radeon/radeon_ttm.c
drivers/gpu/drm/ttm/ttm_bo_vm.c
drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
drivers/staging/vboxvideo/vbox_ttm.c

index d5140d0085d4d38584830fd6b0ac7800d7980ddf..cd0ccfbbcb84612cb3d4f208c943b790d57c98dd 100644 (file)
@@ -1823,14 +1823,9 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
 
 int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct amdgpu_device *adev;
-
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
+       struct drm_file *file_priv = filp->private_data;
+       struct amdgpu_device *adev = file_priv->minor->dev->dev_private;
 
-       file_priv = filp->private_data;
-       adev = file_priv->minor->dev->dev_private;
        if (adev == NULL)
                return -EINVAL;
 
index c410804a5e2c988509922074cbd98e5522403116..75d477b37854df5a400daaf1d084f6c362083de6 100644 (file)
@@ -343,13 +343,8 @@ int ast_bo_push_sysram(struct ast_bo *bo)
 
 int ast_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct ast_private *ast;
+       struct drm_file *file_priv = filp->private_data;
+       struct ast_private *ast = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       ast = file_priv->minor->dev->dev_private;
        return ttm_bo_mmap(filp, vma, &ast->ttm.bdev);
 }
index ebc9dbd94923d46dc432fb605ff22a0eb5eb833c..4a40308169c46d98ca43ff450ed486e148c046b9 100644 (file)
@@ -263,14 +263,9 @@ int bochs_bo_unpin(struct bochs_bo *bo)
 
 int bochs_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct bochs_device *bochs;
+       struct drm_file *file_priv = filp->private_data;
+       struct bochs_device *bochs = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       bochs = file_priv->minor->dev->dev_private;
        return ttm_bo_mmap(filp, vma, &bochs->ttm.bdev);
 }
 
index 223a75ba77a8302eee7a276d989ae458b4eaddb4..e6b98467a42896f237cd1d2eddded69cf198a9e0 100644 (file)
@@ -330,13 +330,8 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
 
 int cirrus_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct cirrus_device *cirrus;
+       struct drm_file *file_priv = filp->private_data;
+       struct cirrus_device *cirrus = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       cirrus = file_priv->minor->dev->dev_private;
        return ttm_bo_mmap(filp, vma, &cirrus->ttm.bdev);
 }
index 8454889228653bbf35e32d4c29c10669c743c061..6093c421daff878c547b8e49fae5372658d691c6 100644 (file)
@@ -319,14 +319,9 @@ int hibmc_bo_unpin(struct hibmc_bo *bo)
 
 int hibmc_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct hibmc_drm_private *hibmc;
+       struct drm_file *file_priv = filp->private_data;
+       struct hibmc_drm_private *hibmc = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       hibmc = file_priv->minor->dev->dev_private;
        return ttm_bo_mmap(filp, vma, &hibmc->bdev);
 }
 
index ce739da5161d88c1d24c7a7b80d35da6385e0893..bd42365a8aa85535aa3d2faf96940ffb4cda9918 100644 (file)
@@ -344,13 +344,8 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
 
 int mgag200_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct mga_device *mdev;
+       struct drm_file *file_priv = filp->private_data;
+       struct mga_device *mdev = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       mdev = file_priv->minor->dev->dev_private;
        return ttm_bo_mmap(filp, vma, &mdev->ttm.bdev);
 }
index c66467232604f261f6ca546357d900460d0cbf7b..f0daf958e03a2c810664874f7028205c2af73e94 100644 (file)
@@ -168,9 +168,6 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
        struct drm_file *file_priv = filp->private_data;
        struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev);
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return drm_legacy_mmap(filp, vma);
-
        return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
 }
 
index 6b3b92d1f17ffdc5fb7acad91c55e65714d290fb..0234f8556adafa92dc5aa7f5294d918bdb9a714a 100644 (file)
@@ -63,15 +63,10 @@ static vm_fault_t qxl_ttm_fault(struct vm_fault *vmf)
 
 int qxl_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct qxl_device *qdev;
        int r;
+       struct drm_file *file_priv = filp->private_data;
+       struct qxl_device *qdev = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       qdev = file_priv->minor->dev->dev_private;
        if (qdev == NULL) {
                DRM_ERROR(
                 "filp->private_data->minor->dev->dev_private == NULL\n");
index 7c10e1560780ca037abc832c607d526bf287a8ac..557bdd7a2fc88d967632993eeb586f90407711d2 100644 (file)
@@ -898,16 +898,10 @@ static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf)
 
 int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct radeon_device *rdev;
        int r;
+       struct drm_file *file_priv = filp->private_data;
+       struct radeon_device *rdev = file_priv->minor->dev->dev_private;
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) {
-               return -EINVAL;
-       }
-
-       file_priv = filp->private_data;
-       rdev = file_priv->minor->dev->dev_private;
        if (rdev == NULL) {
                return -EINVAL;
        }
index e86a29a1e51f2ca225ad0ba8e6edd2eecf5430f1..e94c2ab3718a873dcb1b38ceba0390fa184b7065 100644 (file)
@@ -432,6 +432,9 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
        struct ttm_buffer_object *bo;
        int ret;
 
+       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
+               return -EINVAL;
+
        bo = ttm_bo_vm_lookup(bdev, vma->vm_pgoff, vma_pages(vma));
        if (unlikely(!bo))
                return -EINVAL;
index ec5b4b237f2c9722296376be40e3deb4188e463b..8bafa6eac5a887f098e9268bbd8f6609cacbb28f 100644 (file)
 
 int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct vmw_private *dev_priv;
+       struct drm_file *file_priv = filp->private_data;
+       struct vmw_private *dev_priv = vmw_priv(file_priv->minor->dev);
 
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) {
-               DRM_ERROR("Illegal attempt to mmap old fifo space.\n");
-               return -EINVAL;
-       }
-
-       file_priv = filp->private_data;
-       dev_priv = vmw_priv(file_priv->minor->dev);
        return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
 }
 
index b7db7a7952d4f6bcffc1576497cf5249b683f380..9d78438c28779091a1d79a1abe80ec0b63dd05a8 100644 (file)
@@ -357,14 +357,8 @@ int vbox_bo_push_sysram(struct vbox_bo *bo)
 
 int vbox_mmap(struct file *filp, struct vm_area_struct *vma)
 {
-       struct drm_file *file_priv;
-       struct vbox_private *vbox;
-
-       if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
-               return -EINVAL;
-
-       file_priv = filp->private_data;
-       vbox = file_priv->minor->dev->dev_private;
+       struct drm_file *file_priv = filp->private_data;
+       struct vbox_private *vbox = file_priv->minor->dev->dev_private;
 
        return ttm_bo_mmap(filp, vma, &vbox->ttm.bdev);
 }