[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070218145246.GA80@tv-sign.ru>
Date: Sun, 18 Feb 2007 17:52:46 +0300
From: Oleg Nesterov <oleg@...sign.ru>
To: "Rafael J. Wysocki" <rjw@...k.pl>
Cc: ego@...ibm.com, akpm@...l.org, paulmck@...ibm.com, mingo@...e.hu,
vatsa@...ibm.com, dipankar@...ibm.com,
venkatesh.pallipadi@...el.com, linux-kernel@...r.kernel.org,
Pavel Machek <pavel@....cz>
Subject: freezer problems
On 02/18, Rafael J. Wysocki wrote:
>
> On Sunday, 18 February 2007 12:31, Oleg Nesterov wrote:
> > > >
> > > > However, this means that sys_vfork() makes impossible to freeze processes
> > > > until child exits/execs. Not good.
> > >
> > I forgot to say that we have another problem: coredumping.
> >
> > A thread which does do_coredump() send SIGKILL to ->mm users, and sleeps
> > on ->mm->core_startup_done. Now it can't be frozen if sub-thread goes to
> > refrigerator. I think this could be solved easily if we add a check to
> > refrigerator() as you suggested for ->vfork_donw.
> >
> > > I think the real solution would be to use an interruptible completion in the
> > > vfork code. It was discussed some time ago and, IIRC, Ingo had an experimental
> > > patch that implemented it. Still, for the suspend this really is not an issue
> > > in practice, so it wasn't merged.
> >
> > It is not (afaics) so trivial to do rightly, and with this change the parent
> > will be seen as TASK_INTERRUPTIBLE even without freezer in progress.
> >
> > A very vague idea: what if parent will do
> >
> > current->flags |= PF_PLEASE_CONSIDER_ME_AS_FROZEN_BUT_SET_TIF_FREEZE
> > wait_for_completion(&vfork);
> > try_to_freeze();
> >
> > ?
>
> This should work,
Good. So try_to_freeze_tasks() can forget about "if (!p->vfork_done)" check.
This needs more thinking, of course. For example, thaw_process() should be
carefull to clear TIF_FREEZE if we have the new flag set, but not PF_FROZEN.
frozen() should be changed to return true if PF_NEW_FLAG && TIF_FREEZE, but
it also called by refrigerator.
But IF we really can do this, it will be a general solution.
> but we'll need a separate process flag for it. If that's
> acceptable,
I can't judge. Changed the subject to have more attention from experts.
> I'd call it PF_VFORK_PARENT
I'd suggest not to put "VFORK" into the name. Probably we will find other
usage for this flag which in fact means: "I am sleeping TASK_UNINTERRUPTIBLE
at the safe place to freeze, I promise to do try_to_freeze() when I have
CPU".
And now another problem: exec. de_thread() sleeps in TASK_UNINTERRUPTIBLE
waiting for all sub-threads to die, and we have the same "deadlock" if
one of them is frozen. This is nasty. Probably we can change the ->state
to TASK_INTERRUPTIBLE and add try_to_freeze(), or play with the new PF_
flag, but I am not sure it is safe to freeze() the task which is deep
in the exec() path.
Oleg.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists