From: Oleg Nesterov <oleg@tv-sign.ru>
To: Pavel Emelyanov <xemul@openvz.org>
Cc: Ingo Molnar <mingo@elte.hu>, Jesper Juhl <jesper.juhl@gmail.com>,
linux-kernel@vger.kernel.org,
"Eric W. Biederman" <ebiederm@xmission.com>,
Sukadev Bhattiprolu <sukadev@us.ibm.com>
Subject: Re: fork_idle && pid problems ?
Date: Thu, 17 Apr 2008 19:36:44 +0400 [thread overview]
Message-ID: <20080417153644.GA69@tv-sign.ru> (raw)
In-Reply-To: <480771DC.5040002@openvz.org>
On 04/17, Pavel Emelyanov wrote:
>
> Oleg Nesterov wrote:
> >
> > But wait... What _is_ the task_pid() after fork_idle() ???
>
> It is NULL, but every code getting one can handle such case :)
>
> > fork_idle() doesn't really attach the new thread to the init_struct_pid,
> > so ->pids[PIDTYPE_PID].pid just points the parent's pid, no?
> >
> > As for x86, the parent is /sbin/init (kernel_init->smp_prepare_cpus),
> > not so bad, it can't exit.
> >
> > But what about HOTPLUG_CPU? Suppose we add CPU, use some non-idle
> > kernel thread (workqueue) to fork the idle thread. CPU goes down,
> > parent exits and frees the pid. Now, if this CPU goes up again, the
> > idle thread runs with its ->pid pointing to the freed memory, not
> > good.
>
> Nope - it will be NULL.
How so? I bet it won't be NULL...
dup_task_struct:
*tsk = *orig;
After that the child's ->pids[PIDTYPE_MAX] is a copy of parent's.
But the task is not attached to these pids.
> > Not serious perhaps, afaics we only need this ->pid to ensure that
> > swapper can safely fork /sbin/init, but still.
> >
> > Pavel, Eric, Sukadev? Please say I missed something! ;)
> >
> > Otherwise, we can change init_idle() to do attach_pid(init_struct_pid),
> > afaics we can do this lockless. In that case we should also change
> > INIT_STRUCT_PID() and remove the initialization of .tasks.
>
> Well, these was some request to make tasks always have pid link
> point to not NULL (from Matt?) so we'll need this :)
For now I'd suggest the patch below. If contrary to our expectations
there is any usage of idle_task->pids, we will notice ;)
Oleg.
--- kernel/fork.c~ 2008-03-07 18:11:27.000000000 +0300
+++ kernel/fork.c 2008-04-17 19:34:10.000000000 +0400
@@ -1420,6 +1420,9 @@ struct task_struct * __cpuinit fork_idle
if (!IS_ERR(task))
init_idle(task, cpu);
+ /* COMMENT */
+ memset(task->pids, 0, sizeof task->pids);
+
return task;
}
next prev parent reply other threads:[~2008-04-17 16:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-16 21:45 Possible mem leak in copy_process() Jesper Juhl
2008-04-17 4:17 ` Arnd Bergmann
2008-04-17 11:57 ` Oleg Nesterov
2008-04-17 13:02 ` Ingo Molnar
2008-04-17 14:02 ` fork_idle && pid problems ? (was: Possible mem leak in copy_process()) Oleg Nesterov
2008-04-17 15:50 ` fork_idle && pid problems ? Pavel Emelyanov
2008-04-17 15:36 ` Oleg Nesterov [this message]
2008-04-17 16:40 ` Pavel Emelyanov
2008-04-17 16:05 ` Oleg Nesterov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080417153644.GA69@tv-sign.ru \
--to=oleg@tv-sign.ru \
--cc=ebiederm@xmission.com \
--cc=jesper.juhl@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=sukadev@us.ibm.com \
--cc=xemul@openvz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.