All of lore.kernel.org
 help / color / mirror / Atom feed
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: Mon, 16 Aug 2010 07:52:04 +0200	[thread overview]
Message-ID: <20100816055204.GA9498@redhat.com> (raw)
In-Reply-To: <alpine.DEB.2.00.1008151409020.8727@chino.kir.corp.google.com>

On 08/15, David Rientjes wrote:
>
> On Sun, 15 Aug 2010, Oleg Nesterov wrote:
>
> > 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.
> >
>
> You snipped the changelog, so it's unclear what you don't understand about
> it.  The goal is to detect if a task A shares its mm with any other thread
> that cannot be oom killed; if so, we can't free task A's memory when it
> exits.  It's then pointless to kill task A in the first place since it
> will not solve the oom issue.

Yes, this part is clear.

> > > +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.
> >
>
> There's no other way to detect threads in other thread groups that share
> the same mm since subthreads of a process can have an oom_score_adj that
> differ from that process, this includes the possibility of
> OOM_SCORE_ADJ_MIN that we're interested in here.

Yes, you are right. Still, at least you can do

	for_each_process(p) {
		if (p->mm != mm)
			continue;
		...

to quickly skip the thread group which doesn't share the same ->mm.

> > > -	if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) {
> > > +	if (is_mm_unfreeable(p->mm)) {
> >
> > oom_badness() becomes O(n**2), not good.
> >
>
> No, oom_badness() becomes O(n) from O(1); select_bad_process() becomes
> slower for eligible tasks.

I meant, select_bad_process() becomes O(n^2). oom_badness() is O(n), yes.

> It would be possible to defer this check to oom_kill_process() if
> additional logic were added to its callers to retry if it fails:
>
> [...snip...]
>
> What do you think?

Sorry David, I think nothing ;) Please ignore me, I have no time at all.

> > And, more importantly. This patch makes me think ->oom_score_adj should
> > be moved from ->signal to ->mm.
> >
>
> I did that several months ago but people were unhappy with how a parent's
> oom_score_adj value would change if it did a vfork() and the child's
> oom_score_adj value was changed prior to execve().

I see. But this patch in essence moves OOM_SCORE_ADJ_MIN from ->signal
to ->mm (and btw personally I think this makes sense).

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>

  reply	other threads:[~2010-08-16  5:54 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 ` [patch 1/2] oom: avoid killing a task if a thread sharing its mm cannot be killed Oleg Nesterov
2010-08-15 21:23   ` David Rientjes
2010-08-16  5:52     ` Oleg Nesterov [this message]
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=20100816055204.GA9498@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.