Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "mm, thp: Do not make pmd/pud dirty without a reason"

This reverts commit 152e93af3cfe2d29d8136cc0a02a8612507136ee.

It was a nice cleanup in theory, but as Nicolai Stange points out, we do
need to make the page dirty for the copy-on-write case even when we
didn't end up making it writable, since the dirty bit is what we use to
check that we've gone through a COW cycle.

Reported-by: Michal Hocko <mhocko@kernel.org>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+16 -24
+12 -19
mm/huge_memory.c
··· 474 474 } 475 475 __setup("transparent_hugepage=", setup_transparent_hugepage); 476 476 477 - pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma, bool dirty) 477 + pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) 478 478 { 479 - if (likely(vma->vm_flags & VM_WRITE)) { 479 + if (likely(vma->vm_flags & VM_WRITE)) 480 480 pmd = pmd_mkwrite(pmd); 481 - if (dirty) 482 - pmd = pmd_mkdirty(pmd); 483 - } 484 481 return pmd; 485 482 } 486 483 ··· 599 602 } 600 603 601 604 entry = mk_huge_pmd(page, vma->vm_page_prot); 602 - entry = maybe_pmd_mkwrite(entry, vma, true); 605 + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); 603 606 page_add_new_anon_rmap(page, vma, haddr, true); 604 607 mem_cgroup_commit_charge(page, memcg, false, true); 605 608 lru_cache_add_active_or_unevictable(page, vma); ··· 741 744 if (pfn_t_devmap(pfn)) 742 745 entry = pmd_mkdevmap(entry); 743 746 if (write) { 744 - entry = pmd_mkyoung(entry); 745 - entry = maybe_pmd_mkwrite(entry, vma, true); 747 + entry = pmd_mkyoung(pmd_mkdirty(entry)); 748 + entry = maybe_pmd_mkwrite(entry, vma); 746 749 } 747 750 748 751 if (pgtable) { ··· 788 791 EXPORT_SYMBOL_GPL(vmf_insert_pfn_pmd); 789 792 790 793 #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD 791 - static pud_t maybe_pud_mkwrite(pud_t pud, struct vm_area_struct *vma, 792 - bool dirty) 794 + static pud_t maybe_pud_mkwrite(pud_t pud, struct vm_area_struct *vma) 793 795 { 794 - if (likely(vma->vm_flags & VM_WRITE)) { 796 + if (likely(vma->vm_flags & VM_WRITE)) 795 797 pud = pud_mkwrite(pud); 796 - if (dirty) 797 - pud = pud_mkdirty(pud); 798 - } 799 798 return pud; 800 799 } 801 800 ··· 807 814 if (pfn_t_devmap(pfn)) 808 815 entry = pud_mkdevmap(entry); 809 816 if (write) { 810 - entry = pud_mkyoung(entry); 811 - entry = maybe_pud_mkwrite(entry, vma, true); 817 + entry = pud_mkyoung(pud_mkdirty(entry)); 818 + entry = maybe_pud_mkwrite(entry, vma); 812 819 } 813 820 set_pud_at(mm, addr, pud, entry); 814 821 update_mmu_cache_pud(vma, addr, pud); ··· 1279 1286 if (reuse_swap_page(page, NULL)) { 1280 1287 pmd_t entry; 1281 1288 entry = pmd_mkyoung(orig_pmd); 1282 - entry = maybe_pmd_mkwrite(entry, vma, true); 1289 + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); 1283 1290 if (pmdp_set_access_flags(vma, haddr, vmf->pmd, entry, 1)) 1284 1291 update_mmu_cache_pmd(vma, vmf->address, vmf->pmd); 1285 1292 ret |= VM_FAULT_WRITE; ··· 1349 1356 } else { 1350 1357 pmd_t entry; 1351 1358 entry = mk_huge_pmd(new_page, vma->vm_page_prot); 1352 - entry = maybe_pmd_mkwrite(entry, vma, true); 1359 + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); 1353 1360 pmdp_huge_clear_flush_notify(vma, haddr, vmf->pmd); 1354 1361 page_add_new_anon_rmap(new_page, vma, haddr, true); 1355 1362 mem_cgroup_commit_charge(new_page, memcg, false, true); ··· 2928 2935 if (pmd_swp_soft_dirty(*pvmw->pmd)) 2929 2936 pmde = pmd_mksoft_dirty(pmde); 2930 2937 if (is_write_migration_entry(entry)) 2931 - pmde = maybe_pmd_mkwrite(pmde, vma, false); 2938 + pmde = maybe_pmd_mkwrite(pmde, vma); 2932 2939 2933 2940 flush_cache_range(vma, mmun_start, mmun_start + HPAGE_PMD_SIZE); 2934 2941 page_add_anon_rmap(new, vma, mmun_start, true);
+1 -2
mm/internal.h
··· 328 328 } 329 329 } 330 330 331 - extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma, 332 - bool dirty); 331 + extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma); 333 332 334 333 /* 335 334 * At what user virtual address is page expected in @vma?
+1 -1
mm/khugepaged.c
··· 1057 1057 pgtable = pmd_pgtable(_pmd); 1058 1058 1059 1059 _pmd = mk_huge_pmd(new_page, vma->vm_page_prot); 1060 - _pmd = maybe_pmd_mkwrite(_pmd, vma, false); 1060 + _pmd = maybe_pmd_mkwrite(pmd_mkdirty(_pmd), vma); 1061 1061 1062 1062 /* 1063 1063 * spin_lock() below is not the equivalent of smp_wmb(), so
+1 -1
mm/memory.c
··· 3335 3335 3336 3336 entry = mk_huge_pmd(page, vma->vm_page_prot); 3337 3337 if (write) 3338 - entry = maybe_pmd_mkwrite(entry, vma, true); 3338 + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); 3339 3339 3340 3340 add_mm_counter(vma->vm_mm, MM_FILEPAGES, HPAGE_PMD_NR); 3341 3341 page_add_file_rmap(page, true);
+1 -1
mm/migrate.c
··· 2068 2068 } 2069 2069 2070 2070 entry = mk_huge_pmd(new_page, vma->vm_page_prot); 2071 - entry = maybe_pmd_mkwrite(entry, vma, false); 2071 + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); 2072 2072 2073 2073 /* 2074 2074 * Clear the old entry under pagetable lock and establish the new PTE.