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 d5140d0..cd0ccfb 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 c410804..75d477b 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 ebc9dbd..4a40308 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 223a75b..e6b9846 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 8454889..6093c42 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 ce739da..bd42365 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 c664672..f0daf95 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 6b3b92d..0234f85 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 7c10e15..557bdd7 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 e86a29a..e94c2ab 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 ec5b4b2..8bafa6e 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 b7db7a7..9d78438 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);
 }