mm: defer flush of writable TLB entries
[firefly-linux-kernel-4.4.55.git] / mm / huge_memory.c
index d38aaf9dcba60a3131b1a540033191087730e572..279a818a39b13d76e574bf8f330c7c925b8e3a67 100644 (file)
@@ -717,13 +717,14 @@ static inline pmd_t mk_huge_pmd(struct page *page, pgprot_t prot)
 
 static int __do_huge_pmd_anonymous_page(struct mm_struct *mm,
                                        struct vm_area_struct *vma,
-                                       unsigned long haddr, pmd_t *pmd,
+                                       unsigned long address, pmd_t *pmd,
                                        struct page *page, gfp_t gfp,
                                        unsigned int flags)
 {
        struct mem_cgroup *memcg;
        pgtable_t pgtable;
        spinlock_t *ptl;
+       unsigned long haddr = address & HPAGE_PMD_MASK;
 
        VM_BUG_ON_PAGE(!PageCompound(page), page);
 
@@ -765,7 +766,7 @@ static int __do_huge_pmd_anonymous_page(struct mm_struct *mm,
                        mem_cgroup_cancel_charge(page, memcg);
                        put_page(page);
                        pte_free(mm, pgtable);
-                       ret = handle_userfault(vma, haddr, flags,
+                       ret = handle_userfault(vma, address, flags,
                                               VM_UFFD_MISSING);
                        VM_BUG_ON(ret & VM_FAULT_FALLBACK);
                        return ret;
@@ -841,7 +842,7 @@ int do_huge_pmd_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
                if (pmd_none(*pmd)) {
                        if (userfaultfd_missing(vma)) {
                                spin_unlock(ptl);
-                               ret = handle_userfault(vma, haddr, flags,
+                               ret = handle_userfault(vma, address, flags,
                                                       VM_UFFD_MISSING);
                                VM_BUG_ON(ret & VM_FAULT_FALLBACK);
                        } else {
@@ -865,7 +866,8 @@ int do_huge_pmd_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
                count_vm_event(THP_FAULT_FALLBACK);
                return VM_FAULT_FALLBACK;
        }
-       return __do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page, gfp, flags);
+       return __do_huge_pmd_anonymous_page(mm, vma, address, pmd, page, gfp,
+                                           flags);
 }
 
 int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,