Skip to content

Commit 51b00d8

Browse files
committed
drm/i915/gvt: Fix mmap range check
This is to fix missed mmap range check on vGPU bar2 region and only allow to map vGPU allocated GMADDR range, which means user space should support sparse mmap to get proper offset for mmap vGPU aperture. And this takes care of actual pgoff in mmap request as original code always does from beginning of vGPU aperture. Fixes: 659643f ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT") Cc: "Monroy, Rodrigo Axel" <rodrigo.axel.monroy@intel.com> Cc: "Orrala Contreras, Alfredo" <alfredo.orrala.contreras@intel.com> Cc: stable@vger.kernel.org # v4.10+ Reviewed-by: Hang Yuan <hang.yuan@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
1 parent 6c2d0f9 commit 51b00d8

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/gpu/drm/i915/gvt/kvmgt.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,7 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
996996
{
997997
unsigned int index;
998998
u64 virtaddr;
999-
unsigned long req_size, pgoff = 0;
999+
unsigned long req_size, pgoff, req_start;
10001000
pgprot_t pg_prot;
10011001
struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
10021002

@@ -1014,7 +1014,17 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
10141014
pg_prot = vma->vm_page_prot;
10151015
virtaddr = vma->vm_start;
10161016
req_size = vma->vm_end - vma->vm_start;
1017-
pgoff = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;
1017+
pgoff = vma->vm_pgoff &
1018+
((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
1019+
req_start = pgoff << PAGE_SHIFT;
1020+
1021+
if (!intel_vgpu_in_aperture(vgpu, req_start))
1022+
return -EINVAL;
1023+
if (req_start + req_size >
1024+
vgpu_aperture_offset(vgpu) + vgpu_aperture_sz(vgpu))
1025+
return -EINVAL;
1026+
1027+
pgoff = (gvt_aperture_pa_base(vgpu->gvt) >> PAGE_SHIFT) + pgoff;
10181028

10191029
return remap_pfn_range(vma, virtaddr, pgoff, req_size, pg_prot);
10201030
}

0 commit comments

Comments
 (0)