Patch "vfio/pci: Insert full vma on mmap'd MMIO fault" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    vfio/pci: Insert full vma on mmap'd MMIO fault

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     vfio-pci-insert-full-vma-on-mmap-d-mmio-fault.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e3f50b0394a1223075984ff2c664150e9a77547a
Author: Alex Williamson <alex.williamson@xxxxxxxxxx>
Date:   Thu Jun 6 21:52:07 2024 -0600

    vfio/pci: Insert full vma on mmap'd MMIO fault
    
    [ Upstream commit d71a989cf5d961989c273093cdff2550acdde314 ]
    
    In order to improve performance of typical scenarios we can try to insert
    the entire vma on fault.  This accelerates typical cases, such as when
    the MMIO region is DMA mapped by QEMU.  The vfio_iommu_type1 driver will
    fault in the entire DMA mapped range through fixup_user_fault().
    
    In synthetic testing, this improves the time required to walk a PCI BAR
    mapping from userspace by roughly 1/3rd.
    
    This is likely an interim solution until vmf_insert_pfn_{pmd,pud}() gain
    support for pfnmaps.
    
    Suggested-by: Yan Zhao <yan.y.zhao@xxxxxxxxx>
    Link: https://lore.kernel.org/all/Zl6XdUkt%2FzMMGOLF@xxxxxxxxxxxxxxxxxxxxxxxxx/
    Reviewed-by: Yan Zhao <yan.y.zhao@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20240607035213.2054226-1-alex.williamson@xxxxxxxxxx
    Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 727a51ce9ad71..680b15ca4fcea 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -1659,6 +1659,7 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
 	struct vm_area_struct *vma = vmf->vma;
 	struct vfio_pci_core_device *vdev = vma->vm_private_data;
 	unsigned long pfn, pgoff = vmf->pgoff - vma->vm_pgoff;
+	unsigned long addr = vma->vm_start;
 	vm_fault_t ret = VM_FAULT_SIGBUS;
 
 	pfn = vma_to_pfn(vma);
@@ -1666,11 +1667,25 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
 	down_read(&vdev->memory_lock);
 
 	if (vdev->pm_runtime_engaged || !__vfio_pci_memory_enabled(vdev))
-		goto out_disabled;
+		goto out_unlock;
 
 	ret = vmf_insert_pfn(vma, vmf->address, pfn + pgoff);
+	if (ret & VM_FAULT_ERROR)
+		goto out_unlock;
 
-out_disabled:
+	/*
+	 * Pre-fault the remainder of the vma, abort further insertions and
+	 * supress error if fault is encountered during pre-fault.
+	 */
+	for (; addr < vma->vm_end; addr += PAGE_SIZE, pfn++) {
+		if (addr == vmf->address)
+			continue;
+
+		if (vmf_insert_pfn(vma, addr, pfn) & VM_FAULT_ERROR)
+			break;
+	}
+
+out_unlock:
 	up_read(&vdev->memory_lock);
 
 	return ret;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux