From: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> To: kosaki.motohiro@jp.fujitsu.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, caiqian@redhat.com, rientjes@google.com, hughd@google.com, kamezawa.hiroyu@jp.fujitsu.com, minchan.kim@gmail.com, oleg@redhat.com Subject: [PATCH 2/5] oom: kill younger process first Date: Fri, 20 May 2011 17:02:15 +0900 [thread overview] Message-ID: <4DD62007.6020600@jp.fujitsu.com> (raw) In-Reply-To: <4DD61F80.1020505@jp.fujitsu.com> This patch introduces do_each_thread_reverse() and select_bad_process() uses it. The benefits are two, 1) oom-killer can kill younger process than older if they have a same oom score. Usually younger process is less important. 2) younger task often have PF_EXITING because shell script makes a lot of short lived processes. Reverse order search can detect it faster. Reported-by: CAI Qian <caiqian@redhat.com> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: David Rientjes <rientjes@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> --- include/linux/sched.h | 11 +++++++++++ mm/oom_kill.c | 2 +- 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 013314a..3698379 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2194,6 +2194,9 @@ static inline unsigned long wait_task_inactive(struct task_struct *p, #define next_task(p) \ list_entry_rcu((p)->tasks.next, struct task_struct, tasks) +#define prev_task(p) \ + list_entry((p)->tasks.prev, struct task_struct, tasks) + #define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; ) @@ -2206,6 +2209,14 @@ extern bool current_is_single_threaded(void); #define do_each_thread(g, t) \ for (g = t = &init_task ; (g = t = next_task(g)) != &init_task ; ) do +/* + * Similar to do_each_thread(). but two difference are there. + * - traverse tasks reverse order (i.e. younger to older) + * - caller must hold tasklist_lock. rcu_read_lock isn't enough +*/ +#define do_each_thread_reverse(g, t) \ + for (g = t = &init_task ; (g = t = prev_task(g)) != &init_task ; ) do + #define while_each_thread(g, t) \ while ((t = next_thread(t)) != g) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 43d32ae..e6a6c6f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -282,7 +282,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, struct task_struct *chosen = NULL; *ppoints = 0; - do_each_thread(g, p) { + do_each_thread_reverse(g, p) { unsigned int points; if (!p->mm) -- 1.7.3.1
WARNING: multiple messages have this Message-ID (diff)
From: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> To: kosaki.motohiro@jp.fujitsu.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, caiqian@redhat.com, rientjes@google.com, hughd@google.com, kamezawa.hiroyu@jp.fujitsu.com, minchan.kim@gmail.com, oleg@redhat.com Subject: [PATCH 2/5] oom: kill younger process first Date: Fri, 20 May 2011 17:02:15 +0900 [thread overview] Message-ID: <4DD62007.6020600@jp.fujitsu.com> (raw) In-Reply-To: <4DD61F80.1020505@jp.fujitsu.com> This patch introduces do_each_thread_reverse() and select_bad_process() uses it. The benefits are two, 1) oom-killer can kill younger process than older if they have a same oom score. Usually younger process is less important. 2) younger task often have PF_EXITING because shell script makes a lot of short lived processes. Reverse order search can detect it faster. Reported-by: CAI Qian <caiqian@redhat.com> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: David Rientjes <rientjes@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> --- include/linux/sched.h | 11 +++++++++++ mm/oom_kill.c | 2 +- 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 013314a..3698379 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2194,6 +2194,9 @@ static inline unsigned long wait_task_inactive(struct task_struct *p, #define next_task(p) \ list_entry_rcu((p)->tasks.next, struct task_struct, tasks) +#define prev_task(p) \ + list_entry((p)->tasks.prev, struct task_struct, tasks) + #define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; ) @@ -2206,6 +2209,14 @@ extern bool current_is_single_threaded(void); #define do_each_thread(g, t) \ for (g = t = &init_task ; (g = t = next_task(g)) != &init_task ; ) do +/* + * Similar to do_each_thread(). but two difference are there. + * - traverse tasks reverse order (i.e. younger to older) + * - caller must hold tasklist_lock. rcu_read_lock isn't enough +*/ +#define do_each_thread_reverse(g, t) \ + for (g = t = &init_task ; (g = t = prev_task(g)) != &init_task ; ) do + #define while_each_thread(g, t) \ while ((t = next_thread(t)) != g) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 43d32ae..e6a6c6f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -282,7 +282,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, struct task_struct *chosen = NULL; *ppoints = 0; - do_each_thread(g, p) { + do_each_thread_reverse(g, p) { unsigned int points; if (!p->mm) -- 1.7.3.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2011-05-20 8:02 UTC|newest] Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-05-20 8:00 [PATCH v2 0/5] Fix oom killer doesn't work at all if system have > gigabytes memory (aka CAI founded issue) KOSAKI Motohiro 2011-05-20 8:00 ` KOSAKI Motohiro 2011-05-20 8:01 ` [PATCH 1/5] oom: improve dump_tasks() show items KOSAKI Motohiro 2011-05-20 8:01 ` KOSAKI Motohiro 2011-05-23 22:16 ` David Rientjes 2011-05-23 22:16 ` David Rientjes 2011-05-20 8:02 ` KOSAKI Motohiro [this message] 2011-05-20 8:02 ` [PATCH 2/5] oom: kill younger process first KOSAKI Motohiro 2011-05-23 2:37 ` Minchan Kim 2011-05-23 2:37 ` Minchan Kim 2011-05-23 22:20 ` David Rientjes 2011-05-23 22:20 ` David Rientjes 2011-05-20 8:03 ` [PATCH 3/5] oom: oom-killer don't use proportion of system-ram internally KOSAKI Motohiro 2011-05-20 8:03 ` KOSAKI Motohiro 2011-05-23 3:59 ` Minchan Kim 2011-05-23 3:59 ` Minchan Kim 2011-05-24 1:14 ` KOSAKI Motohiro 2011-05-24 1:14 ` KOSAKI Motohiro 2011-05-24 1:32 ` Minchan Kim 2011-05-24 1:32 ` Minchan Kim 2011-05-23 4:02 ` Minchan Kim 2011-05-23 4:02 ` Minchan Kim 2011-05-24 1:44 ` KOSAKI Motohiro 2011-05-24 1:44 ` KOSAKI Motohiro 2011-05-24 3:11 ` KOSAKI Motohiro 2011-05-24 3:11 ` KOSAKI Motohiro 2011-05-23 22:28 ` David Rientjes 2011-05-23 22:28 ` David Rientjes 2011-05-23 22:48 ` David Rientjes 2011-05-23 22:48 ` David Rientjes 2011-05-24 1:21 ` KOSAKI Motohiro 2011-05-24 1:21 ` KOSAKI Motohiro 2011-05-24 8:32 ` CAI Qian 2011-05-24 8:32 ` CAI Qian 2011-05-26 7:08 ` CAI Qian 2011-05-26 7:08 ` CAI Qian 2011-05-27 19:12 ` David Rientjes 2011-05-27 19:12 ` David Rientjes 2011-05-24 2:07 ` KOSAKI Motohiro 2011-05-24 2:07 ` KOSAKI Motohiro 2011-05-26 9:34 ` CAI Qian 2011-05-26 9:34 ` CAI Qian 2011-05-26 9:56 ` KOSAKI Motohiro 2011-05-26 9:56 ` KOSAKI Motohiro 2011-05-20 8:04 ` [PATCH 4/5] oom: don't kill random process KOSAKI Motohiro 2011-05-20 8:04 ` KOSAKI Motohiro 2011-05-23 4:31 ` Minchan Kim 2011-05-23 4:31 ` Minchan Kim 2011-05-24 1:53 ` KOSAKI Motohiro 2011-05-24 1:53 ` KOSAKI Motohiro 2011-05-24 8:46 ` Minchan Kim 2011-05-24 8:46 ` Minchan Kim 2011-05-24 8:49 ` KOSAKI Motohiro 2011-05-24 8:49 ` KOSAKI Motohiro 2011-05-24 9:04 ` Minchan Kim 2011-05-24 9:04 ` Minchan Kim 2011-05-24 9:09 ` KOSAKI Motohiro 2011-05-24 9:09 ` KOSAKI Motohiro 2011-05-24 9:20 ` Minchan Kim 2011-05-24 9:20 ` Minchan Kim 2011-05-24 9:38 ` KOSAKI Motohiro 2011-05-24 9:38 ` KOSAKI Motohiro 2011-05-23 22:32 ` David Rientjes 2011-05-23 22:32 ` David Rientjes 2011-05-24 1:35 ` KOSAKI Motohiro 2011-05-24 1:35 ` KOSAKI Motohiro 2011-05-24 1:39 ` David Rientjes 2011-05-24 1:39 ` David Rientjes 2011-05-24 1:55 ` KOSAKI Motohiro 2011-05-24 1:55 ` KOSAKI Motohiro 2011-05-24 1:58 ` David Rientjes 2011-05-24 1:58 ` David Rientjes 2011-05-24 2:03 ` KOSAKI Motohiro 2011-05-24 2:03 ` KOSAKI Motohiro 2011-05-25 23:50 ` David Rientjes 2011-05-25 23:50 ` David Rientjes 2011-05-30 1:17 ` KOSAKI Motohiro 2011-05-30 1:17 ` KOSAKI Motohiro 2011-05-31 4:48 ` David Rientjes 2011-05-31 4:48 ` David Rientjes 2011-05-31 4:54 ` KOSAKI Motohiro 2011-05-31 4:54 ` KOSAKI Motohiro 2011-05-20 8:05 ` [PATCH 5/5] oom: merge oom_kill_process() with oom_kill_task() KOSAKI Motohiro 2011-05-20 8:05 ` KOSAKI Motohiro 2011-05-31 1:33 ` [PATCH v2 0/5] Fix oom killer doesn't work at all if system have > gigabytes memory (aka CAI founded issue) CAI Qian 2011-05-31 1:33 ` CAI Qian 2011-05-31 4:10 ` KOSAKI Motohiro 2011-05-31 4:10 ` KOSAKI Motohiro 2011-05-31 4:14 ` CAI Qian 2011-05-31 4:14 ` CAI Qian 2011-05-31 4:34 ` KOSAKI Motohiro 2011-05-31 4:34 ` KOSAKI Motohiro 2011-05-31 4:49 ` KOSAKI Motohiro 2011-05-31 4:49 ` KOSAKI Motohiro 2011-05-31 4:32 ` KOSAKI Motohiro 2011-05-31 4:32 ` KOSAKI Motohiro 2011-05-31 4:52 ` CAI Qian 2011-05-31 4:52 ` CAI Qian 2011-05-31 7:04 ` KOSAKI Motohiro 2011-05-31 7:04 ` KOSAKI Motohiro 2011-05-31 7:50 ` CAI Qian 2011-05-31 7:50 ` CAI Qian 2011-05-31 7:56 ` KOSAKI Motohiro 2011-05-31 7:56 ` KOSAKI Motohiro 2011-05-31 7:59 ` CAI Qian 2011-05-31 7:59 ` CAI Qian 2011-05-31 8:11 ` KOSAKI Motohiro 2011-05-31 8:11 ` KOSAKI Motohiro 2011-05-31 10:01 ` KOSAKI Motohiro 2011-05-31 10:01 ` KOSAKI Motohiro 2011-06-01 1:17 ` CAI Qian 2011-06-01 1:17 ` CAI Qian 2011-06-01 3:32 ` Minchan Kim 2011-06-01 3:32 ` Minchan Kim 2011-06-06 3:07 ` KOSAKI Motohiro 2011-06-06 3:07 ` KOSAKI Motohiro 2011-06-06 14:44 ` Minchan Kim 2011-06-06 14:44 ` Minchan Kim
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=4DD62007.6020600@jp.fujitsu.com \ --to=kosaki.motohiro@jp.fujitsu.com \ --cc=akpm@linux-foundation.org \ --cc=caiqian@redhat.com \ --cc=hughd@google.com \ --cc=kamezawa.hiroyu@jp.fujitsu.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=minchan.kim@gmail.com \ --cc=oleg@redhat.com \ --cc=rientjes@google.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.