From: ebiederm@xmission.com (Eric W. Biederman)
To: Oleg Nesterov <oleg@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>,
Suren Baghdasaryan <surenb@google.com>,
christian.brauner@ubuntu.com, mingo@kernel.org,
peterz@infradead.org, tglx@linutronix.de, esyr@redhat.com,
christian@kellner.me, areber@redhat.com, shakeelb@google.com,
cyphar@cyphar.com, adobriyan@gmail.com,
akpm@linux-foundation.org, gladkov.alexey@gmail.com,
walken@google.com, daniel.m.jordan@oracle.com,
avagin@gmail.com, bernd.edlinger@hotmail.de,
john.johansen@canonical.com, laoar.shao@gmail.com,
timmurray@google.com, minchan@kernel.org,
kernel-team@android.com, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH 1/1] mm, oom_adj: don't loop through tasks in __set_oom_adj when not necessary
Date: Thu, 20 Aug 2020 09:43:18 -0500 [thread overview]
Message-ID: <87364hwf7d.fsf@x220.int.ebiederm.org> (raw)
In-Reply-To: <20200820140451.GC4546@redhat.com> (Oleg Nesterov's message of "Thu, 20 Aug 2020 16:04:52 +0200")
Oleg Nesterov <oleg@redhat.com> writes:
> On 08/20, Eric W. Biederman wrote:
>>
>> --- a/fs/exec.c
>> +++ b/fs/exec.c
>> @@ -1139,6 +1139,10 @@ static int exec_mmap(struct mm_struct *mm)
>> vmacache_flush(tsk);
>> task_unlock(tsk);
>> if (old_mm) {
>> + mm->oom_score_adj = old_mm->oom_score_adj;
>> + mm->oom_score_adj_min = old_mm->oom_score_adj_min;
>> + if (tsk->vfork_done)
>> + mm->oom_score_adj = tsk->vfork_oom_score_adj;
>
> too late, ->vfork_done is NULL after mm_release().
Good point.
> And this can race with __set_oom_adj(). Yes, the current code is racy too,
> but this change adds another race, __set_oom_adj() could already observe
> ->mm != NULL and update mm->oom_score_adj.
I am not certain about races but we should be able to do something like:
in exec_mmap:
if (old_mm) {
mm->oom_score_adj = old_mm->oom_score_adj;
mm->oom_score_adj_min = old_mm->oom_score_adj_min;
if (tsk->signal->vfork_oom_score_adj_set) {
mm->oom_score_adj = tsk->vfork_oom_score_adj;
tsk->signal->vfork_oom_score_adj_set = false;
}
}
in __set_oom_adj:
if (mm) {
mm->oom_score_adj = oom_adj;
tsk->signal->vfork_oom_score_adj_set = false;
} else {
tsk->vfork_score_adj = old_mm->oom_score_adj;
tsk->signal->vfork_oom_score_adj_set = true;
}
There might even be a special oom_score_adj value we can use instead of
a separate flag. I am just not familiar enough with oom_score_adj to know.
We should be able to do something like that where we know the value is
set and only use it if so. And a subsequent _set_oom_adj without
observing vfork_done set will clear the value in signal_struct.
We have to be a bit careful to get the details right but it should be
straight forward.
Michal also has a point about oom_score_adj_min, and I really don't
understand the oom logic value well enough to guess how that should
work.
Although to deal with some of the races it probably only makes sense
to call complete_vfork_done in exec after the new mm has been installed,
and while exec_update_mutex is held. I don't think anyone every
anticipated using vfork_done as a flag.
Eric
next prev parent reply other threads:[~2020-08-20 14:47 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-20 0:20 Suren Baghdasaryan
2020-08-20 5:56 ` Michal Hocko
2020-08-20 8:46 ` Christian Brauner
2020-08-20 9:09 ` Michal Hocko
2020-08-20 10:32 ` Christian Brauner
2020-08-20 11:14 ` Michal Hocko
2020-08-20 10:55 ` Oleg Nesterov
2020-08-20 11:13 ` Michal Hocko
2020-08-20 11:29 ` Michal Hocko
2020-08-20 11:41 ` Oleg Nesterov
2020-08-20 11:47 ` Christian Brauner
2020-08-20 11:30 ` Christian Brauner
2020-08-20 11:42 ` Michal Hocko
2020-08-20 12:41 ` Michal Hocko
2020-08-20 13:43 ` Christian Brauner
2020-08-20 12:34 ` Eric W. Biederman
2020-08-20 12:42 ` Michal Hocko
2020-08-20 12:45 ` Eric W. Biederman
2020-08-20 12:54 ` Eric W. Biederman
2020-08-20 13:26 ` Michal Hocko
2020-08-20 13:34 ` Christian Brauner
[not found] ` <dcb62b67-5ad6-f63a-a909-e2fa70b240fc@i-love.sakura.ne.jp>
2020-08-20 14:00 ` Christian Brauner
2020-08-20 14:15 ` Michal Hocko
[not found] ` <42d5645e-0364-c8cd-01dc-93a9aaff5b09@i-love.sakura.ne.jp>
2020-08-20 14:34 ` Michal Hocko
[not found] ` <637ab0e7-e686-0c94-753b-b97d24bb8232@i-love.sakura.ne.jp>
2020-08-20 14:49 ` Eric W. Biederman
2020-08-20 15:06 ` Christian Brauner
2020-08-20 15:56 ` Suren Baghdasaryan
2020-08-20 16:26 ` Michal Hocko
2020-08-20 16:29 ` Christian Brauner
2020-08-20 16:47 ` Suren Baghdasaryan
2020-08-21 4:39 ` Eric W. Biederman
2020-08-21 7:17 ` Michal Hocko
2020-08-21 11:15 ` Oleg Nesterov
2020-08-21 15:28 ` Suren Baghdasaryan
2020-08-21 16:06 ` Suren Baghdasaryan
2020-08-21 16:37 ` Oleg Nesterov
2020-08-21 17:22 ` Suren Baghdasaryan
2020-08-21 16:33 ` Oleg Nesterov
2020-08-21 17:59 ` Oleg Nesterov
2020-08-21 18:53 ` Suren Baghdasaryan
2020-08-24 20:03 ` Suren Baghdasaryan
2020-08-20 13:41 ` Eric W. Biederman
2020-08-20 14:04 ` Oleg Nesterov
2020-08-20 14:36 ` Oleg Nesterov
2020-08-20 15:06 ` Eric W. Biederman
2020-08-20 14:43 ` Eric W. Biederman [this message]
2020-08-20 14:12 ` Michal Hocko
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=87364hwf7d.fsf@x220.int.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=adobriyan@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=areber@redhat.com \
--cc=avagin@gmail.com \
--cc=bernd.edlinger@hotmail.de \
--cc=christian.brauner@ubuntu.com \
--cc=christian@kellner.me \
--cc=cyphar@cyphar.com \
--cc=daniel.m.jordan@oracle.com \
--cc=esyr@redhat.com \
--cc=gladkov.alexey@gmail.com \
--cc=john.johansen@canonical.com \
--cc=kernel-team@android.com \
--cc=laoar.shao@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=minchan@kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=shakeelb@google.com \
--cc=surenb@google.com \
--cc=tglx@linutronix.de \
--cc=timmurray@google.com \
--cc=walken@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox