Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1235152 > unrolled thread
| Started by | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| First post | 2015-09-29 16:30 +0200 |
| Last post | 2015-09-30 20:30 +0200 |
| Articles | 10 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH -mm 0/3] mm/oom_kill: ensure we actually kill all tasks sharing the same mm Oleg Nesterov <oleg@redhat.com> - 2015-09-29 16:30 +0200
[PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in Oleg Nesterov <oleg@redhat.com> - 2015-09-29 16:30 +0200
Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in David Rientjes <rientjes@google.com> - 2015-09-30 00:50 +0200
Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in Oleg Nesterov <oleg@redhat.com> - 2015-09-30 16:00 +0200
Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> - 2015-09-30 04:20 +0200
Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in Oleg Nesterov <oleg@redhat.com> - 2015-09-30 16:10 +0200
[PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" Oleg Nesterov <oleg@redhat.com> - 2015-09-29 16:30 +0200
Re: [PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" David Rientjes <rientjes@google.com> - 2015-09-30 00:40 +0200
Re: [PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" Oleg Nesterov <oleg@redhat.com> - 2015-09-30 16:00 +0200
[PATCH -mm v2 0/3] mm/oom_kill: ensure we actually kill all tasks sharing the same mm Oleg Nesterov <oleg@redhat.com> - 2015-09-30 20:30 +0200
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-29 16:30 +0200 |
| Subject | [PATCH -mm 0/3] mm/oom_kill: ensure we actually kill all tasks sharing the same mm |
| Message-ID | <qe44N-D4-3@gated-at.bofh.it> |
Michal, Tetsuo, David, sorry for delay. I'll try to read and answer your emails in "can't oom-kill zap the victim's memory" thread later. Let me send some initial changes which imo makes sense regardless, but if we want to zap the victim's memory we need to ensure that all tasks which share this ->mm were actually killed (see 3/3). Please review, this series is simple but only compile tested. Andrew, this is on top of linux-mmotm.git + the recent mm-oom-remove- task_lock-protecting-comm-printing.patch from David. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-29 16:30 +0200 |
| Subject | [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in |
| Message-ID | <qe44N-D4-5@gated-at.bofh.it> |
| In reply to | #1235152 |
Both "child->mm == mm" and "p->mm != mm" checks in oom_kill_process()
are wrong. ->mm can be if task is the exited group leader. This means
in particular that "kill sharing same memory" loop can miss a process
with a zombie leader which uses the same ->mm.
Note: the process_has_mm(child, p->mm) check is still not 100% correct,
p->mm can be NULL too. This is minor, but probably deserves a fix or a
comment anyway.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
mm/oom_kill.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 8e7bed2..8ecac2ef 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -483,6 +483,17 @@ void oom_killer_enable(void)
oom_killer_disabled = false;
}
+static bool process_has_mm(struct task_struct *p, struct mm_struct *mm)
+{
+ struct task_struct *t;
+
+ for_each_thread(p, t)
+ if (t->mm)
+ return t->mm == mm;
+
+ return false;
+}
+
#define K(x) ((x) << (PAGE_SHIFT-10))
/*
* Must be called while holding a reference to p, which will be released upon
@@ -530,7 +541,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
list_for_each_entry(child, &t->children, sibling) {
unsigned int child_points;
- if (child->mm == p->mm)
+ if (process_has_mm(child, p->mm))
continue;
/*
* oom_badness() returns 0 if the thread is unkillable
@@ -588,7 +599,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
continue;
if (same_thread_group(p, victim))
continue;
- if (p->mm != mm)
+ if (!process_has_mm(p, mm))
continue;
if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
continue;
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Rientjes <rientjes@google.com> |
|---|---|
| Date | 2015-09-30 00:50 +0200 |
| Subject | Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in |
| Message-ID | <qebSG-3fs-1@gated-at.bofh.it> |
| In reply to | #1235153 |
On Tue, 29 Sep 2015, Oleg Nesterov wrote: > Both "child->mm == mm" and "p->mm != mm" checks in oom_kill_process() > are wrong. ->mm can be if task is the exited group leader. This means > in particular that "kill sharing same memory" loop can miss a process > with a zombie leader which uses the same ->mm. > > Note: the process_has_mm(child, p->mm) check is still not 100% correct, > p->mm can be NULL too. This is minor, but probably deserves a fix or a > comment anyway. > > Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: David Rientjes <rientjes@google.com> I like this and I don't want to hold up a fix for a personal preference, but I find process_has_mm() to simply imply the process has a non-NULL mm. Maybe process_shares_mm()? Something to consider. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-30 16:00 +0200 |
| Subject | Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in |
| Message-ID | <qeq5m-6MN-45@gated-at.bofh.it> |
| In reply to | #1235609 |
On 09/29, David Rientjes wrote: > > On Tue, 29 Sep 2015, Oleg Nesterov wrote: > > > Both "child->mm == mm" and "p->mm != mm" checks in oom_kill_process() > > are wrong. ->mm can be if task is the exited group leader. This means > > in particular that "kill sharing same memory" loop can miss a process > > with a zombie leader which uses the same ->mm. > > > > Note: the process_has_mm(child, p->mm) check is still not 100% correct, > > p->mm can be NULL too. This is minor, but probably deserves a fix or a > > comment anyway. > > > > Signed-off-by: Oleg Nesterov <oleg@redhat.com> > > Acked-by: David Rientjes <rientjes@google.com> > > I like this and I don't want to hold up a fix for a personal preference, > but I find process_has_mm() to simply imply the process has a non-NULL mm. Hmm, yes ;) > Maybe process_shares_mm()? Something to consider. Agreed, will rename in v2. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> |
|---|---|
| Date | 2015-09-30 04:20 +0200 |
| Subject | Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in |
| Message-ID | <qef9U-87p-1@gated-at.bofh.it> |
| In reply to | #1235153 |
Oleg Nesterov wrote:
> Both "child->mm == mm" and "p->mm != mm" checks in oom_kill_process()
> are wrong. ->mm can be if task is the exited group leader. This means
can be [missing word here?] if task
> +static bool process_has_mm(struct task_struct *p, struct mm_struct *mm)
> +{
> + struct task_struct *t;
> +
> + for_each_thread(p, t)
> + if (t->mm)
Can t->mm change between pevious line and next line?
> + return t->mm == mm;
> +
> + return false;
> +}
> +
> #define K(x) ((x) << (PAGE_SHIFT-10))
> /*
> * Must be called while holding a reference to p, which will be released upon
> @@ -530,7 +541,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
> list_for_each_entry(child, &t->children, sibling) {
> unsigned int child_points;
>
> - if (child->mm == p->mm)
> + if (process_has_mm(child, p->mm))
> continue;
We hold read_lock(&tasklist_lock) but not rcu_read_lock().
Is for_each_thread() safe without rcu_read_lock()?
> /*
> * oom_badness() returns 0 if the thread is unkillable
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-30 16:10 +0200 |
| Subject | Re: [PATCH -mm 3/3] mm/oom_kill: fix the wrong task->mm == mm checks in |
| Message-ID | <qeqf0-7dN-17@gated-at.bofh.it> |
| In reply to | #1235712 |
On 09/30, Tetsuo Handa wrote:
>
> Oleg Nesterov wrote:
> > Both "child->mm == mm" and "p->mm != mm" checks in oom_kill_process()
> > are wrong. ->mm can be if task is the exited group leader. This means
>
> can be [missing word here?] if task
Yes thanks. Will fix in v2.
Hmm. And I just noticed that the subjects were corrupted... need to fix
my script.
> > +static bool process_has_mm(struct task_struct *p, struct mm_struct *mm)
> > +{
> > + struct task_struct *t;
> > +
> > + for_each_thread(p, t)
> > + if (t->mm)
>
> Can t->mm change between pevious line and next line?
Good point, thanks. I'll add READ_ONCE() to ensure gcc won't re-load
t->mm again.
> > @@ -530,7 +541,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
> > list_for_each_entry(child, &t->children, sibling) {
> > unsigned int child_points;
> >
> > - if (child->mm == p->mm)
> > + if (process_has_mm(child, p->mm))
> > continue;
>
> We hold read_lock(&tasklist_lock) but not rcu_read_lock().
> Is for_each_thread() safe without rcu_read_lock()?
Yes, for_each_thread() is rcu and/or tasklist_lock safe.
Oleg.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-29 16:30 +0200 |
| Subject | [PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" |
| Message-ID | <qe44O-D4-27@gated-at.bofh.it> |
| In reply to | #1235152 |
Purely cosmetic, but the complex "if" condition looks annoying to me.
Especially because it is not consistent with OOM_SCORE_ADJ_MIN check
which adds another if/continue.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
mm/oom_kill.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 0d581c6..8e7bed2 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -583,16 +583,20 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
* pending fatal signal.
*/
rcu_read_lock();
- for_each_process(p)
- if (p->mm == mm && !same_thread_group(p, victim) &&
- !(p->flags & PF_KTHREAD)) {
- if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
- continue;
+ for_each_process(p) {
+ if (unlikely(p->flags & PF_KTHREAD))
+ continue;
+ if (same_thread_group(p, victim))
+ continue;
+ if (p->mm != mm)
+ continue;
+ if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
+ continue;
- pr_info("Kill process %d (%s) sharing same memory\n",
- task_pid_nr(p), p->comm);
- do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
- }
+ pr_info("Kill process %d (%s) sharing same memory\n",
+ task_pid_nr(p), p->comm);
+ do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
+ }
rcu_read_unlock();
mmput(mm);
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | David Rientjes <rientjes@google.com> |
|---|---|
| Date | 2015-09-30 00:40 +0200 |
| Subject | Re: [PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" |
| Message-ID | <qebIZ-344-13@gated-at.bofh.it> |
| In reply to | #1235160 |
On Tue, 29 Sep 2015, Oleg Nesterov wrote:
> Purely cosmetic, but the complex "if" condition looks annoying to me.
> Especially because it is not consistent with OOM_SCORE_ADJ_MIN check
> which adds another if/continue.
>
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> ---
> mm/oom_kill.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> index 0d581c6..8e7bed2 100644
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -583,16 +583,20 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
> * pending fatal signal.
> */
> rcu_read_lock();
> - for_each_process(p)
> - if (p->mm == mm && !same_thread_group(p, victim) &&
> - !(p->flags & PF_KTHREAD)) {
> - if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
> - continue;
> + for_each_process(p) {
> + if (unlikely(p->flags & PF_KTHREAD))
> + continue;
> + if (same_thread_group(p, victim))
> + continue;
> + if (p->mm != mm)
> + continue;
This ordering is a little weird to me, I think we would eliminate the
majority of processes by checking for p->mm != mm first. There are
certainly pathological cases where that can be defeated, but in practice
it seems to happen more often than not.
Unless you object, I think the ordering should be p->mm != mm,
same_thread_group(), unlikely(PF_KTHREAD) as it originally was (thanks for
adding the unlikely).
I agree your cleanup looks much better than the nested conditional.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-30 16:00 +0200 |
| Subject | Re: [PATCH -mm 2/3] mm/oom_kill: cleanup the "kill sharing same memory" |
| Message-ID | <qeq5l-6MN-23@gated-at.bofh.it> |
| In reply to | #1235608 |
On 09/29, David Rientjes wrote:
>
> On Tue, 29 Sep 2015, Oleg Nesterov wrote:
>
> > Purely cosmetic, but the complex "if" condition looks annoying to me.
> > Especially because it is not consistent with OOM_SCORE_ADJ_MIN check
> > which adds another if/continue.
> >
> > Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> > ---
> > mm/oom_kill.c | 22 +++++++++++++---------
> > 1 file changed, 13 insertions(+), 9 deletions(-)
> >
> > diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> > index 0d581c6..8e7bed2 100644
> > --- a/mm/oom_kill.c
> > +++ b/mm/oom_kill.c
> > @@ -583,16 +583,20 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p,
> > * pending fatal signal.
> > */
> > rcu_read_lock();
> > - for_each_process(p)
> > - if (p->mm == mm && !same_thread_group(p, victim) &&
> > - !(p->flags & PF_KTHREAD)) {
> > - if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
> > - continue;
> > + for_each_process(p) {
> > + if (unlikely(p->flags & PF_KTHREAD))
> > + continue;
> > + if (same_thread_group(p, victim))
> > + continue;
> > + if (p->mm != mm)
> > + continue;
>
> This ordering is a little weird to me, I think we would eliminate the
> majority of processes by checking for p->mm != mm first. There are
> certainly pathological cases where that can be defeated, but in practice
> it seems to happen more often than not.
>
> Unless you object, I think the ordering should be p->mm != mm,
> same_thread_group(), unlikely(PF_KTHREAD) as it originally was (thanks for
> adding the unlikely).
OK, agreed, will send v2.
Oleg.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Oleg Nesterov <oleg@redhat.com> |
|---|---|
| Date | 2015-09-30 20:30 +0200 |
| Subject | [PATCH -mm v2 0/3] mm/oom_kill: ensure we actually kill all tasks sharing the same mm |
| Message-ID | <qeuiB-4z9-7@gated-at.bofh.it> |
| In reply to | #1235152 |
On 09/29, Oleg Nesterov wrote: > > Let me send some initial changes which imo makes sense regardless, > but if we want to zap the victim's memory we need to ensure that all > tasks which share this ->mm were actually killed (see 3/3). > > Please review, this series is simple but only compile tested. > > Andrew, this is on top of linux-mmotm.git + the recent mm-oom-remove- > task_lock-protecting-comm-printing.patch from David. Please consider v2 based on the comments from Tetsuo and David (thanks a lot!). Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web