mm: fix anonymous dirtying
do_anonymous_page() has been wrong to dirty the pte regardless. If it's not going to mark the pte writable, then it won't help to mark it dirty here, and clogs up memory with pages which will need swap instead of being thrown away. Especially wrong if no overcommit is chosen, and this vma is not yet VM_ACCOUNTed - we could exceed the limit and OOM despite no overcommit. Signed-off-by: Hugh Dickins <hugh.dickins@tiscali.co.uk> Cc: <stable@kernel.org> Acked-by: Rik van Riel <riel@redhat.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Nick Piggin <npiggin@suse.de> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Minchan Kim <minchan.kim@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2a15efc953
commit
1ac0cb5d0e
@ -2653,7 +2653,8 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|||||||
goto oom_free_page;
|
goto oom_free_page;
|
||||||
|
|
||||||
entry = mk_pte(page, vma->vm_page_prot);
|
entry = mk_pte(page, vma->vm_page_prot);
|
||||||
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
if (vma->vm_flags & VM_WRITE)
|
||||||
|
entry = pte_mkwrite(pte_mkdirty(entry));
|
||||||
|
|
||||||
page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
|
page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
|
||||||
if (!pte_none(*page_table))
|
if (!pte_none(*page_table))
|
||||||
|
Loading…
Reference in New Issue
Block a user