aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-03-28 19:11:07 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-28 21:36:41 -0500
commit73b9ebfe126a4a886ee46cbab637374d7024668a (patch)
treed7ba00d4ce76b49c1569334956cd196b35977a04 /kernel/exit.c
parentc97d98931ac52ef110b62d9b75c6a6f2bfbc1898 (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.c18
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
123void 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