@@ -1661,33 +1661,34 @@ static vm_fault_t vfio_pci_mmap_huge_fault(struct vm_fault *vmf,
1661
1661
unsigned long pfn , pgoff = vmf -> pgoff - vma -> vm_pgoff ;
1662
1662
vm_fault_t ret = VM_FAULT_SIGBUS ;
1663
1663
1664
- if (order && (vmf -> address & ((PAGE_SIZE << order ) - 1 ) ||
1664
+ pfn = vma_to_pfn (vma ) + pgoff ;
1665
+
1666
+ if (order && (pfn & ((1 << order ) - 1 ) ||
1667
+ vmf -> address & ((PAGE_SIZE << order ) - 1 ) ||
1665
1668
vmf -> address + (PAGE_SIZE << order ) > vma -> vm_end )) {
1666
1669
ret = VM_FAULT_FALLBACK ;
1667
1670
goto out ;
1668
1671
}
1669
1672
1670
- pfn = vma_to_pfn (vma );
1671
-
1672
1673
down_read (& vdev -> memory_lock );
1673
1674
1674
1675
if (vdev -> pm_runtime_engaged || !__vfio_pci_memory_enabled (vdev ))
1675
1676
goto out_unlock ;
1676
1677
1677
1678
switch (order ) {
1678
1679
case 0 :
1679
- ret = vmf_insert_pfn (vma , vmf -> address , pfn + pgoff );
1680
+ ret = vmf_insert_pfn (vma , vmf -> address , pfn );
1680
1681
break ;
1681
1682
#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
1682
1683
case PMD_ORDER :
1683
- ret = vmf_insert_pfn_pmd (vmf , __pfn_to_pfn_t ( pfn + pgoff ,
1684
- PFN_DEV ), false);
1684
+ ret = vmf_insert_pfn_pmd (vmf ,
1685
+ __pfn_to_pfn_t ( pfn , PFN_DEV ), false);
1685
1686
break ;
1686
1687
#endif
1687
1688
#ifdef CONFIG_ARCH_SUPPORTS_PUD_PFNMAP
1688
1689
case PUD_ORDER :
1689
- ret = vmf_insert_pfn_pud (vmf , __pfn_to_pfn_t ( pfn + pgoff ,
1690
- PFN_DEV ), false);
1690
+ ret = vmf_insert_pfn_pud (vmf ,
1691
+ __pfn_to_pfn_t ( pfn , PFN_DEV ), false);
1691
1692
break ;
1692
1693
#endif
1693
1694
default :
0 commit comments