On Tue 21-10-14 14:09:27, Rafael J. Wysocki wrote:
[...]
> > @@ -131,12 +132,40 @@ int freeze_processes(void)
> >  
> >     printk("Freezing user space processes ... ");
> >     pm_freezing = true;
> > +   oom_kills_saved = oom_kills_count();
> >     error = try_to_freeze_tasks(true);
> >     if (!error) {
> > -           printk("done.");
> >             __usermodehelper_set_disable_depth(UMH_DISABLED);
> >             oom_killer_disable();
> > +
> > +           /*
> > +            * There might have been an OOM kill while we were
> > +            * freezing tasks and the killed task might be still
> > +            * on the way out so we have to double check for race.
> > +            */
> > +           if (oom_kills_count() != oom_kills_saved) {
> > +                   struct task_struct *g, *p;
> > +
> > +                   read_lock(&tasklist_lock);
> > +                   for_each_process_thread(g, p) {
> > +                           if (p == current || freezer_should_skip(p) ||
> > +                               frozen(p))
> > +                                   continue;
> > +                           error = -EBUSY;
> > +                           goto out_loop;
> > +                   }
> > +out_loop:
> 
> Well, it looks like this will work here too:
> 
>                       for_each_process_thread(g, p)
>                               if (p != current && !frozen(p) &&
>                                   !freezer_should_skip(p)) {
>                                       error = -EBUSY;
>                                       break;
>                               }
> 
> or I am helplessly misreading the code.

break will not work because for_each_process_thread is a double loop.
Except for that the negated condition is OK as well. I can change that
if you prefer.

> > +                   read_unlock(&tasklist_lock);
> > +
> > +                   if (error) {
> > +                           __usermodehelper_set_disable_depth(UMH_ENABLED);
> > +                           printk("OOM in progress.");
> > +                           goto done;
> > +                   }
> > +           }
> > +           printk("done.");
> >     }
> > +done:
> >     printk("\n");
> >     BUG_ON(in_atomic());
> >  
-- 
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to