diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2008-10-18 23:28:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-20 11:52:38 -0400 |
commit | 073e587ec2cc377867e53d8b8959738a8e16cff6 (patch) | |
tree | 856aac72b818de4f52ce38448b852930554b3efa | |
parent | 47c59803becb55b72b26cdab3838d621a15badc8 (diff) |
memcg: move charge swapin under lock
While page-cache's charge/uncharge is done under page_lock(), swap-cache
isn't. (anonymous page is charged when it's newly allocated.)
This patch moves do_swap_page()'s charge() call under lock. I don't see
any bad problem *now* but this fix will be good for future for avoiding
unnecessary racy state.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Reviewed-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/memory.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/mm/memory.c b/mm/memory.c index ba86b436b85f..54cf20ee0a83 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2326,16 +2326,17 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2326 | count_vm_event(PGMAJFAULT); | 2326 | count_vm_event(PGMAJFAULT); |
2327 | } | 2327 | } |
2328 | 2328 | ||
2329 | mark_page_accessed(page); | ||
2330 | |||
2331 | lock_page(page); | ||
2332 | delayacct_clear_flag(DELAYACCT_PF_SWAPIN); | ||
2333 | |||
2329 | if (mem_cgroup_charge(page, mm, GFP_KERNEL)) { | 2334 | if (mem_cgroup_charge(page, mm, GFP_KERNEL)) { |
2330 | delayacct_clear_flag(DELAYACCT_PF_SWAPIN); | ||
2331 | ret = VM_FAULT_OOM; | 2335 | ret = VM_FAULT_OOM; |
2336 | unlock_page(page); | ||
2332 | goto out; | 2337 | goto out; |
2333 | } | 2338 | } |
2334 | 2339 | ||
2335 | mark_page_accessed(page); | ||
2336 | lock_page(page); | ||
2337 | delayacct_clear_flag(DELAYACCT_PF_SWAPIN); | ||
2338 | |||
2339 | /* | 2340 | /* |
2340 | * Back out if somebody else already faulted in this pte. | 2341 | * Back out if somebody else already faulted in this pte. |
2341 | */ | 2342 | */ |