]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blobdiff - mm/khugepaged.c
khugepaged: collapse_pte_mapped_thp() flush the right range
[mirror_ubuntu-focal-kernel.git] / mm / khugepaged.c
index a8a57bebb5fac3b72a48f187d878b6e257ddc479..e98937c8bed05ba315c66f07ef22a4184bf4c88c 100644 (file)
@@ -876,6 +876,9 @@ static int hugepage_vma_revalidate(struct mm_struct *mm, unsigned long address,
                return SCAN_ADDRESS_RANGE;
        if (!hugepage_vma_check(vma, vma->vm_flags))
                return SCAN_VMA_CHECK;
+       /* Anon VMA expected */
+       if (!vma->anon_vma || vma->vm_ops)
+               return SCAN_VMA_CHECK;
        return 0;
 }
 
@@ -1381,7 +1384,7 @@ void collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr)
 
        /* step 4: collapse pmd */
        ptl = pmd_lock(vma->vm_mm, pmd);
-       _pmd = pmdp_collapse_flush(vma, addr, pmd);
+       _pmd = pmdp_collapse_flush(vma, haddr, pmd);
        spin_unlock(ptl);
        mm_dec_nr_ptes(mm);
        pte_free(mm, pmd_pgtable(_pmd));
@@ -1655,6 +1658,7 @@ static void collapse_file(struct mm_struct *mm,
                if (page_has_private(page) &&
                    !try_to_release_page(page, GFP_KERNEL)) {
                        result = SCAN_PAGE_HAS_PRIVATE;
+                       putback_lru_page(page);
                        goto out_unlock;
                }