The commit is pushed to "branch-rh7-3.10.0-327.10.1.vz7.12.x-ovz" and will
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.10.1.vz7.12.15
------>
commit 5948747c2342fb62d91d5a7dd7140e7922634a6b
Author: Vladimir Davydov <[email protected]>
Date: Fri Apr 29 19:28:58 2016 +0400
mm: memcontrol: check more carefully if current is oom killed
Currently, we abort memcg reclaim only if fatal_signal_pending returns
true on current. That's not enough, because a process can be killed
after it entered do_exit, in which case signal_pending may not be set
and therefore an OOM killed process may be looping in mem_cgroup_reclaim
for quite some time (the latter retries reclaim 100 times!), resulting
in OOM timeout at best or soft lockup panic at worst.
Let's elaborate the abort condition by adding TIF_MEMDIE check.
Signed-off-by: Vladimir Davydov <[email protected]>
Reviewed-by: Kirill Tkhai <[email protected]>
---
mm/memcontrol.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index df78ffd..a2ac582 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2092,7 +2092,8 @@ static unsigned long mem_cgroup_reclaim(struct mem_cgroup
*memcg,
drain_all_stock_async(memcg);
total += try_to_free_mem_cgroup_pages(memcg, SWAP_CLUSTER_MAX,
gfp_mask, noswap);
- if (fatal_signal_pending(current))
+ if (test_thread_flag(TIF_MEMDIE) ||
+ fatal_signal_pending(current))
return 1;
/*
* Allow limit shrinkers, which are triggered directly
@@ -2943,7 +2944,8 @@ again:
bool invoke_oom = oom && !nr_oom_retries;
/* If killed, bypass charge */
- if (fatal_signal_pending(current)) {
+ if (test_thread_flag(TIF_MEMDIE) ||
+ fatal_signal_pending(current)) {
css_put(&memcg->css);
goto bypass;
}
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel