Commit f27176cf authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Linus Torvalds
Browse files

mm: convert page_mkclean_one() to use page_vma_mapped_walk()

For consistency, it worth converting all page_check_address() to
page_vma_mapped_walk(), so we could drop the former.

PMD handling here is future-proofing, we don't have users yet.  ext4
with huge pages will be the first.


Signed-off-by: default avatarKirill A. Shutemov <>
Cc: Andrea Arcangeli <>
Cc: Hillf Danton <>
Cc: Hugh Dickins <>
Cc: Johannes Weiner <>
Cc: Oleg Nesterov <>
Cc: Peter Zijlstra <>
Cc: Rik van Riel <>
Cc: Srikar Dronamraju <>
Cc: Vladimir Davydov <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent a8fa41ad
......@@ -1017,34 +1017,56 @@ int page_referenced(struct page *page,
static int page_mkclean_one(struct page *page, struct vm_area_struct *vma,
unsigned long address, void *arg)
struct mm_struct *mm = vma->vm_mm;
pte_t *pte;
spinlock_t *ptl;
int ret = 0;
struct page_vma_mapped_walk pvmw = {
.page = page,
.vma = vma,
.address = address,
.flags = PVMW_SYNC,
int *cleaned = arg;
pte = page_check_address(page, mm, address, &ptl, 1);
if (!pte)
goto out;
if (pte_dirty(*pte) || pte_write(*pte)) {
while (page_vma_mapped_walk(&pvmw)) {
int ret = 0;
address = pvmw.address;
if (pvmw.pte) {
pte_t entry;
pte_t *pte = pvmw.pte;
if (!pte_dirty(*pte) && !pte_write(*pte))
flush_cache_page(vma, address, pte_pfn(*pte));
entry = ptep_clear_flush(vma, address, pte);
entry = pte_wrprotect(entry);
entry = pte_mkclean(entry);
set_pte_at(mm, address, pte, entry);
set_pte_at(vma->vm_mm, address, pte, entry);
ret = 1;
} else {
pmd_t *pmd = pvmw.pmd;
pmd_t entry;
pte_unmap_unlock(pte, ptl);
if (!pmd_dirty(*pmd) && !pmd_write(*pmd))
flush_cache_page(vma, address, page_to_pfn(page));
entry = pmdp_huge_clear_flush(vma, address, pmd);
entry = pmd_wrprotect(entry);
entry = pmd_mkclean(entry);
set_pmd_at(vma->vm_mm, address, pmd, entry);
ret = 1;
/* unexpected pmd-mapped page? */
if (ret) {
mmu_notifier_invalidate_page(mm, address);
mmu_notifier_invalidate_page(vma->vm_mm, address);
return SWAP_AGAIN;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment