Michal Hocko wrote:
> I would really suggest you to stick with the changelog I have suggested.
> 
Well, I think that this patch needs to clarify why using ALLOC_WMARK_HIGH.

> On Wed 01-11-17 20:54:27, Tetsuo Handa wrote:
> [...]
> > diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> > index 26add8a..118ecdb 100644
> > --- a/mm/oom_kill.c
> > +++ b/mm/oom_kill.c
> > @@ -870,6 +870,19 @@ static void oom_kill_process(struct oom_control *oc, 
> > const char *message)
> >     }
> >     task_unlock(p);
> >  
> > +   /*
> > +    * Try really last second allocation attempt after we selected an OOM
> > +    * victim, for somebody might have managed to free memory while we were
> > +    * selecting an OOM victim which can take quite some time.
> > +    */
> > +   if (oc->ac) {
> > +           oc->page = alloc_pages_before_oomkill(oc);
> 
> I would stick the oc->ac check inside alloc_pages_before_oomkill.

OK.

> 
> > +           if (oc->page) {
> > +                   put_task_struct(p);
> > +                   return;
> > +           }
> > +   }
> > +
> >     if (__ratelimit(&oom_rs))
> >             dump_header(oc, p);
> >  
> > @@ -1081,6 +1094,16 @@ bool out_of_memory(struct oom_control *oc)
> >     select_bad_process(oc);
> >     /* Found nothing?!?! Either we hang forever, or we panic. */
> >     if (!oc->chosen && !is_sysrq_oom(oc) && !is_memcg_oom(oc)) {
> > +           /*
> > +            * Try really last second allocation attempt, for somebody
> > +            * might have managed to free memory while we were trying to
> > +            * find an OOM victim.
> > +            */
> > +           if (oc->ac) {
> > +                   oc->page = alloc_pages_before_oomkill(oc);
> > +                   if (oc->page)
> > +                           return true;
> > +           }
> >             dump_header(oc, NULL);
> >             panic("Out of memory and no killable processes...\n");
> >     }
> 
> Also, is there any strong reason to not do the last allocation after
> select_bad_process rather than having two call sites? I would understand
> that if you wanted to catch for_each_thread inside oom_kill_process but
> you are not doing that.

Unfortunately, we will after all have two call sites because we have
sysctl_oom_kill_allocating_task path.

V2 patch follows. Andrea, will you check that your intent of using high
watermark for last second allocation attempt in the change log is correct?

Reply via email to