Re: [patch] oom: thaw threads if oom killed thread is frozen beforedeferring

From: Michal Hocko
Date: Thu Sep 29 2011 - 09:02:12 EST


On Thu 29-09-11 14:05:17, Oleg Nesterov wrote:
> On 09/29, Michal Hocko wrote:
> >
> > --- a/kernel/freezer.c
> > +++ b/kernel/freezer.c
> > @@ -48,6 +48,10 @@ void refrigerator(void)
> > current->flags |= PF_FREEZING;
> >
> > for (;;) {
> > + if (fatal_signal_pending(current)) {
> > + current->flags &= ~PF_FROZEN;
>
> We can't do this.
>
> If PF_FROZEN was set, we must not modify current->flags, this can
> race with, say, thaw_process().

OK, I see.

>
> OK, we can take task_lock(), but this doesn't close other races.
> Say, a SIGKILL'ed task can do try_to_freeze(). Perhaps we should
> simply call thaw_process() unconditionally, this also clears
> TIF_FREEZE.
> Or check freezing() || frozen(). Afacis this solves
> the race you described.

Sounds reasonable.

>
> But of course this can't help if freeze_task() is called later.
> May be freezable() should check TIF_MEMDIE...

Wouldn't it be easier to ignore try_to_freeze when fatal signals are
pending in get_signal_to_deliver? This would mean that we wouldn't get
back to refrigerator just to get out of it.
What about the patch bellow?

>
> Oleg.

Thanks!

---