diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2010-03-10 18:22:39 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-12 18:52:38 -0500 |
commit | 867578cbccb0893cc14fc29c670f7185809c90d6 (patch) | |
tree | e4d0cefac265fc64399223bc82ed714a88ebe20c /mm/oom_kill.c | |
parent | 0263c12c12ccc90edc9d856fa839f8936183e6d1 (diff) |
memcg: fix oom kill behavior
In current page-fault code,
handle_mm_fault()
-> ...
-> mem_cgroup_charge()
-> map page or handle error.
-> check return code.
If page fault's return code is VM_FAULT_OOM, page_fault_out_of_memory() is
called. But if it's caused by memcg, OOM should have been already
invoked.
Then, I added a patch: a636b327f731143ccc544b966cfd8de6cb6d72c6. That
patch records last_oom_jiffies for memcg's sub-hierarchy and prevents
page_fault_out_of_memory from being invoked in near future.
But Nishimura-san reported that check by jiffies is not enough when the
system is terribly heavy.
This patch changes memcg's oom logic as.
* If memcg causes OOM-kill, continue to retry.
* remove jiffies check which is used now.
* add memcg-oom-lock which works like perzone oom lock.
* If current is killed(as a process), bypass charge.
Something more sophisticated can be added but this pactch does
fundamental things.
TODO:
- add oom notifier
- add permemcg disable-oom-kill flag and freezer at oom.
- more chances for wake up oom waiter (when changing memory limit etc..)
Reviewed-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Tested-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/oom_kill.c')
-rw-r--r-- | mm/oom_kill.c | 8 |
1 files changed, 0 insertions, 8 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 71d10bf52dc8..9b223af6a147 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -603,13 +603,6 @@ void pagefault_out_of_memory(void) | |||
603 | /* Got some memory back in the last second. */ | 603 | /* Got some memory back in the last second. */ |
604 | return; | 604 | return; |
605 | 605 | ||
606 | /* | ||
607 | * If this is from memcg, oom-killer is already invoked. | ||
608 | * and not worth to go system-wide-oom. | ||
609 | */ | ||
610 | if (mem_cgroup_oom_called(current)) | ||
611 | goto rest_and_return; | ||
612 | |||
613 | if (sysctl_panic_on_oom) | 606 | if (sysctl_panic_on_oom) |
614 | panic("out of memory from page fault. panic_on_oom is selected.\n"); | 607 | panic("out of memory from page fault. panic_on_oom is selected.\n"); |
615 | 608 | ||
@@ -621,7 +614,6 @@ void pagefault_out_of_memory(void) | |||
621 | * Give "p" a good chance of killing itself before we | 614 | * Give "p" a good chance of killing itself before we |
622 | * retry to allocate memory. | 615 | * retry to allocate memory. |
623 | */ | 616 | */ |
624 | rest_and_return: | ||
625 | if (!test_thread_flag(TIF_MEMDIE)) | 617 | if (!test_thread_flag(TIF_MEMDIE)) |
626 | schedule_timeout_uninterruptible(1); | 618 | schedule_timeout_uninterruptible(1); |
627 | } | 619 | } |