On Tue, May 05, 2020 at 03:54:44PM -0600, Alex Williamson wrote: > With conversion to follow_pfn(), DMA mapping a PFNMAP range depends on > the range being faulted into the vma. Add support to manually provide > that, in the same way as done on KVM with hva_to_pfn_remapped(). > > Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > --- > drivers/vfio/vfio_iommu_type1.c | 36 +++++++++++++++++++++++++++++++++--- > 1 file changed, 33 insertions(+), 3 deletions(-) > > diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c > index cc1d64765ce7..4a4cb7cd86b2 100644 > --- a/drivers/vfio/vfio_iommu_type1.c > +++ b/drivers/vfio/vfio_iommu_type1.c > @@ -317,6 +317,32 @@ static int put_pfn(unsigned long pfn, int prot) > return 0; > } > > +static int follow_fault_pfn(struct vm_area_struct *vma, struct mm_struct *mm, > + unsigned long vaddr, unsigned long *pfn, > + bool write_fault) > +{ > + int ret; > + > + ret = follow_pfn(vma, vaddr, pfn); > + if (ret) { > + bool unlocked = false; > + > + ret = fixup_user_fault(NULL, mm, vaddr, > + FAULT_FLAG_REMOTE | > + (write_fault ? FAULT_FLAG_WRITE : 0), > + &unlocked); > + if (unlocked) > + return -EAGAIN; Hi, Alex, IIUC this retry is not needed too because fixup_user_fault() will guarantee the fault-in is done correctly with the valid PTE as long as ret==0, even if unlocked==true. Note: there's another patch just removed the similar retry in kvm: https://lore.kernel.org/kvm/20200416155906.267462-1-peterx@xxxxxxxxxx/ Thanks, > + > + if (ret) > + return ret; > + > + ret = follow_pfn(vma, vaddr, pfn); > + } > + > + return ret; > +} -- Peter Xu