khugepaged.c (f3f0e1d2150b2b99da2cbdfaad000089efe9bf30) khugepaged.c (e496cf3d782135c1cca0d154d4b924517ff58de0)
1#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2
3#include <linux/mm.h>
4#include <linux/sched.h>
5#include <linux/mmu_notifier.h>
6#include <linux/rmap.h>
7#include <linux/swap.h>
8#include <linux/mm_inline.h>

--- 805 unchanged lines hidden (view full) ---

814#endif
815
816static bool hugepage_vma_check(struct vm_area_struct *vma)
817{
818 if ((!(vma->vm_flags & VM_HUGEPAGE) && !khugepaged_always()) ||
819 (vma->vm_flags & VM_NOHUGEPAGE))
820 return false;
821 if (shmem_file(vma->vm_file)) {
1#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2
3#include <linux/mm.h>
4#include <linux/sched.h>
5#include <linux/mmu_notifier.h>
6#include <linux/rmap.h>
7#include <linux/swap.h>
8#include <linux/mm_inline.h>

--- 805 unchanged lines hidden (view full) ---

814#endif
815
816static bool hugepage_vma_check(struct vm_area_struct *vma)
817{
818 if ((!(vma->vm_flags & VM_HUGEPAGE) && !khugepaged_always()) ||
819 (vma->vm_flags & VM_NOHUGEPAGE))
820 return false;
821 if (shmem_file(vma->vm_file)) {
822 if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE))
823 return false;
822 return IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff,
823 HPAGE_PMD_NR);
824 }
825 if (!vma->anon_vma || vma->vm_ops)
826 return false;
827 if (is_vma_temporary_stack(vma))
828 return false;
829 return !(vma->vm_flags & VM_NO_KHUGEPAGED);

--- 387 unchanged lines hidden (view full) ---

1217 */
1218
1219 /* khugepaged_mm_lock actually not necessary for the below */
1220 free_mm_slot(mm_slot);
1221 mmdrop(mm);
1222 }
1223}
1224
824 return IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff,
825 HPAGE_PMD_NR);
826 }
827 if (!vma->anon_vma || vma->vm_ops)
828 return false;
829 if (is_vma_temporary_stack(vma))
830 return false;
831 return !(vma->vm_flags & VM_NO_KHUGEPAGED);

--- 387 unchanged lines hidden (view full) ---

1219 */
1220
1221 /* khugepaged_mm_lock actually not necessary for the below */
1222 free_mm_slot(mm_slot);
1223 mmdrop(mm);
1224 }
1225}
1226
1225#ifdef CONFIG_SHMEM
1227#if defined(CONFIG_SHMEM) && defined(CONFIG_TRANSPARENT_HUGE_PAGECACHE)
1226static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
1227{
1228 struct vm_area_struct *vma;
1229 unsigned long addr;
1230 pmd_t *pmd, _pmd;
1231
1232 i_mmap_lock_write(mapping);
1233 vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) {

--- 442 unchanged lines hidden (view full) ---

1676 hend = vma->vm_end & HPAGE_PMD_MASK;
1677 if (hstart >= hend)
1678 goto skip;
1679 if (khugepaged_scan.address > hend)
1680 goto skip;
1681 if (khugepaged_scan.address < hstart)
1682 khugepaged_scan.address = hstart;
1683 VM_BUG_ON(khugepaged_scan.address & ~HPAGE_PMD_MASK);
1228static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)
1229{
1230 struct vm_area_struct *vma;
1231 unsigned long addr;
1232 pmd_t *pmd, _pmd;
1233
1234 i_mmap_lock_write(mapping);
1235 vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) {

--- 442 unchanged lines hidden (view full) ---

1678 hend = vma->vm_end & HPAGE_PMD_MASK;
1679 if (hstart >= hend)
1680 goto skip;
1681 if (khugepaged_scan.address > hend)
1682 goto skip;
1683 if (khugepaged_scan.address < hstart)
1684 khugepaged_scan.address = hstart;
1685 VM_BUG_ON(khugepaged_scan.address & ~HPAGE_PMD_MASK);
1684 if (shmem_file(vma->vm_file) && !shmem_huge_enabled(vma))
1685 goto skip;
1686
1687 while (khugepaged_scan.address < hend) {
1688 int ret;
1689 cond_resched();
1690 if (unlikely(khugepaged_test_exit(mm)))
1691 goto breakouterloop;
1692
1693 VM_BUG_ON(khugepaged_scan.address < hstart ||
1694 khugepaged_scan.address + HPAGE_PMD_SIZE >
1695 hend);
1696 if (shmem_file(vma->vm_file)) {
1686
1687 while (khugepaged_scan.address < hend) {
1688 int ret;
1689 cond_resched();
1690 if (unlikely(khugepaged_test_exit(mm)))
1691 goto breakouterloop;
1692
1693 VM_BUG_ON(khugepaged_scan.address < hstart ||
1694 khugepaged_scan.address + HPAGE_PMD_SIZE >
1695 hend);
1696 if (shmem_file(vma->vm_file)) {
1697 struct file *file = get_file(vma->vm_file);
1697 struct file *file;
1698 pgoff_t pgoff = linear_page_index(vma,
1699 khugepaged_scan.address);
1698 pgoff_t pgoff = linear_page_index(vma,
1699 khugepaged_scan.address);
1700 if (!shmem_huge_enabled(vma))
1701 goto skip;
1702 file = get_file(vma->vm_file);
1700 up_read(&mm->mmap_sem);
1701 ret = 1;
1702 khugepaged_scan_shmem(mm, file->f_mapping,
1703 pgoff, hpage);
1704 fput(file);
1705 } else {
1706 ret = khugepaged_scan_pmd(mm, vma,
1707 khugepaged_scan.address,

--- 203 unchanged lines hidden ---
1703 up_read(&mm->mmap_sem);
1704 ret = 1;
1705 khugepaged_scan_shmem(mm, file->f_mapping,
1706 pgoff, hpage);
1707 fput(file);
1708 } else {
1709 ret = khugepaged_scan_pmd(mm, vma,
1710 khugepaged_scan.address,

--- 203 unchanged lines hidden ---