From: Oleg Nesterov <oleg@redhat.com>
To: David Rientjes <rientjes@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Rik van Riel <riel@redhat.com>,
linux-mm@kvack.org
Subject: Re: [patch 1/2] oom: avoid killing a task if a thread sharing its mm cannot be killed
Date: Sun, 15 Aug 2010 17:18:19 +0200 [thread overview]
Message-ID: <20100815151819.GA3531@redhat.com> (raw)
In-Reply-To: <alpine.DEB.2.00.1008142128050.31510@chino.kir.corp.google.com>
Well. I shouldn't try to comment this patch because I do not know
the state of the current code (and I do not understand the changelog).
Still, it looks a bit strange to me.
On 08/14, David Rientjes wrote:
>
> + * Determines whether an mm is unfreeable since a user thread attached to
> + * it cannot be killed. Kthreads only temporarily assume a thread's mm,
> + * so they are not considered.
> + *
> + * mm need not be protected by task_lock() since it will not be
> + * dereferened.
> + */
> +static bool is_mm_unfreeable(struct mm_struct *mm)
> +{
> + struct task_struct *g, *q;
> +
> + do_each_thread(g, q) {
> + if (q->mm == mm && !(q->flags & PF_KTHREAD) &&
> + q->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
> + return true;
> + } while_each_thread(g, q);
do_each_thread() doesn't look good. All sub-threads have the same ->mm.
for_each_process(p) {
if (p->flags && PF_KTHREAD)
continue;
do {
if (!t->mm)
continue;
if (t->mm != mm)
break;
if (t->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
return true;
} while_each_thread(p, t);
}
return false;
However, even if is_mm_unfreeable() uses for_each_process(),
> @@ -160,12 +181,7 @@ unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem,
> p = find_lock_task_mm(p);
> if (!p)
> return 0;
> -
> - /*
> - * Shortcut check for OOM_SCORE_ADJ_MIN so the entire heuristic doesn't
> - * need to be executed for something that cannot be killed.
> - */
> - if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) {
> + if (is_mm_unfreeable(p->mm)) {
oom_badness() becomes O(n**2), not good.
And, more importantly. This patch makes me think ->oom_score_adj should
be moved from ->signal to ->mm.
Oleg.
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-08-15 15:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-15 4:30 [patch 1/2] oom: avoid killing a task if a thread sharing its mm cannot be killed David Rientjes
2010-08-15 4:31 ` [patch 2/2] oom: kill all threads sharing oom killed task's mm David Rientjes
2010-08-15 15:45 ` Oleg Nesterov
2010-08-15 21:28 ` David Rientjes
2010-08-16 6:00 ` Oleg Nesterov
2010-08-15 15:18 ` Oleg Nesterov [this message]
2010-08-15 21:23 ` [patch 1/2] oom: avoid killing a task if a thread sharing its mm cannot be killed David Rientjes
2010-08-16 5:52 ` Oleg Nesterov
2010-08-16 10:56 ` David Rientjes
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=20100815151819.GA3531@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-mm@kvack.org \
--cc=riel@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: link
Be 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.