lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 29 Dec 2015 22:58:22 +0900
From:	Tetsuo Handa <penguin-kernel@...ove.SAKURA.ne.jp>
To:	mhocko@...nel.org, akpm@...ux-foundation.org
Cc:	mgorman@...e.de, rientjes@...gle.com,
	torvalds@...ux-foundation.org, oleg@...hat.com, hughd@...gle.com,
	andrea@...nel.org, riel@...hat.com, linux-mm@...ck.org,
	linux-kernel@...r.kernel.org
Subject: [PATCH] mm,oom: Exclude TIF_MEMDIE processes from candidates.

>>From 8bb9e36891a803e82c589ef78077838026ce0f7d Mon Sep 17 00:00:00 2001
From: Tetsuo Handa <penguin-kernel@...ove.SAKURA.ne.jp>
Date: Tue, 29 Dec 2015 22:20:58 +0900
Subject: [PATCH] mm,oom: Exclude TIF_MEMDIE processes from candidates.

The OOM reaper kernel thread can reclaim OOM victim's memory before the victim
terminates. But since oom_kill_process() tries to kill children of the memory
hog process first, the OOM reaper can not reclaim enough memory for terminating
the victim if the victim is consuming little memory. The result is OOM livelock
as usual, for timeout based next OOM victim selection is not implemented.

While SysRq-f (manual invocation of the OOM killer) can wake up the OOM killer,
the OOM killer chooses the same OOM victim which already has TIF_MEMDIE. This
is effectively disabling SysRq-f.

This patch excludes TIF_MEMDIE processes from candidates so that the memory
hog process itself will be killed when all children of the memory hog process
got stuck with TIF_MEMDIE pending.

----------
[  120.078776] oom-write invoked oom-killer: order=0, oom_score_adj=0, gfp_mask=0x24280ca(GFP_HIGHUSER_MOVABLE|GFP_ZERO)
[  120.088610] oom-write cpuset=/ mems_allowed=0
[  120.095558] CPU: 0 PID: 9546 Comm: oom-write Not tainted 4.4.0-rc6-next-20151223 #260
(...snipped...)
[  120.194148] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
(...snipped...)
[  120.260191] [ 9546]  1000  9546   541716   453473     896       6        0             0 oom-write
[  120.262166] [ 9547]  1000  9547       40        1       3       2        0             0 write
[  120.264071] [ 9548]  1000  9548       40        1       3       2        0             0 write
[  120.265939] [ 9549]  1000  9549       40        1       4       2        0             0 write
[  120.267794] [ 9550]  1000  9550       40        1       3       2        0             0 write
[  120.269654] [ 9551]  1000  9551       40        1       3       2        0             0 write
[  120.271447] [ 9552]  1000  9552       40        1       3       2        0             0 write
[  120.273220] [ 9553]  1000  9553       40        1       3       2        0             0 write
[  120.274975] [ 9554]  1000  9554       40        1       3       2        0             0 write
[  120.276745] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  120.278516] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  120.280227] Out of memory: Kill process 9546 (oom-write) score 892 or sacrifice child
[  120.282010] Killed process 9549 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
(...snipped...)
[  122.506001] systemd-journal invoked oom-killer: order=0, oom_score_adj=0, gfp_mask=0x24201ca(GFP_HIGHUSER_MOVABLE|GFP_COLD)
[  122.515041] systemd-journal cpuset=/ mems_allowed=0
(...snipped...)
[  122.697515] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  122.699492] [ 9551]  1000  9551       40        1       3       2        0             0 write
[  122.701399] [ 9552]  1000  9552       40        1       3       2        0             0 write
[  122.703282] [ 9553]  1000  9553       40        1       3       2        0             0 write
[  122.705188] [ 9554]  1000  9554       40        1       3       2        0             0 write
[  122.707017] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  122.708842] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  122.710675] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  122.712475] Killed process 9551 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
[  139.606508] sysrq: SysRq : Manual OOM execution
[  139.612371] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
[  139.620210] kworker/0:2 cpuset=/ mems_allowed=0
(...snipped...)
[  139.795759] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  139.797649] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  139.799526] [ 9552]  1000  9552       40        1       3       2        0             0 write
[  139.801368] [ 9553]  1000  9553       40        1       3       2        0             0 write
[  139.803249] [ 9554]  1000  9554       40        1       3       2        0             0 write
[  139.805020] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  139.806799] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  139.808524] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  139.810216] Killed process 9552 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
(...snipped...)
[  142.571815] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  142.573840] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  142.575754] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  142.577633] [ 9553]  1000  9553       40        1       3       2        0             0 write
[  142.579433] [ 9554]  1000  9554       40        1       3       2        0             0 write
[  142.581250] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  142.583003] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  142.585055] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  142.586796] Killed process 9553 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
[  143.599058] sysrq: SysRq : Manual OOM execution
[  143.604300] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
(...snipped...)
[  143.783739] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  143.785691] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  143.787532] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  143.789377] [ 9553]  1000  9553       40        0       3       2        0             0 write
[  143.791172] [ 9554]  1000  9554       40        1       3       2        0             0 write
[  143.792985] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  143.794730] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  143.796723] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  143.798338] Killed process 9554 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
[  144.374525] sysrq: SysRq : Manual OOM execution
[  144.379779] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
(...snipped...)
[  144.560718] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  144.562657] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  144.564560] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  144.566369] [ 9553]  1000  9553       40        0       3       2        0             0 write
[  144.568246] [ 9554]  1000  9554       40        0       3       2        0             0 write
[  144.570001] [ 9555]  1000  9555       40        1       3       2        0             0 write
[  144.571794] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  144.573502] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  144.575119] Killed process 9555 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
[  145.158485] sysrq: SysRq : Manual OOM execution
[  145.163600] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
(...snipped...)
[  145.346059] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  145.348012] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  145.349954] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  145.351817] [ 9553]  1000  9553       40        0       3       2        0             0 write
[  145.353701] [ 9554]  1000  9554       40        0       3       2        0             0 write
[  145.355568] [ 9555]  1000  9555       40        0       3       2        0             0 write
[  145.357319] [ 9556]  1000  9556       40        1       3       2        0             0 write
[  145.359114] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  145.360733] Killed process 9556 (write) total-vm:160kB, anon-rss:4kB, file-rss:0kB, shmem-rss:0kB
[  169.158408] sysrq: SysRq : Manual OOM execution
[  169.163612] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
(...snipped...)
[  169.343115] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  169.345053] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  169.346884] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  169.348965] [ 9553]  1000  9553       40        0       3       2        0             0 write
[  169.350893] [ 9554]  1000  9554       40        0       3       2        0             0 write
[  169.352713] [ 9555]  1000  9555       40        0       3       2        0             0 write
[  169.354551] [ 9556]  1000  9556       40        0       3       2        0             0 write
[  169.356450] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  169.358105] Killed process 9551 (write) total-vm:160kB, anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[  178.950315] sysrq: SysRq : Manual OOM execution
[  178.955560] kworker/0:2 invoked oom-killer: order=-1, oom_score_adj=0, gfp_mask=0x24000c0(GFP_KERNEL)
(...snipped...)
[  179.140752] [ 9546]  1000  9546   541716   458687     906       6        0             0 oom-write
[  179.142653] [ 9551]  1000  9551       40        0       3       2        0             0 write
[  179.144997] [ 9552]  1000  9552       40        0       3       2        0             0 write
[  179.146849] [ 9553]  1000  9553       40        0       3       2        0             0 write
[  179.148654] [ 9554]  1000  9554       40        0       3       2        0             0 write
[  179.150411] [ 9555]  1000  9555       40        0       3       2        0             0 write
[  179.152291] [ 9556]  1000  9556       40        0       3       2        0             0 write
[  179.154002] Out of memory: Kill process 9546 (oom-write) score 902 or sacrifice child
[  179.155666] Killed process 9551 (write) total-vm:160kB, anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
----------

Signed-off-by: Tetsuo Handa <penguin-kernel@...ove.SAKURA.ne.jp>
---
 mm/oom_kill.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 4b0a5d8..a1a0f39 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -111,6 +111,18 @@ struct task_struct *find_lock_task_mm(struct task_struct *p)
 
 	rcu_read_lock();
 
+	/*
+	 * Treat the whole process p as unkillable when one of subthreads has
+	 * TIF_MEMDIE pending. Otherwise, we may end up setting TIF_MEMDIE on
+	 * the same victim forever (e.g. making SysRq-f unusable).
+	 */
+	for_each_thread(p, t) {
+		if (likely(!test_tsk_thread_flag(t, TIF_MEMDIE)))
+			continue;
+		t = NULL;
+		goto found;
+	}
+
 	for_each_thread(p, t) {
 		task_lock(t);
 		if (likely(t->mm))
-- 
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ