From: Michal Hocko <mhocko@suse.cz>
To: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: linux-mm@kvack.org, akpm@linux-foundation.org, oleg@redhat.com,
rientjes@google.com, vdavydov@parallels.com, mst@redhat.com
Subject: Re: [PATCH 3/8] mm,oom: Use list of mm_struct used by OOM victims.
Date: Thu, 7 Jul 2016 13:31:30 +0200 [thread overview]
Message-ID: <20160707113130.GI5379@dhcp22.suse.cz> (raw)
In-Reply-To: <201607031138.AHB35971.FLVQOtJFOMFHSO@I-love.SAKURA.ne.jp>
I've got lost in the follow up patches. Could you post only rework of
this particular one, please?
You have already noticed that nodemask check is tricky and the memcg
check would be tricky for different reason.
On Sun 03-07-16 11:38:20, Tetsuo Handa wrote:
[...]
> +bool oom_has_pending_mm(struct mem_cgroup *memcg, const nodemask_t *nodemask)
> +{
> + struct oom_mm *mm;
> + bool ret = false;
> +
> + spin_lock(&oom_mm_lock);
> + list_for_each_entry(mm, &oom_mm_list, list) {
> + if (memcg && mm->memcg != memcg)
> + continue;
> + if (nodemask && mm->nodemask != nodemask)
> + continue;
> + ret = true;
> + break;
> + }
> + spin_unlock(&oom_mm_lock);
> + return ret;
> +}
> +
> enum oom_scan_t oom_scan_process_thread(struct oom_control *oc,
> struct task_struct *task)
> {
[...]
> @@ -647,18 +668,37 @@ subsys_initcall(oom_init)
> /**
> * mark_oom_victim - mark the given task as OOM victim
> * @tsk: task to mark
> + * @oc: oom_control
> *
> * Has to be called with oom_lock held and never after
> * oom has been disabled already.
> */
> -void mark_oom_victim(struct task_struct *tsk)
> +void mark_oom_victim(struct task_struct *tsk, struct oom_control *oc)
> {
> + struct mm_struct *mm = tsk->mm;
> +
> WARN_ON(oom_killer_disabled);
> /* OOM killer might race with memcg OOM */
> if (test_and_set_tsk_thread_flag(tsk, TIF_MEMDIE))
> return;
> atomic_inc(&tsk->signal->oom_victims);
> /*
> + * Since mark_oom_victim() is called from multiple threads,
> + * connect this mm to oom_mm_list only if not yet connected.
> + *
> + * Since mark_oom_victim() is called with a stable mm (i.e.
> + * mm->mm_userst > 0), exit_oom_mm() from __mmput() can't be called
> + * before we add this mm to the list.
> + */
> + spin_lock(&oom_mm_lock);
> + if (!mm->oom_mm.list.next) {
> + atomic_inc(&mm->mm_count);
> + mm->oom_mm.memcg = oc->memcg;
> + mm->oom_mm.nodemask = oc->nodemask;
> + list_add_tail(&mm->oom_mm.list, &oom_mm_list);
> + }
Here you are storing the memcg where the OOM killer happened but later
on we might encounter an OOM on upper level of the memcg hierarchy and
we want to prevent from the oom killer if there is an mm which hasn't
released a memory from the lower level of the hierarchy. E.g.
A
/ \
B C
C hits a limit and invokes oom. Then we hit oom on A because of a charge
for B. Now for_each_mem_cgroup_tree would encounter such a task/mm and
abort the selection. With a pure memcg pointer check we would skip that
mm. This would be fixable by doing mem_cgroup_is_descendant but that
requires an alive memcg's css so you have to pin it.
--
Michal Hocko
SUSE Labs
--
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:[~2016-07-07 11:31 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-03 2:35 [PATCH 0/8] Change OOM killer to use list of mm_struct Tetsuo Handa
2016-07-03 2:36 ` [PATCH 1/8] mm,oom_reaper: Remove pointless kthread_run() failure check Tetsuo Handa
2016-07-03 12:42 ` Oleg Nesterov
2016-07-03 16:03 ` Tetsuo Handa
2016-07-03 17:10 ` Oleg Nesterov
2016-07-03 21:53 ` Tetsuo Handa
2016-07-04 11:13 ` Oleg Nesterov
2016-07-07 11:14 ` Michal Hocko
2016-07-03 2:37 ` [PATCH 2/8] mm,oom_reaper: Reduce find_lock_task_mm() usage Tetsuo Handa
2016-07-07 11:19 ` Michal Hocko
2016-07-03 2:38 ` [PATCH 3/8] mm,oom: Use list of mm_struct used by OOM victims Tetsuo Handa
2016-07-04 10:39 ` Oleg Nesterov
2016-07-04 12:50 ` Tetsuo Handa
2016-07-04 18:25 ` Oleg Nesterov
2016-07-05 10:43 ` Tetsuo Handa
2016-07-05 20:52 ` Oleg Nesterov
2016-07-06 8:53 ` Oleg Nesterov
2016-07-06 11:43 ` Tetsuo Handa
2016-07-07 11:31 ` Michal Hocko [this message]
2016-07-03 2:39 ` [PATCH 4/8] mm,oom: Remove OOM_SCAN_ABORT case Tetsuo Handa
2016-07-03 2:40 ` [PATCH 5/8] mm,oom: Remove unused signal_struct->oom_victims Tetsuo Handa
2016-07-07 14:03 ` Michal Hocko
2016-07-03 2:40 ` [PATCH 6/8] mm,oom_reaper: Stop clearing TIF_MEMDIE on remote thread Tetsuo Handa
2016-07-07 14:06 ` Michal Hocko
2016-07-07 16:10 ` Tetsuo Handa
2016-07-07 16:54 ` Michal Hocko
2016-07-03 2:41 ` [PATCH 7/8] mm,oom_reaper: Pass OOM victim's comm and pid values via mm_struct Tetsuo Handa
2016-07-03 2:41 ` [PATCH 8/8] mm,oom_reaper: Make OOM reaper use list of mm_struct Tetsuo Handa
2016-07-04 10:40 ` Oleg Nesterov
2016-07-07 14:15 ` Michal Hocko
2016-07-07 11:04 ` [PATCH 0/8] Change OOM killer to " Michal Hocko
-- strict thread matches above, loose matches on Subject: below --
2016-07-12 13:29 [PATCH v3 " Tetsuo Handa
2016-07-12 13:29 ` [PATCH 3/8] mm,oom: Use list of mm_struct used by OOM victims Tetsuo Handa
2016-07-12 14:28 ` 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=20160707113130.GI5379@dhcp22.suse.cz \
--to=mhocko@suse.cz \
--cc=akpm@linux-foundation.org \
--cc=linux-mm@kvack.org \
--cc=mst@redhat.com \
--cc=oleg@redhat.com \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
--cc=rientjes@google.com \
--cc=vdavydov@parallels.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;
as well as URLs for NNTP newsgroup(s).