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

Commit 61469f1d authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds
Browse files

memcg: when do_swap's do_wp_page fails



Don't uncharge when do_swap_page's call to do_wp_page fails: the page which
was charged for is there in the pagetable, and will be correctly uncharged
when that area is unmapped - it was only its COWing which failed.

And while we're here, remove earlier XXX comment: yes, OR in do_wp_page's
return value (maybe VM_FAULT_WRITE) with do_swap_page's there; but if it
fails, mask out success bits, which might confuse some arches e.g.  sparc.

Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
Cc: David Rientjes <rientjes@google.com>
Acked-by: default avatarBalbir Singh <balbir@linux.vnet.ibm.com>
Acked-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hirokazu Takahashi <taka@valinux.co.jp>
Cc: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Cc: Paul Menage <menage@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6dbf6d3b
Loading
Loading
Loading
Loading
+3 −6
Original line number Original line Diff line number Diff line
@@ -2093,12 +2093,9 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
	unlock_page(page);
	unlock_page(page);


	if (write_access) {
	if (write_access) {
		/* XXX: We could OR the do_wp_page code with this one? */
		ret |= do_wp_page(mm, vma, address, page_table, pmd, ptl, pte);
		if (do_wp_page(mm, vma, address,
		if (ret & VM_FAULT_ERROR)
				page_table, pmd, ptl, pte) & VM_FAULT_OOM) {
			ret &= VM_FAULT_ERROR;
			mem_cgroup_uncharge_page(page);
			ret = VM_FAULT_OOM;
		}
		goto out;
		goto out;
	}
	}