From: Andrew Morton <akpm@osdl.org>
To: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: linux-kernel@vger.kernel.org,
"Eric W. Biederman" <ebiederm@xmission.com>
Subject: Re: [RFC] ps command race fix
Date: Mon, 24 Jul 2006 18:20:00 -0700 [thread overview]
Message-ID: <20060724182000.2ab0364a.akpm@osdl.org> (raw)
In-Reply-To: <20060714203939.ddbc4918.kamezawa.hiroyu@jp.fujitsu.com>
On Fri, 14 Jul 2006 20:39:39 +0900
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote:
> Hi, this is an experimental patch for the probelm
> - "ps command can miss some pid occationally"
> please comment
>
>
> the problem itself is very rare case, but the result is sometimes terrible
>
> for example, when a user does
>
> alive=`ps | grep command | grep -v command | wc -l`
>
> to check process is alive or not (I think this user should use kill-0 ;)
>
> -Kame
> ==
> Now, prod_pid_readir() uses direct access to task and
> indexing 'task list' as fallback.
> Of course, entries in this list can be removed randomly.
>
> So, following can happen when using 'ps' command.
> ==
> 1. assume task_list as
> ....-(taskA)-(taskB)-(taskC)-(taskD)-(taskE)-(taskF)-(taskG)-...
>
> 2. at getdents() iteration 'N', ps command's getdents() read entries before taskC.
> and remenbers "I read X entries".
>
> ....-(taskA)-(taskB)-(taskC)-(taskD)-(taskE)-(taskF)-(taskG)-...
> ------(f_pos=X)---------^
>
> getdents() remembers
> - "taskC is next candidate to be read"
> - "we already read X ents".
>
> 3. consider taskA and taskC exits, before next getdents(N+1)
>
> ....-(lost)-(taskB)-(lost)-(taskD)-(taskE)-(taskF)-(taskG)-...
> ------(f_pos=X)--------^
>
> 4. at getdents(N+1), becasue getdents() cannot find taskC, it skips 'X'
> ents in the list.
> from head of the list.
> ....-(taskB)-(taskD)-(taskE)-(taskF)-(taskG)-..
> ------(f_pos=X)--------^
>
> 5. in this case, taskD is skipped.
> ==
>
> This patch changes indexing in the list to indexing in a table.
> Table is created only for storing valid tgid.(not pid)
> Tested on x86/ia64.
>
It allocates a potentially-significant amount of memory per-task, until
that tasks exits (we could release it earlier, but the problem remains) and
it adds yet another global lock in the process exit path.
> 5 files changed, 138 insertions(+), 62 deletions(-)
And it adds complexity and code.
So I think we're still seeking a solution to this.
Options might be:
a) Pin the most-recently-visited task in some manner, so that it is
still on the global task list when we return. That's fairly simple to
do (defer the release_task()) but it affects task lifetime and visibility
in rare and worrisome ways.
b) Change proc_pid_readdir() so that it walks the pid_hash[] array
instead of the task list. Need to do something clever when traversing
each bucket's list, but I'm not sure what ;) It's the same problem.
Possibly what we could do here is to permit the task which is walking
/proc to pin a particular `struct pid': take a ref on it then when we
next start walking one of the pid_hash[] chains, we _know_ that the
`struct pid' which we're looking for will still be there. Even if it
now refers to a departed process.
c) Nuke the pid_hash[], convert the whole thing to a radix-tree.
They're super-simple to traverse. Not sure what we'd index it by
though.
I guess b) is best.
next prev parent reply other threads:[~2006-07-25 1:20 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-14 11:39 [RFC] ps command race fix KAMEZAWA Hiroyuki
2006-07-25 1:20 ` Andrew Morton [this message]
2006-07-25 1:48 ` Paul Jackson
2006-07-25 2:00 ` Andrew Morton
2006-07-25 2:08 ` KAMEZAWA Hiroyuki
2006-07-25 2:33 ` Andrew Morton
2006-07-25 2:50 ` KAMEZAWA Hiroyuki
2006-07-25 3:16 ` KAMEZAWA Hiroyuki
2006-08-13 16:29 ` Eric W. Biederman
2006-08-13 17:34 ` Andrew Morton
2006-08-13 19:00 ` Eric W. Biederman
2006-08-13 19:12 ` Paul Jackson
2006-08-16 1:23 ` KAMEZAWA Hiroyuki
2006-08-17 4:59 ` Eric W. Biederman
2006-08-17 6:32 ` KAMEZAWA Hiroyuki
2006-08-17 13:39 ` Eric W. Biederman
2006-08-17 18:16 ` Jean Delvare
2006-08-18 0:21 ` KAMEZAWA Hiroyuki
2006-08-18 3:53 ` Eric W. Biederman
2006-08-13 20:08 ` Albert Cahalan
2006-08-16 2:20 ` Kyle Moffett
2006-07-25 7:22 ` Paul Jackson
2006-07-25 1:53 ` KAMEZAWA Hiroyuki
2006-07-25 2:06 ` Andrew Morton
2006-07-25 2:34 ` KAMEZAWA Hiroyuki
2006-07-25 6:09 ` Eric W. Biederman
-- strict thread matches above, loose matches on Subject: below --
2006-07-25 6:47 Albert Cahalan
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=20060724182000.2ab0364a.akpm@osdl.org \
--to=akpm@osdl.org \
--cc=ebiederm@xmission.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.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.