Normally, the @page mapping is set prior to inserting the page into a
page table entry. Make device-dax adhere to the same ordering, rather
than setting mapping after the PTE is inserted.

The address_space never changes and it is always associated with the
same inode and underlying pages. So, the page mapping is set once but
cleared when the struct pages are removed/freed (i.e. after
{devm_}memunmap_pages()).

Suggested-by: Jason Gunthorpe <[email protected]>
Signed-off-by: Joao Martins <[email protected]>
---
 drivers/dax/device.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/dax/device.c b/drivers/dax/device.c
index 9c87927d4bc2..0ef9fecec005 100644
--- a/drivers/dax/device.c
+++ b/drivers/dax/device.c
@@ -121,6 +121,8 @@ static vm_fault_t __dev_dax_pte_fault(struct dev_dax 
*dev_dax,
 
        *pfn = phys_to_pfn_t(phys, PFN_DEV|PFN_MAP);
 
+       dax_set_mapping(vmf, *pfn, fault_size);
+
        return vmf_insert_mixed(vmf->vma, vmf->address, *pfn);
 }
 
@@ -161,6 +163,8 @@ static vm_fault_t __dev_dax_pmd_fault(struct dev_dax 
*dev_dax,
 
        *pfn = phys_to_pfn_t(phys, PFN_DEV|PFN_MAP);
 
+       dax_set_mapping(vmf, *pfn, fault_size);
+
        return vmf_insert_pfn_pmd(vmf, *pfn, vmf->flags & FAULT_FLAG_WRITE);
 }
 
@@ -203,6 +207,8 @@ static vm_fault_t __dev_dax_pud_fault(struct dev_dax 
*dev_dax,
 
        *pfn = phys_to_pfn_t(phys, PFN_DEV|PFN_MAP);
 
+       dax_set_mapping(vmf, *pfn, fault_size);
+
        return vmf_insert_pfn_pud(vmf, *pfn, vmf->flags & FAULT_FLAG_WRITE);
 }
 #else
@@ -245,8 +251,6 @@ static vm_fault_t dev_dax_huge_fault(struct vm_fault *vmf,
                rc = VM_FAULT_SIGBUS;
        }
 
-       if (rc == VM_FAULT_NOPAGE)
-               dax_set_mapping(vmf, pfn, fault_size);
        dax_read_unlock(id);
 
        return rc;
-- 
2.17.2


Reply via email to