Commit 61469f1d51777fc3b6d8d70da8373ee77ee13349

Authored by Hugh Dickins
Committed by Linus Torvalds
1 parent 6dbf6d3bb9

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: Hugh Dickins <hugh@veritas.com>
Cc: David Rientjes <rientjes@google.com>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Acked-by: KAMEZAWA 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 3 additions and 6 deletions Side-by-side Diff

... ... @@ -2093,12 +2093,9 @@
2093 2093 unlock_page(page);
2094 2094  
2095 2095 if (write_access) {
2096   - /* XXX: We could OR the do_wp_page code with this one? */
2097   - if (do_wp_page(mm, vma, address,
2098   - page_table, pmd, ptl, pte) & VM_FAULT_OOM) {
2099   - mem_cgroup_uncharge_page(page);
2100   - ret = VM_FAULT_OOM;
2101   - }
  2096 + ret |= do_wp_page(mm, vma, address, page_table, pmd, ptl, pte);
  2097 + if (ret & VM_FAULT_ERROR)
  2098 + ret &= VM_FAULT_ERROR;
2102 2099 goto out;
2103 2100 }
2104 2101