exit.c 28.7 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7
/*
 *  linux/kernel/exit.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/config.h>
Linus Torvalds's avatar
Linus Torvalds committed
8
#include <linux/mm.h>
Linus Torvalds's avatar
Linus Torvalds committed
9
#include <linux/slab.h>
Linus Torvalds's avatar
Linus Torvalds committed
10 11 12
#include <linux/interrupt.h>
#include <linux/smp_lock.h>
#include <linux/module.h>
Linus Torvalds's avatar
Linus Torvalds committed
13
#include <linux/completion.h>
Linus Torvalds's avatar
Linus Torvalds committed
14
#include <linux/personality.h>
Linus Torvalds's avatar
Linus Torvalds committed
15
#include <linux/tty.h>
Linus Torvalds's avatar
Linus Torvalds committed
16
#include <linux/namespace.h>
17
#include <linux/security.h>
Linus Torvalds's avatar
Linus Torvalds committed
18
#include <linux/acct.h>
Linus Torvalds's avatar
Linus Torvalds committed
19
#include <linux/file.h>
20
#include <linux/binfmts.h>
21
#include <linux/ptrace.h>
John Levon's avatar
John Levon committed
22
#include <linux/profile.h>
23
#include <linux/mount.h>
24
#include <linux/proc_fs.h>
Linus Torvalds's avatar
Linus Torvalds committed
25 26 27 28 29 30 31 32 33 34

#include <asm/uaccess.h>
#include <asm/pgtable.h>
#include <asm/mmu_context.h>

extern void sem_exit (void);
extern struct task_struct *child_reaper;

int getrusage(struct task_struct *, int, struct rusage *);

35
static void __unhash_process(struct task_struct *p)
36 37
{
	nr_threads--;
38
	detach_pid(p, PIDTYPE_PID);
39
	detach_pid(p, PIDTYPE_TGID);
40 41 42
	if (thread_group_leader(p)) {
		detach_pid(p, PIDTYPE_PGID);
		detach_pid(p, PIDTYPE_SID);
43
		if (p->pid)
44
			__get_cpu_var(process_counts)--;
45 46
	}

47 48 49
	REMOVE_LINKS(p);
}

50
void release_task(struct task_struct * p)
Linus Torvalds's avatar
Linus Torvalds committed
51
{
52
	int zap_leader;
Ingo Molnar's avatar
Ingo Molnar committed
53
	task_t *leader;
54
	struct dentry *proc_dentry;
55 56

repeat: 
John Levon's avatar
John Levon committed
57 58
	BUG_ON(p->state < TASK_ZOMBIE);
 
Linus Torvalds's avatar
Linus Torvalds committed
59
	atomic_dec(&p->user->processes);
60 61
	spin_lock(&p->proc_lock);
	proc_dentry = proc_pid_unhash(p);
Ingo Molnar's avatar
Ingo Molnar committed
62 63
	write_lock_irq(&tasklist_lock);
	if (unlikely(p->ptrace))
Ingo Molnar's avatar
Ingo Molnar committed
64 65
		__ptrace_unlink(p);
	BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children));
66
	__exit_signal(p);
67
	__exit_sighand(p);
68
	__unhash_process(p);
69 70 71 72

	/*
	 * If we are the last non-leader member of the thread
	 * group, and the leader is zombie, then notify the
Ingo Molnar's avatar
Ingo Molnar committed
73
	 * group leader's parent process. (if it wants notification.)
74
	 */
75
	zap_leader = 0;
Ingo Molnar's avatar
Ingo Molnar committed
76
	leader = p->group_leader;
77 78
	if (leader != p && thread_group_empty(leader) && leader->state == TASK_ZOMBIE) {
		BUG_ON(leader->exit_signal == -1);
Ingo Molnar's avatar
Ingo Molnar committed
79
		do_notify_parent(leader, leader->exit_signal);
80 81 82 83 84 85 86 87 88 89
		/*
		 * If we were the last child thread and the leader has
		 * exited already, and the leader's parent ignores SIGCHLD,
		 * then we are the one who should release the leader.
		 *
		 * do_notify_parent() will have marked it self-reaping in
		 * that case.
		 */
		zap_leader = (leader->exit_signal == -1);
	}
90

91 92 93 94 95
	p->parent->cutime += p->utime + p->cutime;
	p->parent->cstime += p->stime + p->cstime;
	p->parent->cmin_flt += p->min_flt + p->cmin_flt;
	p->parent->cmaj_flt += p->maj_flt + p->cmaj_flt;
	p->parent->cnswap += p->nswap + p->cnswap;
96 97
	p->parent->cnvcsw += p->nvcsw + p->cnvcsw;
	p->parent->cnivcsw += p->nivcsw + p->cnivcsw;
98
	sched_exit(p);
99
	write_unlock_irq(&tasklist_lock);
100 101
	spin_unlock(&p->proc_lock);
	proc_pid_flush(proc_dentry);
Linus Torvalds's avatar
Linus Torvalds committed
102
	release_thread(p);
103
	put_task_struct(p);
104 105 106 107

	p = leader;
	if (unlikely(zap_leader))
		goto repeat;
Linus Torvalds's avatar
Linus Torvalds committed
108 109
}

110 111 112 113
/* we are using it only for SMP init */

void unhash_process(struct task_struct *p)
{
114 115
	struct dentry *proc_dentry;

116 117
	spin_lock(&p->proc_lock);
	proc_dentry = proc_pid_unhash(p);
118
	write_lock_irq(&tasklist_lock);
119
	__unhash_process(p);
120
	write_unlock_irq(&tasklist_lock);
121 122
	spin_unlock(&p->proc_lock);
	proc_pid_flush(proc_dentry);
123 124
}

Linus Torvalds's avatar
Linus Torvalds committed
125 126 127 128 129 130 131 132
/*
 * This checks not only the pgrp, but falls back on the pid if no
 * satisfactory pgrp is found. I dunno - gdb doesn't work correctly
 * without this...
 */
int session_of_pgrp(int pgrp)
{
	struct task_struct *p;
133 134 135
	struct list_head *l;
	struct pid *pid;
	int sid = -1;
Linus Torvalds's avatar
Linus Torvalds committed
136 137

	read_lock(&tasklist_lock);
138
	for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid)
139 140
		if (p->session > 0) {
			sid = p->session;
Ingo Molnar's avatar
Ingo Molnar committed
141
			goto out;
Linus Torvalds's avatar
Linus Torvalds committed
142
		}
Ingo Molnar's avatar
Ingo Molnar committed
143 144
	p = find_task_by_pid(pgrp);
	if (p)
145
		sid = p->session;
Ingo Molnar's avatar
Ingo Molnar committed
146
out:
Linus Torvalds's avatar
Linus Torvalds committed
147
	read_unlock(&tasklist_lock);
Ingo Molnar's avatar
Ingo Molnar committed
148
	
149
	return sid;
Linus Torvalds's avatar
Linus Torvalds committed
150 151 152 153 154 155 156 157 158 159
}

/*
 * Determine if a process group is "orphaned", according to the POSIX
 * definition in 2.2.2.52.  Orphaned process groups are not to be affected
 * by terminal-generated stop signals.  Newly orphaned process groups are
 * to receive a SIGHUP and a SIGCONT.
 *
 * "I ask you, have you ever known what it is to be an orphan?"
 */
160
static int will_become_orphaned_pgrp(int pgrp, task_t *ignored_task)
Linus Torvalds's avatar
Linus Torvalds committed
161 162
{
	struct task_struct *p;
163 164 165 166 167 168
	struct list_head *l;
	struct pid *pid;
	int ret = 1;

	for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid) {
		if (p == ignored_task
Ingo Molnar's avatar
Ingo Molnar committed
169
				|| p->state >= TASK_ZOMBIE 
170
				|| p->real_parent->pid == 1)
Linus Torvalds's avatar
Linus Torvalds committed
171
			continue;
172
		if (process_group(p->real_parent) != pgrp
173
			    && p->real_parent->session == p->session) {
174 175
			ret = 0;
			break;
Linus Torvalds's avatar
Linus Torvalds committed
176 177
		}
	}
178
	return ret;	/* (sighing) "Often!" */
Linus Torvalds's avatar
Linus Torvalds committed
179 180
}

181
int is_orphaned_pgrp(int pgrp)
182 183 184 185
{
	int retval;

	read_lock(&tasklist_lock);
186
	retval = will_become_orphaned_pgrp(pgrp, NULL);
187 188 189 190 191
	read_unlock(&tasklist_lock);

	return retval;
}

192
static inline int has_stopped_jobs(int pgrp)
Linus Torvalds's avatar
Linus Torvalds committed
193 194
{
	int retval = 0;
195 196 197
	struct task_struct *p;
	struct list_head *l;
	struct pid *pid;
Linus Torvalds's avatar
Linus Torvalds committed
198

199
	for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid) {
Linus Torvalds's avatar
Linus Torvalds committed
200 201
		if (p->state != TASK_STOPPED)
			continue;
202 203 204 205 206 207 208 209 210 211 212

		/* If p is stopped by a debugger on a signal that won't
		   stop it, then don't count p as stopped.  This isn't
		   perfect but it's a good approximation.  */
		if (unlikely (p->ptrace)
		    && p->exit_code != SIGSTOP
		    && p->exit_code != SIGTSTP
		    && p->exit_code != SIGTTOU
		    && p->exit_code != SIGTTIN)
			continue;

Linus Torvalds's avatar
Linus Torvalds committed
213 214 215
		retval = 1;
		break;
	}
216 217 218
	return retval;
}

Linus Torvalds's avatar
Linus Torvalds committed
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
/**
 * reparent_to_init() - Reparent the calling kernel thread to the init task.
 *
 * If a kernel thread is launched as a result of a system call, or if
 * it ever exits, it should generally reparent itself to init so that
 * it is correctly cleaned up on exit.
 *
 * The various task state such as scheduling policy and priority may have
 * been inherited from a user process, so we reset them to sane values here.
 *
 * NOTE that reparent_to_init() gives the caller full capabilities.
 */
void reparent_to_init(void)
{
	write_lock_irq(&tasklist_lock);

235
	ptrace_unlink(current);
Linus Torvalds's avatar
Linus Torvalds committed
236 237
	/* Reparent to init */
	REMOVE_LINKS(current);
238 239
	current->parent = child_reaper;
	current->real_parent = child_reaper;
Linus Torvalds's avatar
Linus Torvalds committed
240 241 242 243 244
	SET_LINKS(current);

	/* Set the exit signal to SIGCHLD so we signal init on exit */
	current->exit_signal = SIGCHLD;

Ingo Molnar's avatar
Ingo Molnar committed
245
	if ((current->policy == SCHED_NORMAL) && (task_nice(current) < 0))
Ingo Molnar's avatar
Ingo Molnar committed
246
		set_user_nice(current, 0);
Linus Torvalds's avatar
Linus Torvalds committed
247 248 249
	/* cpus_allowed? */
	/* rt_priority? */
	/* signals? */
250
	security_task_reparent_to_init(current);
Linus Torvalds's avatar
Linus Torvalds committed
251
	memcpy(current->rlim, init_task.rlim, sizeof(*(current->rlim)));
252
	atomic_inc(&(INIT_USER->__count));
253
	switch_uid(INIT_USER);
Linus Torvalds's avatar
Linus Torvalds committed
254 255 256 257

	write_unlock_irq(&tasklist_lock);
}

258 259 260 261
void __set_special_pids(pid_t session, pid_t pgrp)
{
	struct task_struct *curr = current;

262
	if (curr->session != session) {
263
		detach_pid(curr, PIDTYPE_SID);
264
		curr->session = session;
265 266
		attach_pid(curr, PIDTYPE_SID, session);
	}
267
	if (process_group(curr) != pgrp) {
268
		detach_pid(curr, PIDTYPE_PGID);
269
		curr->group_leader->__pgrp = pgrp;
270 271 272 273 274 275 276 277 278 279 280
		attach_pid(curr, PIDTYPE_PGID, pgrp);
	}
}

void set_special_pids(pid_t session, pid_t pgrp)
{
	write_lock_irq(&tasklist_lock);
	__set_special_pids(session, pgrp);
	write_unlock_irq(&tasklist_lock);
}

281 282 283 284 285 286 287 288 289 290 291 292
/*
 * Let kernel threads use this to say that they
 * allow a certain signal (since daemonize() will
 * have disabled all of them by default).
 */
int allow_signal(int sig)
{
	if (sig < 1 || sig > _NSIG)
		return -EINVAL;

	spin_lock_irq(&current->sighand->siglock);
	sigdelset(&current->blocked, sig);
293 294 295 296 297 298 299
	if (!current->mm) {
		/* Kernel threads handle their own signals.
		   Let the signal code know it'll be handled, so
		   that they don't get converted to SIGKILL or
		   just silently dropped */
		current->sighand->action[(sig)-1].sa.sa_handler = (void *)2;
	}
300 301 302 303
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);
	return 0;
}
Tomas Szepe's avatar
Tomas Szepe committed
304 305

EXPORT_SYMBOL(allow_signal);
306

307 308 309 310 311 312 313 314 315 316 317 318 319 320
int disallow_signal(int sig)
{
	if (sig < 1 || sig > _NSIG)
		return -EINVAL;

	spin_lock_irq(&current->sighand->siglock);
	sigaddset(&current->blocked, sig);
	recalc_sigpending();
	spin_unlock_irq(&current->sighand->siglock);
	return 0;
}

EXPORT_SYMBOL(disallow_signal);

Linus Torvalds's avatar
Linus Torvalds committed
321 322 323 324 325
/*
 *	Put all the gunge required to become a kernel thread without
 *	attached user resources in one place where it belongs.
 */

326
void daemonize(const char *name, ...)
Linus Torvalds's avatar
Linus Torvalds committed
327
{
328
	va_list args;
Linus Torvalds's avatar
Linus Torvalds committed
329
	struct fs_struct *fs;
330
	sigset_t blocked;
Linus Torvalds's avatar
Linus Torvalds committed
331

332 333
	va_start(args, name);
	vsnprintf(current->comm, sizeof(current->comm), name, args);
334
	va_end(args);
Linus Torvalds's avatar
Linus Torvalds committed
335 336 337 338 339 340 341 342

	/*
	 * If we were started as result of loading a module, close all of the
	 * user space pages.  We don't need them, and if we didn't close them
	 * they would be locked into memory.
	 */
	exit_mm(current);

343
	set_special_pids(1, 1);
344
	current->tty = NULL;
Linus Torvalds's avatar
Linus Torvalds committed
345

346 347 348 349 350
	/* Block and flush all signals */
	sigfillset(&blocked);
	sigprocmask(SIG_BLOCK, &blocked, NULL);
	flush_signals(current);

Linus Torvalds's avatar
Linus Torvalds committed
351 352 353 354 355 356 357 358 359
	/* Become as one with the init task */

	exit_fs(current);	/* current->fs->count--; */
	fs = init_task.fs;
	current->fs = fs;
	atomic_inc(&fs->count);
 	exit_files(current);
	current->files = init_task.files;
	atomic_inc(&current->files->count);
360 361

	reparent_to_init();
Linus Torvalds's avatar
Linus Torvalds committed
362 363
}

364 365
EXPORT_SYMBOL(daemonize);

Linus Torvalds's avatar
Linus Torvalds committed
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
static inline void close_files(struct files_struct * files)
{
	int i, j;

	j = 0;
	for (;;) {
		unsigned long set;
		i = j * __NFDBITS;
		if (i >= files->max_fdset || i >= files->max_fds)
			break;
		set = files->open_fds->fds_bits[j++];
		while (set) {
			if (set & 1) {
				struct file * file = xchg(&files->fd[i], NULL);
				if (file)
					filp_close(file, files);
			}
			i++;
			set >>= 1;
		}
	}
}

389
void fastcall put_files_struct(struct files_struct *files)
Linus Torvalds's avatar
Linus Torvalds committed
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
{
	if (atomic_dec_and_test(&files->count)) {
		close_files(files);
		/*
		 * Free the fd and fdset arrays if we expanded them.
		 */
		if (files->fd != &files->fd_array[0])
			free_fd_array(files->fd, files->max_fds);
		if (files->max_fdset > __FD_SETSIZE) {
			free_fdset(files->open_fds, files->max_fdset);
			free_fdset(files->close_on_exec, files->max_fdset);
		}
		kmem_cache_free(files_cachep, files);
	}
}

Andrew Morton's avatar
Andrew Morton committed
406 407
EXPORT_SYMBOL(put_files_struct);

Linus Torvalds's avatar
Linus Torvalds committed
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
static inline void __exit_files(struct task_struct *tsk)
{
	struct files_struct * files = tsk->files;

	if (files) {
		task_lock(tsk);
		tsk->files = NULL;
		task_unlock(tsk);
		put_files_struct(files);
	}
}

void exit_files(struct task_struct *tsk)
{
	__exit_files(tsk);
}

static inline void __put_fs_struct(struct fs_struct *fs)
{
	/* No need to hold fs->lock if we are killing it */
	if (atomic_dec_and_test(&fs->count)) {
		dput(fs->root);
		mntput(fs->rootmnt);
		dput(fs->pwd);
		mntput(fs->pwdmnt);
		if (fs->altroot) {
			dput(fs->altroot);
			mntput(fs->altrootmnt);
		}
		kmem_cache_free(fs_cachep, fs);
	}
}

void put_fs_struct(struct fs_struct *fs)
{
	__put_fs_struct(fs);
}

static inline void __exit_fs(struct task_struct *tsk)
{
	struct fs_struct * fs = tsk->fs;

	if (fs) {
		task_lock(tsk);
		tsk->fs = NULL;
		task_unlock(tsk);
		__put_fs_struct(fs);
	}
}

void exit_fs(struct task_struct *tsk)
{
	__exit_fs(tsk);
}

463 464
EXPORT_SYMBOL_GPL(exit_fs);

Linus Torvalds's avatar
Linus Torvalds committed
465 466 467 468 469 470
/*
 * Turn us into a lazy TLB process if we
 * aren't already..
 */
static inline void __exit_mm(struct task_struct * tsk)
{
471
	struct mm_struct *mm = tsk->mm;
Linus Torvalds's avatar
Linus Torvalds committed
472

473
	mm_release(tsk, mm);
474 475 476
	if (!mm)
		return;
	/*
477 478 479 480 481
	 * Serialize with any possible pending coredump.
	 * We must hold mmap_sem around checking core_waiters
	 * and clearing tsk->mm.  The core-inducing thread
	 * will increment core_waiters for each thread in the
	 * group with ->mm != NULL.
482
	 */
483
	down_read(&mm->mmap_sem);
Ingo Molnar's avatar
Ingo Molnar committed
484
	if (mm->core_waiters) {
485
		up_read(&mm->mmap_sem);
Ingo Molnar's avatar
Ingo Molnar committed
486 487 488 489 490 491
		down_write(&mm->mmap_sem);
		if (!--mm->core_waiters)
			complete(mm->core_startup_done);
		up_write(&mm->mmap_sem);

		wait_for_completion(&mm->core_done);
492
		down_read(&mm->mmap_sem);
Linus Torvalds's avatar
Linus Torvalds committed
493
	}
494 495 496 497 498
	atomic_inc(&mm->mm_count);
	if (mm != tsk->active_mm) BUG();
	/* more a memory barrier than a real lock */
	task_lock(tsk);
	tsk->mm = NULL;
499
	up_read(&mm->mmap_sem);
500
	enter_lazy_tlb(mm, current);
501 502
	task_unlock(tsk);
	mmput(mm);
Linus Torvalds's avatar
Linus Torvalds committed
503 504 505 506 507 508 509
}

void exit_mm(struct task_struct *tsk)
{
	__exit_mm(tsk);
}

510 511
EXPORT_SYMBOL(exit_mm);

512 513
static inline void choose_new_parent(task_t *p, task_t *reaper, task_t *child_reaper)
{
Ingo Molnar's avatar
Ingo Molnar committed
514 515 516 517 518
	/*
	 * Make sure we're not reparenting to ourselves and that
	 * the parent is not a zombie.
	 */
	if (p == reaper || reaper->state >= TASK_ZOMBIE)
519 520 521 522 523 524 525 526 527
		p->real_parent = child_reaper;
	else
		p->real_parent = reaper;
	if (p->parent == p->real_parent)
		BUG();
}

static inline void reparent_thread(task_t *p, task_t *father, int traced)
{
Michael Hayes's avatar
Michael Hayes committed
528
	/* We don't want people slaying init.  */
529 530 531 532 533
	if (p->exit_signal != -1)
		p->exit_signal = SIGCHLD;
	p->self_exec_id++;

	if (p->pdeath_signal)
534 535
		/* We already hold the tasklist_lock here.  */
		group_send_sig_info(p->pdeath_signal, (void *) 0, p);
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554

	/* Move the child from its dying parent to the new one.  */
	if (unlikely(traced)) {
		/* Preserve ptrace links if someone else is tracing this child.  */
		list_del_init(&p->ptrace_list);
		if (p->parent != p->real_parent)
			list_add(&p->ptrace_list, &p->real_parent->ptrace_children);
	} else {
		/* If this child is being traced, then we're the one tracing it
		 * anyway, so let go of it.
		 */
		p->ptrace = 0;
		list_del_init(&p->sibling);
		p->parent = p->real_parent;
		list_add_tail(&p->sibling, &p->parent->children);

		/* If we'd notified the old parent about this child's death,
		 * also notify the new parent.
		 */
555 556
		if (p->state == TASK_ZOMBIE && p->exit_signal != -1 &&
		    thread_group_empty(p))
557 558 559 560 561 562 563 564 565
			do_notify_parent(p, p->exit_signal);
	}

	/*
	 * process group orphan check
	 * Case ii: Our child is in a different pgrp
	 * than we are, and it was the only connection
	 * outside, so the child pgrp is now orphaned.
	 */
566
	if ((process_group(p) != process_group(father)) &&
567
	    (p->session == father->session)) {
568
		int pgrp = process_group(p);
569

570
		if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) {
571 572 573 574 575 576
			__kill_pg_info(SIGHUP, (void *)1, pgrp);
			__kill_pg_info(SIGCONT, (void *)1, pgrp);
		}
	}
}

577 578 579 580 581 582 583 584
/*
 * When we die, we re-parent all our children.
 * Try to give them to another thread in our thread
 * group, and if no such member exists, give it to
 * the global child reaper process (ie "init")
 */
static inline void forget_original_parent(struct task_struct * father)
{
Ingo Molnar's avatar
Ingo Molnar committed
585
	struct task_struct *p, *reaper = father;
586
	struct list_head *_p, *_n;
587

588
	reaper = father->group_leader;
589 590 591 592 593 594 595
	if (reaper == father)
		reaper = child_reaper;

	/*
	 * There are only two places where our children can be:
	 *
	 * - in our child list
Ingo Molnar's avatar
Ingo Molnar committed
596
	 * - in our ptraced child list
597 598 599
	 *
	 * Search them and reparent children.
	 */
600
	list_for_each_safe(_p, _n, &father->children) {
601
		p = list_entry(_p,struct task_struct,sibling);
602 603 604 605 606
		if (father == p->real_parent) {
			choose_new_parent(p, reaper, child_reaper);
			reparent_thread(p, father, 0);
		} else {
			ptrace_unlink (p);
607 608
			if (p->state == TASK_ZOMBIE && p->exit_signal != -1 &&
			    thread_group_empty(p))
609
				do_notify_parent(p, p->exit_signal);
610
		}
Ingo Molnar's avatar
Ingo Molnar committed
611
	}
612 613 614 615
	list_for_each_safe(_p, _n, &father->ptrace_children) {
		p = list_entry(_p,struct task_struct,ptrace_list);
		choose_new_parent(p, reaper, child_reaper);
		reparent_thread(p, father, 1);
616 617 618
	}
}

Linus Torvalds's avatar
Linus Torvalds committed
619 620 621 622
/*
 * Send signals to all our closest relatives so that they know
 * to properly mourn us..
 */
623
static void exit_notify(struct task_struct *tsk)
Linus Torvalds's avatar
Linus Torvalds committed
624
{
625
	int state;
626
	struct task_struct *t;
627

628
	if (signal_pending(tsk) && !tsk->signal->group_exit
629 630 631 632 633 634 635 636 637 638 639
	    && !thread_group_empty(tsk)) {
		/*
		 * This occurs when there was a race between our exit
		 * syscall and a group signal choosing us as the one to
		 * wake up.  It could be that we are the only thread
		 * alerted to check for pending signals, but another thread
		 * should be woken now to take the signal since we will not.
		 * Now we'll wake all the threads in the group just to make
		 * sure someone gets all the pending signals.
		 */
		read_lock(&tasklist_lock);
640
		spin_lock_irq(&tsk->sighand->siglock);
641 642 643 644 645 646
		for (t = next_thread(tsk); t != tsk; t = next_thread(t))
			if (!signal_pending(t) && !(t->flags & PF_EXITING)) {
				recalc_sigpending_tsk(t);
				if (signal_pending(t))
					signal_wake_up(t, 0);
			}
647
		spin_unlock_irq(&tsk->sighand->siglock);
648 649 650
		read_unlock(&tasklist_lock);
	}

651
	write_lock_irq(&tasklist_lock);
Linus Torvalds's avatar
Linus Torvalds committed
652

653 654 655 656 657 658 659 660 661
	/*
	 * This does two things:
	 *
  	 * A.  Make init inherit all the child processes
	 * B.  Check to see if any process groups have become orphaned
	 *	as a result of our exiting, and if they have any stopped
	 *	jobs, send them a SIGHUP and then a SIGCONT.  (POSIX 3.2.2.2)
	 */

662 663
	forget_original_parent(tsk);
	BUG_ON(!list_empty(&tsk->children));
664

Linus Torvalds's avatar
Linus Torvalds committed
665 666 667 668 669 670 671 672 673 674
	/*
	 * Check to see if any process groups have become orphaned
	 * as a result of our exiting, and if they have any stopped
	 * jobs, send them a SIGHUP and then a SIGCONT.  (POSIX 3.2.2.2)
	 *
	 * Case i: Our father is in a different pgrp than we are
	 * and we were the only connection outside, so our pgrp
	 * is about to become orphaned.
	 */
	 
Daniel Jacobowitz's avatar
Daniel Jacobowitz committed
675
	t = tsk->real_parent;
Linus Torvalds's avatar
Linus Torvalds committed
676
	
677
	if ((process_group(t) != process_group(tsk)) &&
678
	    (t->session == tsk->session) &&
679 680 681 682
	    will_become_orphaned_pgrp(process_group(tsk), tsk) &&
	    has_stopped_jobs(process_group(tsk))) {
		__kill_pg_info(SIGHUP, (void *)1, process_group(tsk));
		__kill_pg_info(SIGCONT, (void *)1, process_group(tsk));
Linus Torvalds's avatar
Linus Torvalds committed
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
	}

	/* Let father know we died 
	 *
	 * Thread signals are configurable, but you aren't going to use
	 * that to send signals to arbitary processes. 
	 * That stops right now.
	 *
	 * If the parent exec id doesn't match the exec id we saved
	 * when we started then we know the parent has changed security
	 * domain.
	 *
	 * If our self_exec id doesn't match our parent_exec_id then
	 * we have changed execution domain as these two values started
	 * the same after a fork.
	 *	
	 */
	
701 702 703
	if (tsk->exit_signal != SIGCHLD && tsk->exit_signal != -1 &&
	    ( tsk->parent_exec_id != t->self_exec_id  ||
	      tsk->self_exec_id != tsk->parent_exec_id)
Linus Torvalds's avatar
Linus Torvalds committed
704
	    && !capable(CAP_KILL))
705
		tsk->exit_signal = SIGCHLD;
Linus Torvalds's avatar
Linus Torvalds committed
706 707


708 709 710 711
	/* If something other than our normal parent is ptracing us, then
	 * send it a SIGCHLD instead of honoring exit_signal.  exit_signal
	 * only has special meaning to our real parent.
	 */
712
	if (tsk->exit_signal != -1 && thread_group_empty(tsk)) {
713 714
		int signal = tsk->parent == tsk->real_parent ? tsk->exit_signal : SIGCHLD;
		do_notify_parent(tsk, signal);
715 716
	} else if (tsk->ptrace) {
		do_notify_parent(tsk, SIGCHLD);
717
	}
718

719 720 721 722
	state = TASK_ZOMBIE;
	if (tsk->exit_signal == -1 && tsk->ptrace == 0)
		state = TASK_DEAD;
	tsk->state = state;
723
	tsk->flags |= PF_DEAD;
724

725
	/*
726 727 728 729 730 731 732 733 734 735
	 * In the preemption case it must be impossible for the task
	 * to get runnable again, so use "_raw_" unlock to keep
	 * preempt_count elevated until we schedule().
	 *
	 * To avoid deadlock on SMP, interrupts must be unmasked.  If we
	 * don't, subsequently called functions (e.g, wait_task_inactive()
	 * via release_task()) will spin, with interrupt flags
	 * unwittingly blocked, until the other task sleeps.  That task
	 * may itself be waiting for smp_call_function() to answer and
	 * complete, and with interrupts blocked that will never happen.
736
	 */
737
	_raw_write_unlock(&tasklist_lock);
738
	local_irq_enable();
739 740 741 742 743

	/* If the process is dead, release it - nobody will wait for it */
	if (state == TASK_DEAD)
		release_task(tsk);

Linus Torvalds's avatar
Linus Torvalds committed
744 745
}

Andrew Morton's avatar
Andrew Morton committed
746
asmlinkage NORET_TYPE void do_exit(long code)
Linus Torvalds's avatar
Linus Torvalds committed
747 748 749
{
	struct task_struct *tsk = current;

Dave Jones's avatar
Dave Jones committed
750
	if (unlikely(in_interrupt()))
Linus Torvalds's avatar
Linus Torvalds committed
751
		panic("Aiee, killing interrupt handler!");
Dave Jones's avatar
Dave Jones committed
752
	if (unlikely(!tsk->pid))
Linus Torvalds's avatar
Linus Torvalds committed
753
		panic("Attempted to kill the idle task!");
Dave Jones's avatar
Dave Jones committed
754
	if (unlikely(tsk->pid == 1))
Linus Torvalds's avatar
Linus Torvalds committed
755
		panic("Attempted to kill init!");
Andrew Morton's avatar
Andrew Morton committed
756 757
	if (tsk->io_context)
		exit_io_context();
Linus Torvalds's avatar
Linus Torvalds committed
758
	tsk->flags |= PF_EXITING;
759
	del_timer_sync(&tsk->real_timer);
Linus Torvalds's avatar
Linus Torvalds committed
760

761
	if (unlikely(in_atomic()))
762
		printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n",
763
				current->comm, current->pid,
764
				preempt_count());
765

John Levon's avatar
John Levon committed
766 767
	profile_exit_task(tsk);
 
768 769
	if (unlikely(current->ptrace & PT_TRACE_EXIT)) {
		current->ptrace_message = code;
770
		ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP);
771
	}
772

Linus Torvalds's avatar
Linus Torvalds committed
773 774 775
	acct_process(code);
	__exit_mm(tsk);

Andrew Morton's avatar
Andrew Morton committed
776
	exit_sem(tsk);
Linus Torvalds's avatar
Linus Torvalds committed
777 778
	__exit_files(tsk);
	__exit_fs(tsk);
Linus Torvalds's avatar
Linus Torvalds committed
779
	exit_namespace(tsk);
780
	exit_itimers(tsk);
Linus Torvalds's avatar
Linus Torvalds committed
781 782
	exit_thread();

783
	if (tsk->leader)
Linus Torvalds's avatar
Linus Torvalds committed
784 785
		disassociate_ctty(1);

786 787 788
	module_put(tsk->thread_info->exec_domain->module);
	if (tsk->binfmt)
		module_put(tsk->binfmt->module);
Linus Torvalds's avatar
Linus Torvalds committed
789 790

	tsk->exit_code = code;
791
	exit_notify(tsk);
Linus Torvalds's avatar
Linus Torvalds committed
792 793
	schedule();
	BUG();
794 795
	/* Avoid "noreturn function does return".  */
	for (;;) ;
Linus Torvalds's avatar
Linus Torvalds committed
796 797
}

Linus Torvalds's avatar
Linus Torvalds committed
798
NORET_TYPE void complete_and_exit(struct completion *comp, long code)
Linus Torvalds's avatar
Linus Torvalds committed
799
{
Linus Torvalds's avatar
Linus Torvalds committed
800 801
	if (comp)
		complete(comp);
Linus Torvalds's avatar
Linus Torvalds committed
802 803 804 805
	
	do_exit(code);
}

806 807
EXPORT_SYMBOL(complete_and_exit);

Linus Torvalds's avatar
Linus Torvalds committed
808 809 810 811 812
asmlinkage long sys_exit(int error_code)
{
	do_exit((error_code&0xff)<<8);
}

813
task_t fastcall *next_thread(task_t *p)
814 815 816 817
{
	struct pid_link *link = p->pids + PIDTYPE_TGID;
	struct list_head *tmp, *head = &link->pidptr->task_list;

818
#ifdef CONFIG_SMP
819
	if (!p->sighand)
820
		BUG();
821
	if (!spin_is_locked(&p->sighand->siglock) &&
822 823 824 825 826 827 828 829 830 831
				!rwlock_is_locked(&tasklist_lock))
		BUG();
#endif
	tmp = link->pid_chain.next;
	if (tmp == head)
		tmp = head->next;

	return pid_task(tmp, PIDTYPE_TGID);
}

832 833
EXPORT_SYMBOL(next_thread);

834
/*
Ingo Molnar's avatar
Ingo Molnar committed
835 836
 * Take down every thread in the group.  This is called by fatal signals
 * as well as by sys_exit_group (below).
837
 */
Ingo Molnar's avatar
Ingo Molnar committed
838 839
NORET_TYPE void
do_group_exit(int exit_code)
840
{
Ingo Molnar's avatar
Ingo Molnar committed
841
	BUG_ON(exit_code & 0x80); /* core dumps don't get here */
842

843 844
	if (current->signal->group_exit)
		exit_code = current->signal->group_exit_code;
Ingo Molnar's avatar
Ingo Molnar committed
845
	else if (!thread_group_empty(current)) {
846 847
		struct signal_struct *const sig = current->signal;
		struct sighand_struct *const sighand = current->sighand;
Ingo Molnar's avatar
Ingo Molnar committed
848
		read_lock(&tasklist_lock);
849
		spin_lock_irq(&sighand->siglock);
Ingo Molnar's avatar
Ingo Molnar committed
850 851 852 853
		if (sig->group_exit)
			/* Another thread got here before we took the lock.  */
			exit_code = sig->group_exit_code;
		else {
854 855
			sig->group_exit = 1;
			sig->group_exit_code = exit_code;
Ingo Molnar's avatar
Ingo Molnar committed
856 857
			zap_other_threads(current);
		}
858
		spin_unlock_irq(&sighand->siglock);
Ingo Molnar's avatar
Ingo Molnar committed
859
		read_unlock(&tasklist_lock);
860 861
	}

862
	do_exit(exit_code);
Ingo Molnar's avatar
Ingo Molnar committed
863 864 865 866 867 868 869 870
	/* NOTREACHED */
}

/*
 * this kills every thread in the thread group. Note that any externally
 * wait4()-ing process will get the correct exit code - even if this
 * thread is not the thread group leader.
 */
871
asmlinkage void sys_exit_group(int error_code)
Ingo Molnar's avatar
Ingo Molnar committed
872 873
{
	do_group_exit((error_code & 0xff) << 8);
874 875
}

876
static int eligible_child(pid_t pid, int options, task_t *p)
877
{
878
	if (pid > 0) {
879 880 881
		if (p->pid != pid)
			return 0;
	} else if (!pid) {
882
		if (process_group(p) != process_group(current))
883 884
			return 0;
	} else if (pid != -1) {
885
		if (process_group(p) != -pid)
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
			return 0;
	}

	/*
	 * Do not consider detached threads that are
	 * not ptraced:
	 */
	if (p->exit_signal == -1 && !p->ptrace)
		return 0;

	/* Wait for all children (clone and not) if __WALL is set;
	 * otherwise, wait for clone children *only* if __WCLONE is
	 * set; otherwise, wait for non-clone children *only*.  (Note:
	 * A "clone" child here is one that reports to its parent
	 * using a signal other than SIGCHLD.) */
	if (((p->exit_signal != SIGCHLD) ^ ((options & __WCLONE) != 0))
	    && !(options & __WALL))
		return 0;
904 905 906 907 908
	/*
	 * Do not consider thread group leaders that are
	 * in a non-empty thread group:
	 */
	if (current->tgid != p->tgid && delay_group_leader(p))
909
		return 2;
910

911
	if (security_task_wait(p))
912 913 914 915 916
		return 0;

	return 1;
}

917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
/*
 * Handle sys_wait4 work for one task in state TASK_ZOMBIE.  We hold
 * read_lock(&tasklist_lock) on entry.  If we return zero, we still hold
 * the lock and this task is uninteresting.  If we return nonzero, we have
 * released the lock and the system call should return.
 */
static int wait_task_zombie(task_t *p, unsigned int *stat_addr, struct rusage *ru)
{
	unsigned long state;
	int retval;

	/*
	 * Try to move the task's state to DEAD
	 * only one thread is allowed to do this:
	 */
	state = xchg(&p->state, TASK_DEAD);
	if (state != TASK_ZOMBIE) {
		BUG_ON(state != TASK_DEAD);
		return 0;
	}
937
	if (unlikely(p->exit_signal == -1 && p->ptrace == 0))
938 939 940 941 942 943 944 945 946 947 948 949 950 951
		/*
		 * This can only happen in a race with a ptraced thread
		 * dying on another processor.
		 */
		return 0;

	/*
	 * Now we are sure this task is interesting, and no other
	 * thread can reap it because we set its state to TASK_DEAD.
	 */
	read_unlock(&tasklist_lock);

	retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
	if (!retval && stat_addr) {
952 953
		if (p->signal->group_exit)
			retval = put_user(p->signal->group_exit_code, stat_addr);
954 955 956 957 958 959 960 961 962 963 964 965 966 967
		else
			retval = put_user(p->exit_code, stat_addr);
	}
	if (retval) {
		p->state = TASK_ZOMBIE;
		return retval;
	}
	retval = p->pid;
	if (p->real_parent != p->parent) {
		write_lock_irq(&tasklist_lock);
		/* Double-check with lock held.  */
		if (p->real_parent != p->parent) {
			__ptrace_unlink(p);
			p->state = TASK_ZOMBIE;
968
			/* If this is a detached thread, this is where it goes away.  */
969 970 971
			if (p->exit_signal == -1) {
				/* release_task takes the lock itself.  */
				write_unlock_irq(&tasklist_lock);
972
				release_task (p);
973 974
			}
			else {
975
				do_notify_parent(p, p->exit_signal);
976 977
				write_unlock_irq(&tasklist_lock);
			}
978 979
			p = NULL;
		}
980 981
		else
			write_unlock_irq(&tasklist_lock);
982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
	}
	if (p != NULL)
		release_task(p);
	BUG_ON(!retval);
	return retval;
}

/*
 * Handle sys_wait4 work for one task in state TASK_STOPPED.  We hold
 * read_lock(&tasklist_lock) on entry.  If we return zero, we still hold
 * the lock and this task is uninteresting.  If we return nonzero, we have
 * released the lock and the system call should return.
 */
static int wait_task_stopped(task_t *p, int delayed_group_leader,
			     unsigned int *stat_addr, struct rusage *ru)
{
	int retval, exit_code;

	if (!p->exit_code)
		return 0;
	if (delayed_group_leader && !(p->ptrace & PT_PTRACED) &&
1003
	    p->signal && p->signal->group_stop_count > 0)
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
		/*
		 * A group stop is in progress and this is the group leader.
		 * We won't report until all threads have stopped.
		 */
		return 0;

	/*
	 * Now we are pretty sure this task is interesting.
	 * Make sure it doesn't get reaped out from under us while we
	 * give up the lock and then examine it below.  We don't want to
	 * keep holding onto the tasklist_lock while we call getrusage and
	 * possibly take page faults for user memory.
	 */
	get_task_struct(p);
	read_unlock(&tasklist_lock);
	write_lock_irq(&tasklist_lock);

	/*
	 * This uses xchg to be atomic with the thread resuming and setting
	 * it.  It must also be done with the write lock held to prevent a
	 * race with the TASK_ZOMBIE case.
	 */
	exit_code = xchg(&p->exit_code, 0);
	if (unlikely(p->state > TASK_STOPPED)) {
		/*
		 * The task resumed and then died.  Let the next iteration
		 * catch it in TASK_ZOMBIE.  Note that exit_code might
		 * already be zero here if it resumed and did _exit(0).
		 * The task itself is dead and won't touch exit_code again;
		 * other processors in this function are locked out.
		 */
		p->exit_code = exit_code;
		exit_code = 0;
	}
	if (unlikely(exit_code == 0)) {
		/*
		 * Another thread in this function got to it first, or it
		 * resumed, or it resumed and then died.
		 */
		write_unlock_irq(&tasklist_lock);
		put_task_struct(p);
		read_lock(&tasklist_lock);
		return 0;
	}

	/* move to end of parent's list to avoid starvation */
	remove_parent(p);
	add_parent(p, p->parent);

	write_unlock_irq(&tasklist_lock);

	retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
	if (!retval && stat_addr)
		retval = put_user((exit_code << 8) | 0x7f, stat_addr);
	if (!retval)
		retval = p->pid;
	put_task_struct(p);

	BUG_ON(!retval);
	return retval;
}

Linus Torvalds's avatar
Linus Torvalds committed
1066 1067 1068 1069
asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru)
{
	DECLARE_WAITQUEUE(wait, current);
	struct task_struct *tsk;
Ingo Molnar's avatar
Ingo Molnar committed
1070
	int flag, retval;
Linus Torvalds's avatar
Linus Torvalds committed
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082

	if (options & ~(WNOHANG|WUNTRACED|__WNOTHREAD|__WCLONE|__WALL))
		return -EINVAL;

	add_wait_queue(&current->wait_chldexit,&wait);
repeat:
	flag = 0;
	current->state = TASK_INTERRUPTIBLE;
	read_lock(&tasklist_lock);
	tsk = current;
	do {
		struct task_struct *p;
1083
		struct list_head *_p;
1084 1085
		int ret;

1086 1087
		list_for_each(_p,&tsk->children) {
			p = list_entry(_p,struct task_struct,sibling);
1088 1089 1090

			ret = eligible_child(pid, options, p);
			if (!ret)
1091
				continue;
Linus Torvalds's avatar
Linus Torvalds committed
1092
			flag = 1;
1093

Linus Torvalds's avatar
Linus Torvalds committed
1094 1095
			switch (p->state) {
			case TASK_STOPPED:
1096 1097
				if (!(options & WUNTRACED) &&
				    !(p->ptrace & PT_PTRACED))
Ingo Molnar's avatar
Ingo Molnar committed
1098
					continue;
1099 1100 1101 1102 1103
				retval = wait_task_stopped(p, ret == 2,
							   stat_addr, ru);
				if (retval != 0) /* He released the lock.  */
					goto end_wait4;
				break;
Linus Torvalds's avatar
Linus Torvalds committed
1104
			case TASK_ZOMBIE:
1105 1106 1107 1108 1109
				/*
				 * Eligible but we cannot release it yet:
				 */
				if (ret == 2)
					continue;
1110 1111
				retval = wait_task_zombie(p, stat_addr, ru);
				if (retval != 0) /* He released the lock.  */
Ingo Molnar's avatar
Ingo Molnar committed
1112
					goto end_wait4;
1113
				break;
Linus Torvalds's avatar
Linus Torvalds committed
1114 1115
			}
		}
1116 1117 1118 1119 1120 1121 1122 1123 1124
		if (!flag) {
			list_for_each (_p,&tsk->ptrace_children) {
				p = list_entry(_p,struct task_struct,ptrace_list);
				if (!eligible_child(pid, options, p))
					continue;
				flag = 1;
				break;
			}
		}
Linus Torvalds's avatar
Linus Torvalds committed
1125 1126 1127
		if (options & __WNOTHREAD)
			break;
		tsk = next_thread(tsk);
1128
		if (tsk->signal != current->signal)
Ingo Molnar's avatar
Ingo Molnar committed
1129
			BUG();
Linus Torvalds's avatar
Linus Torvalds committed
1130 1131
	} while (tsk != current);
	read_unlock(&tasklist_lock);
1132
	if (flag) {
Linus Torvalds's avatar
Linus Torvalds committed
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
		retval = 0;
		if (options & WNOHANG)
			goto end_wait4;
		retval = -ERESTARTSYS;
		if (signal_pending(current))
			goto end_wait4;
		schedule();
		goto repeat;
	}
	retval = -ECHILD;
end_wait4:
	current->state = TASK_RUNNING;
	remove_wait_queue(&current->wait_chldexit,&wait);
	return retval;
}

1149
#if !defined(__alpha__) && !defined(__ia64__) && !defined(__arm__)
Linus Torvalds's avatar
Linus Torvalds committed
1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160

/*
 * sys_waitpid() remains for compatibility. waitpid() should be
 * implemented by calling sys_wait4() from libc.a.
 */
asmlinkage long sys_waitpid(pid_t pid,unsigned int * stat_addr, int options)
{
	return sys_wait4(pid, stat_addr, options, NULL);
}

#endif