aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-02-12 03:52:57 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-12 12:48:32 -0500
commit0475ac0845f9295bc5f69af45f58dff2c104c8d1 (patch)
tree2052ddeb6cc271238a1470a2fb3a7082bb1eefd1
parent04a2e6a5cbf84e85fe86de0a18f6509b147e1d89 (diff)
[PATCH] pid: use struct pid for talking about process groups in exitc
Modify has_stopped_jobs and will_become_orphan_pgrp to use struct pid based process groups. This reduces the number of hash tables looks ups and paves the way for multiple pid spaces. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--kernel/exit.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 3ac6a7a6f857..407b80aaefda 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -210,22 +210,22 @@ struct pid *session_of_pgrp(struct pid *pgrp)
210 * 210 *
211 * "I ask you, have you ever known what it is to be an orphan?" 211 * "I ask you, have you ever known what it is to be an orphan?"
212 */ 212 */
213static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task) 213static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task)
214{ 214{
215 struct task_struct *p; 215 struct task_struct *p;
216 int ret = 1; 216 int ret = 1;
217 217
218 do_each_task_pid(pgrp, PIDTYPE_PGID, p) { 218 do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
219 if (p == ignored_task 219 if (p == ignored_task
220 || p->exit_state 220 || p->exit_state
221 || is_init(p->real_parent)) 221 || is_init(p->real_parent))
222 continue; 222 continue;
223 if (process_group(p->real_parent) != pgrp && 223 if (task_pgrp(p->real_parent) != pgrp &&
224 process_session(p->real_parent) == process_session(p)) { 224 task_session(p->real_parent) == task_session(p)) {
225 ret = 0; 225 ret = 0;
226 break; 226 break;
227 } 227 }
228 } while_each_task_pid(pgrp, PIDTYPE_PGID, p); 228 } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
229 return ret; /* (sighing) "Often!" */ 229 return ret; /* (sighing) "Often!" */
230} 230}
231 231
@@ -234,23 +234,23 @@ int is_orphaned_pgrp(int pgrp)
234 int retval; 234 int retval;
235 235
236 read_lock(&tasklist_lock); 236 read_lock(&tasklist_lock);
237 retval = will_become_orphaned_pgrp(pgrp, NULL); 237 retval = will_become_orphaned_pgrp(find_pid(pgrp), NULL);
238 read_unlock(&tasklist_lock); 238 read_unlock(&tasklist_lock);
239 239
240 return retval; 240 return retval;
241} 241}
242 242
243static int has_stopped_jobs(int pgrp) 243static int has_stopped_jobs(struct pid *pgrp)
244{ 244{
245 int retval = 0; 245 int retval = 0;
246 struct task_struct *p; 246 struct task_struct *p;
247 247
248 do_each_task_pid(pgrp, PIDTYPE_PGID, p) { 248 do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
249 if (p->state != TASK_STOPPED) 249 if (p->state != TASK_STOPPED)
250 continue; 250 continue;
251 retval = 1; 251 retval = 1;
252 break; 252 break;
253 } while_each_task_pid(pgrp, PIDTYPE_PGID, p); 253 } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
254 return retval; 254 return retval;
255} 255}
256 256
@@ -648,14 +648,14 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced)
648 * than we are, and it was the only connection 648 * than we are, and it was the only connection
649 * outside, so the child pgrp is now orphaned. 649 * outside, so the child pgrp is now orphaned.
650 */ 650 */
651 if ((process_group(p) != process_group(father)) && 651 if ((task_pgrp(p) != task_pgrp(father)) &&
652 (process_session(p) == process_session(father))) { 652 (task_session(p) == task_session(father))) {
653 int pgrp = process_group(p); 653 struct pid *pgrp = task_pgrp(p);
654 654
655 if (will_become_orphaned_pgrp(pgrp, NULL) && 655 if (will_become_orphaned_pgrp(pgrp, NULL) &&
656 has_stopped_jobs(pgrp)) { 656 has_stopped_jobs(pgrp)) {
657 __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp); 657 __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
658 __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp); 658 __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
659 } 659 }
660 } 660 }
661} 661}
@@ -735,6 +735,7 @@ static void exit_notify(struct task_struct *tsk)
735 int state; 735 int state;
736 struct task_struct *t; 736 struct task_struct *t;
737 struct list_head ptrace_dead, *_p, *_n; 737 struct list_head ptrace_dead, *_p, *_n;
738 struct pid *pgrp;
738 739
739 if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT) 740 if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT)
740 && !thread_group_empty(tsk)) { 741 && !thread_group_empty(tsk)) {
@@ -787,12 +788,13 @@ static void exit_notify(struct task_struct *tsk)
787 788
788 t = tsk->real_parent; 789 t = tsk->real_parent;
789 790
790 if ((process_group(t) != process_group(tsk)) && 791 pgrp = task_pgrp(tsk);
791 (process_session(t) == process_session(tsk)) && 792 if ((task_pgrp(t) != pgrp) &&
792 will_become_orphaned_pgrp(process_group(tsk), tsk) && 793 (task_session(t) != task_session(tsk)) &&
793 has_stopped_jobs(process_group(tsk))) { 794 will_become_orphaned_pgrp(pgrp, tsk) &&
794 __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk)); 795 has_stopped_jobs(pgrp)) {
795 __kill_pg_info(SIGCONT, SEND_SIG_PRIV, process_group(tsk)); 796 __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
797 __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
796 } 798 }
797 799
798 /* Let father know we died 800 /* Let father know we died