|
@@ -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,
|
|
static int __do_huge_pmd_anonymous_page(struct mm_struct *mm,
|
|
struct vm_area_struct *vma,
|
|
struct vm_area_struct *vma,
|
|
- unsigned long haddr, pmd_t *pmd,
|
|
|
|
|
|
+ unsigned long address, pmd_t *pmd,
|
|
struct page *page, gfp_t gfp,
|
|
struct page *page, gfp_t gfp,
|
|
unsigned int flags)
|
|
unsigned int flags)
|
|
{
|
|
{
|
|
struct mem_cgroup *memcg;
|
|
struct mem_cgroup *memcg;
|
|
pgtable_t pgtable;
|
|
pgtable_t pgtable;
|
|
spinlock_t *ptl;
|
|
spinlock_t *ptl;
|
|
|
|
+ unsigned long haddr = address & HPAGE_PMD_MASK;
|
|
|
|
|
|
VM_BUG_ON_PAGE(!PageCompound(page), page);
|
|
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);
|
|
mem_cgroup_cancel_charge(page, memcg);
|
|
put_page(page);
|
|
put_page(page);
|
|
pte_free(mm, pgtable);
|
|
pte_free(mm, pgtable);
|
|
- ret = handle_userfault(vma, haddr, flags,
|
|
|
|
|
|
+ ret = handle_userfault(vma, address, flags,
|
|
VM_UFFD_MISSING);
|
|
VM_UFFD_MISSING);
|
|
VM_BUG_ON(ret & VM_FAULT_FALLBACK);
|
|
VM_BUG_ON(ret & VM_FAULT_FALLBACK);
|
|
return ret;
|
|
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 (pmd_none(*pmd)) {
|
|
if (userfaultfd_missing(vma)) {
|
|
if (userfaultfd_missing(vma)) {
|
|
spin_unlock(ptl);
|
|
spin_unlock(ptl);
|
|
- ret = handle_userfault(vma, haddr, flags,
|
|
|
|
|
|
+ ret = handle_userfault(vma, address, flags,
|
|
VM_UFFD_MISSING);
|
|
VM_UFFD_MISSING);
|
|
VM_BUG_ON(ret & VM_FAULT_FALLBACK);
|
|
VM_BUG_ON(ret & VM_FAULT_FALLBACK);
|
|
} else {
|
|
} 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);
|
|
count_vm_event(THP_FAULT_FALLBACK);
|
|
return VM_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,
|
|
int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|