summary refs log tree commit diff
path: root/Makefile
diff options
context:
space:
mode:
authorRalph Campbell <rcampbell@nvidia.com>2019-08-23 15:17:53 -0700
committerJason Gunthorpe <jgg@mellanox.com>2019-08-27 19:27:07 -0300
commitc18ce674d548c00faa6b7e760bacbaf1f39315f3 (patch)
tree33ca4bae9d6c21f40ba4a095fb80294c968943eb /Makefile
parent6c64f2bbe79cf3b770ac60ae79442322bd76d55e (diff)
downloadlinux-c18ce674d548c00faa6b7e760bacbaf1f39315f3.tar.gz
mm/hmm: hmm_range_fault() infinite loop
Normally, callers to handle_mm_fault() are supposed to check the
vma->vm_flags first. hmm_range_fault() checks for VM_READ but doesn't
check for VM_WRITE if the caller requests a page to be faulted in with
write permission (via the hmm_range.pfns[] value).  If the vma is write
protected, this can result in an infinite loop:

  hmm_range_fault()
    walk_page_range()
      ...
      hmm_vma_walk_hole()
        hmm_vma_walk_hole_()
          hmm_vma_do_fault()
            handle_mm_fault(FAULT_FLAG_WRITE)
            /* returns VM_FAULT_WRITE */
          /* returns -EBUSY */
        /* returns -EBUSY */
      /* returns -EBUSY */
    /* loops on -EBUSY and range->valid */

Prevent this by checking for vma->vm_flags & VM_WRITE before calling
handle_mm_fault().

Link: https://lore.kernel.org/r/20190823221753.2514-3-rcampbell@nvidia.com
Signed-off-by: Ralph Campbell <rcampbell@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'Makefile')
0 files changed, 0 insertions, 0 deletions