Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c86c97ff authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Linus Torvalds
Browse files

mm: softdirty: clear VM_SOFTDIRTY flag inside clear_refs_write() instead of clear_soft_dirty()



clear_refs_write() is called earlier than clear_soft_dirty() and it is
more natural to clear VM_SOFTDIRTY (which belongs to VMA entry but not
PTEs) that early instead of clearing it a way deeper inside call chain.

Signed-off-by: default avatarCyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b43790ee
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -737,9 +737,6 @@ static inline void clear_soft_dirty(struct vm_area_struct *vma,
		ptent = pte_file_clear_soft_dirty(ptent);
		ptent = pte_file_clear_soft_dirty(ptent);
	}
	}


	if (vma->vm_flags & VM_SOFTDIRTY)
		vma->vm_flags &= ~VM_SOFTDIRTY;

	set_pte_at(vma->vm_mm, addr, pte, ptent);
	set_pte_at(vma->vm_mm, addr, pte, ptent);
#endif
#endif
}
}
@@ -808,7 +805,8 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
	if (type == CLEAR_REFS_SOFT_DIRTY) {
	if (type == CLEAR_REFS_SOFT_DIRTY) {
		soft_dirty_cleared = true;
		soft_dirty_cleared = true;
		pr_warn_once("The pagemap bits 55-60 has changed their meaning!"
		pr_warn_once("The pagemap bits 55-60 has changed their meaning!"
				"See the linux/Documentation/vm/pagemap.txt for details.\n");
			     " See the linux/Documentation/vm/pagemap.txt for "
			     "details.\n");
	}
	}


	task = get_proc_task(file_inode(file));
	task = get_proc_task(file_inode(file));
@@ -839,11 +837,17 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
			 *
			 *
			 * Writing 3 to /proc/pid/clear_refs only affects file
			 * Writing 3 to /proc/pid/clear_refs only affects file
			 * mapped pages.
			 * mapped pages.
			 *
			 * Writing 4 to /proc/pid/clear_refs affects all pages.
			 */
			 */
			if (type == CLEAR_REFS_ANON && vma->vm_file)
			if (type == CLEAR_REFS_ANON && vma->vm_file)
				continue;
				continue;
			if (type == CLEAR_REFS_MAPPED && !vma->vm_file)
			if (type == CLEAR_REFS_MAPPED && !vma->vm_file)
				continue;
				continue;
			if (type == CLEAR_REFS_SOFT_DIRTY) {
				if (vma->vm_flags & VM_SOFTDIRTY)
					vma->vm_flags &= ~VM_SOFTDIRTY;
			}
			walk_page_range(vma->vm_start, vma->vm_end,
			walk_page_range(vma->vm_start, vma->vm_end,
					&clear_refs_walk);
					&clear_refs_walk);
		}
		}