diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2006-03-28 19:11:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-28 21:36:41 -0500 |
commit | 73b9ebfe126a4a886ee46cbab637374d7024668a (patch) | |
tree | d7ba00d4ce76b49c1569334956cd196b35977a04 /kernel/exit.c | |
parent | c97d98931ac52ef110b62d9b75c6a6f2bfbc1898 (diff) |
[PATCH] pidhash: don't count idle threads
fork_idle() does unhash_process() just after copy_process(). Contrary,
boot_cpu's idle thread explicitely registers itself for each pid_type with nr
= 0.
copy_process() already checks p->pid != 0 before process_counts++, I think we
can just skip attach_pid() calls and job control inits for idle threads and
kill unhash_process(). We don't need to cleanup ->proc_dentry in fork_idle()
because with this patch idle threads are never hashed in
kernel/pid.c:pid_hash[].
We don't need to hash pid == 0 in pidmap_init(). free_pidmap() is never
called with pid == 0 arg, so it will never be reused. So it is still possible
to use pid == 0 in any PIDTYPE_xxx namespace from kernel/pid.c's POV.
However with this patch we don't hash pid == 0 for PIDTYPE_PID case. We still
have have PIDTYPE_PGID/PIDTYPE_SID entries with pid == 0: /sbin/init and
kernel threads which don't call daemonize().
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 18 |
1 files changed, 1 insertions, 17 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index f436a6bd3fb7..a94e1c31131b 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -56,8 +56,7 @@ static void __unhash_process(struct task_struct *p) | |||
56 | detach_pid(p, PIDTYPE_SID); | 56 | detach_pid(p, PIDTYPE_SID); |
57 | 57 | ||
58 | list_del_init(&p->tasks); | 58 | list_del_init(&p->tasks); |
59 | if (p->pid) | 59 | __get_cpu_var(process_counts)--; |
60 | __get_cpu_var(process_counts)--; | ||
61 | } | 60 | } |
62 | 61 | ||
63 | remove_parent(p); | 62 | remove_parent(p); |
@@ -118,21 +117,6 @@ repeat: | |||
118 | goto repeat; | 117 | goto repeat; |
119 | } | 118 | } |
120 | 119 | ||
121 | /* we are using it only for SMP init */ | ||
122 | |||
123 | void unhash_process(struct task_struct *p) | ||
124 | { | ||
125 | struct dentry *proc_dentry; | ||
126 | |||
127 | spin_lock(&p->proc_lock); | ||
128 | proc_dentry = proc_pid_unhash(p); | ||
129 | write_lock_irq(&tasklist_lock); | ||
130 | __unhash_process(p); | ||
131 | write_unlock_irq(&tasklist_lock); | ||
132 | spin_unlock(&p->proc_lock); | ||
133 | proc_pid_flush(proc_dentry); | ||
134 | } | ||
135 | |||
136 | /* | 120 | /* |
137 | * This checks not only the pgrp, but falls back on the pid if no | 121 | * This checks not only the pgrp, but falls back on the pid if no |
138 | * satisfactory pgrp is found. I dunno - gdb doesn't work correctly | 122 | * satisfactory pgrp is found. I dunno - gdb doesn't work correctly |