kern_exit.c revision 185647
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 4. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 *	@(#)kern_exit.c	8.7 (Berkeley) 2/12/94
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/sys/kern/kern_exit.c 185647 2008-12-05 20:50:24Z kib $");
39
40#include "opt_compat.h"
41#include "opt_kdtrace.h"
42#include "opt_ktrace.h"
43#include "opt_mac.h"
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/sysproto.h>
48#include <sys/eventhandler.h>
49#include <sys/kernel.h>
50#include <sys/malloc.h>
51#include <sys/lock.h>
52#include <sys/mutex.h>
53#include <sys/proc.h>
54#include <sys/pioctl.h>
55#include <sys/jail.h>
56#include <sys/tty.h>
57#include <sys/wait.h>
58#include <sys/vmmeter.h>
59#include <sys/vnode.h>
60#include <sys/resourcevar.h>
61#include <sys/sbuf.h>
62#include <sys/signalvar.h>
63#include <sys/sched.h>
64#include <sys/sx.h>
65#include <sys/syscallsubr.h>
66#include <sys/syslog.h>
67#include <sys/ptrace.h>
68#include <sys/acct.h>		/* for acct_process() function prototype */
69#include <sys/filedesc.h>
70#include <sys/sdt.h>
71#include <sys/shm.h>
72#include <sys/sem.h>
73#ifdef KTRACE
74#include <sys/ktrace.h>
75#endif
76
77#include <security/audit/audit.h>
78#include <security/mac/mac_framework.h>
79
80#include <vm/vm.h>
81#include <vm/vm_extern.h>
82#include <vm/vm_param.h>
83#include <vm/pmap.h>
84#include <vm/vm_map.h>
85#include <vm/vm_page.h>
86#include <vm/uma.h>
87
88#ifdef KDTRACE_HOOKS
89#include <sys/dtrace_bsd.h>
90dtrace_execexit_func_t	dtrace_fasttrap_exit;
91#endif
92
93SDT_PROVIDER_DECLARE(proc);
94SDT_PROBE_DEFINE(proc, kernel, , exit);
95SDT_PROBE_ARGTYPE(proc, kernel, , exit, 0, "int");
96
97/* Required to be non-static for SysVR4 emulator */
98MALLOC_DEFINE(M_ZOMBIE, "zombie", "zombie proc status");
99
100/* Hook for NFS teardown procedure. */
101void (*nlminfo_release_p)(struct proc *p);
102
103/*
104 * exit -- death of process.
105 */
106void
107sys_exit(struct thread *td, struct sys_exit_args *uap)
108{
109
110	exit1(td, W_EXITCODE(uap->rval, 0));
111	/* NOTREACHED */
112}
113
114/*
115 * Exit: deallocate address space and other resources, change proc state to
116 * zombie, and unlink proc from allproc and parent's lists.  Save exit status
117 * and rusage for wait().  Check for child processes and orphan them.
118 */
119void
120exit1(struct thread *td, int rv)
121{
122	struct proc *p, *nq, *q;
123	struct vnode *vtmp;
124	struct vnode *ttyvp = NULL;
125#ifdef KTRACE
126	struct vnode *tracevp;
127	struct ucred *tracecred;
128#endif
129	struct plimit *plim;
130	int locked;
131
132	mtx_assert(&Giant, MA_NOTOWNED);
133
134	p = td->td_proc;
135	if (p == initproc) {
136		printf("init died (signal %d, exit %d)\n",
137		    WTERMSIG(rv), WEXITSTATUS(rv));
138		panic("Going nowhere without my init!");
139	}
140
141	/*
142	 * MUST abort all other threads before proceeding past here.
143	 */
144	PROC_LOCK(p);
145	while (p->p_flag & P_HADTHREADS) {
146		/*
147		 * First check if some other thread got here before us..
148		 * if so, act apropriatly, (exit or suspend);
149		 */
150		thread_suspend_check(0);
151
152		/*
153		 * Kill off the other threads. This requires
154		 * some co-operation from other parts of the kernel
155		 * so it may not be instantaneous.  With this state set
156		 * any thread entering the kernel from userspace will
157		 * thread_exit() in trap().  Any thread attempting to
158		 * sleep will return immediately with EINTR or EWOULDBLOCK
159		 * which will hopefully force them to back out to userland
160		 * freeing resources as they go.  Any thread attempting
161		 * to return to userland will thread_exit() from userret().
162		 * thread_exit() will unsuspend us when the last of the
163		 * other threads exits.
164		 * If there is already a thread singler after resumption,
165		 * calling thread_single will fail; in that case, we just
166		 * re-check all suspension request, the thread should
167		 * either be suspended there or exit.
168		 */
169		if (! thread_single(SINGLE_EXIT))
170			break;
171
172		/*
173		 * All other activity in this process is now stopped.
174		 * Threading support has been turned off.
175		 */
176	}
177	KASSERT(p->p_numthreads == 1,
178	    ("exit1: proc %p exiting with %d threads", p, p->p_numthreads));
179	/*
180	 * Wakeup anyone in procfs' PIOCWAIT.  They should have a hold
181	 * on our vmspace, so we should block below until they have
182	 * released their reference to us.  Note that if they have
183	 * requested S_EXIT stops we will block here until they ack
184	 * via PIOCCONT.
185	 */
186	_STOPEVENT(p, S_EXIT, rv);
187
188	/*
189	 * Note that we are exiting and do another wakeup of anyone in
190	 * PIOCWAIT in case they aren't listening for S_EXIT stops or
191	 * decided to wait again after we told them we are exiting.
192	 */
193	p->p_flag |= P_WEXIT;
194	wakeup(&p->p_stype);
195
196	/*
197	 * Wait for any processes that have a hold on our vmspace to
198	 * release their reference.
199	 */
200	while (p->p_lock > 0)
201		msleep(&p->p_lock, &p->p_mtx, PWAIT, "exithold", 0);
202
203	PROC_UNLOCK(p);
204	/* Drain the limit callout while we don't have the proc locked */
205	callout_drain(&p->p_limco);
206
207#ifdef AUDIT
208	/*
209	 * The Sun BSM exit token contains two components: an exit status as
210	 * passed to exit(), and a return value to indicate what sort of exit
211	 * it was.  The exit status is WEXITSTATUS(rv), but it's not clear
212	 * what the return value is.
213	 */
214	AUDIT_ARG(exit, WEXITSTATUS(rv), 0);
215	AUDIT_SYSCALL_EXIT(0, td);
216#endif
217
218	/* Are we a task leader? */
219	if (p == p->p_leader) {
220		mtx_lock(&ppeers_lock);
221		q = p->p_peers;
222		while (q != NULL) {
223			PROC_LOCK(q);
224			psignal(q, SIGKILL);
225			PROC_UNLOCK(q);
226			q = q->p_peers;
227		}
228		while (p->p_peers != NULL)
229			msleep(p, &ppeers_lock, PWAIT, "exit1", 0);
230		mtx_unlock(&ppeers_lock);
231	}
232
233	/*
234	 * Check if any loadable modules need anything done at process exit.
235	 * E.g. SYSV IPC stuff
236	 * XXX what if one of these generates an error?
237	 */
238	EVENTHANDLER_INVOKE(process_exit, p);
239
240	/*
241	 * If parent is waiting for us to exit or exec,
242	 * P_PPWAIT is set; we will wakeup the parent below.
243	 */
244	PROC_LOCK(p);
245	stopprofclock(p);
246	p->p_flag &= ~(P_TRACED | P_PPWAIT);
247
248	/*
249	 * Stop the real interval timer.  If the handler is currently
250	 * executing, prevent it from rearming itself and let it finish.
251	 */
252	if (timevalisset(&p->p_realtimer.it_value) &&
253	    callout_stop(&p->p_itcallout) == 0) {
254		timevalclear(&p->p_realtimer.it_interval);
255		msleep(&p->p_itcallout, &p->p_mtx, PWAIT, "ritwait", 0);
256		KASSERT(!timevalisset(&p->p_realtimer.it_value),
257		    ("realtime timer is still armed"));
258	}
259	PROC_UNLOCK(p);
260
261	/*
262	 * Reset any sigio structures pointing to us as a result of
263	 * F_SETOWN with our pid.
264	 */
265	funsetownlst(&p->p_sigiolst);
266
267	/*
268	 * If this process has an nlminfo data area (for lockd), release it
269	 */
270	if (nlminfo_release_p != NULL && p->p_nlminfo != NULL)
271		(*nlminfo_release_p)(p);
272
273	/*
274	 * Close open files and release open-file table.
275	 * This may block!
276	 */
277	fdfree(td);
278
279	/*
280	 * If this thread tickled GEOM, we need to wait for the giggling to
281	 * stop before we return to userland
282	 */
283	if (td->td_pflags & TDP_GEOM)
284		g_waitidle();
285
286	/*
287	 * Remove ourself from our leader's peer list and wake our leader.
288	 */
289	mtx_lock(&ppeers_lock);
290	if (p->p_leader->p_peers) {
291		q = p->p_leader;
292		while (q->p_peers != p)
293			q = q->p_peers;
294		q->p_peers = p->p_peers;
295		wakeup(p->p_leader);
296	}
297	mtx_unlock(&ppeers_lock);
298
299	vmspace_exit(td);
300
301	sx_xlock(&proctree_lock);
302	if (SESS_LEADER(p)) {
303		struct session *sp;
304
305		sp = p->p_session;
306
307		SESS_LOCK(sp);
308		ttyvp = sp->s_ttyvp;
309		sp->s_ttyvp = NULL;
310		SESS_UNLOCK(sp);
311
312		if (ttyvp != NULL) {
313			/*
314			 * Controlling process.
315			 * Signal foreground pgrp and revoke access to
316			 * controlling terminal.
317			 *
318			 * There is no need to drain the terminal here,
319			 * because this will be done on revocation.
320			 */
321			if (sp->s_ttyp != NULL) {
322				struct tty *tp = sp->s_ttyp;
323
324				tty_lock(tp);
325				tty_signal_pgrp(tp, SIGHUP);
326				tty_unlock(tp);
327
328				/*
329				 * The tty could have been revoked
330				 * if we blocked.
331				 */
332				if (ttyvp->v_type != VBAD) {
333					sx_xunlock(&proctree_lock);
334					VOP_LOCK(ttyvp, LK_EXCLUSIVE);
335					VOP_REVOKE(ttyvp, REVOKEALL);
336					VOP_UNLOCK(ttyvp, 0);
337					sx_xlock(&proctree_lock);
338				}
339			}
340			/*
341			 * s_ttyp is not zero'd; we use this to indicate that
342			 * the session once had a controlling terminal.
343			 * (for logging and informational purposes)
344			 */
345		}
346		SESS_LOCK(p->p_session);
347		sp->s_leader = NULL;
348		SESS_UNLOCK(p->p_session);
349	}
350	fixjobc(p, p->p_pgrp, 0);
351	sx_xunlock(&proctree_lock);
352	(void)acct_process(td);
353
354	/* Release the TTY now we've unlocked everything. */
355	if (ttyvp != NULL)
356		vrele(ttyvp);
357#ifdef KTRACE
358	/*
359	 * Disable tracing, then drain any pending records and release
360	 * the trace file.
361	 */
362	if (p->p_traceflag != 0) {
363		PROC_LOCK(p);
364		mtx_lock(&ktrace_mtx);
365		p->p_traceflag = 0;
366		mtx_unlock(&ktrace_mtx);
367		PROC_UNLOCK(p);
368		ktrprocexit(td);
369		PROC_LOCK(p);
370		mtx_lock(&ktrace_mtx);
371		tracevp = p->p_tracevp;
372		p->p_tracevp = NULL;
373		tracecred = p->p_tracecred;
374		p->p_tracecred = NULL;
375		mtx_unlock(&ktrace_mtx);
376		PROC_UNLOCK(p);
377		if (tracevp != NULL) {
378			locked = VFS_LOCK_GIANT(tracevp->v_mount);
379			vrele(tracevp);
380			VFS_UNLOCK_GIANT(locked);
381		}
382		if (tracecred != NULL)
383			crfree(tracecred);
384	}
385#endif
386	/*
387	 * Release reference to text vnode
388	 */
389	if ((vtmp = p->p_textvp) != NULL) {
390		p->p_textvp = NULL;
391		locked = VFS_LOCK_GIANT(vtmp->v_mount);
392		vrele(vtmp);
393		VFS_UNLOCK_GIANT(locked);
394	}
395
396	/*
397	 * Release our limits structure.
398	 */
399	PROC_LOCK(p);
400	plim = p->p_limit;
401	p->p_limit = NULL;
402	PROC_UNLOCK(p);
403	lim_free(plim);
404
405	/*
406	 * Remove proc from allproc queue and pidhash chain.
407	 * Place onto zombproc.  Unlink from parent's child list.
408	 */
409	sx_xlock(&allproc_lock);
410	LIST_REMOVE(p, p_list);
411	LIST_INSERT_HEAD(&zombproc, p, p_list);
412	LIST_REMOVE(p, p_hash);
413	sx_xunlock(&allproc_lock);
414
415	/*
416	 * Call machine-dependent code to release any
417	 * machine-dependent resources other than the address space.
418	 * The address space is released by "vmspace_exitfree(p)" in
419	 * vm_waitproc().
420	 */
421	cpu_exit(td);
422
423	WITNESS_WARN(WARN_PANIC, NULL, "process (pid %d) exiting", p->p_pid);
424
425	/*
426	 * Reparent all of our children to init.
427	 */
428	sx_xlock(&proctree_lock);
429	q = LIST_FIRST(&p->p_children);
430	if (q != NULL)		/* only need this if any child is S_ZOMB */
431		wakeup(initproc);
432	for (; q != NULL; q = nq) {
433		nq = LIST_NEXT(q, p_sibling);
434		PROC_LOCK(q);
435		proc_reparent(q, initproc);
436		q->p_sigparent = SIGCHLD;
437		/*
438		 * Traced processes are killed
439		 * since their existence means someone is screwing up.
440		 */
441		if (q->p_flag & P_TRACED) {
442			struct thread *temp;
443
444			q->p_flag &= ~(P_TRACED | P_STOPPED_TRACE);
445			FOREACH_THREAD_IN_PROC(q, temp)
446				temp->td_dbgflags &= ~TDB_SUSPEND;
447			psignal(q, SIGKILL);
448		}
449		PROC_UNLOCK(q);
450	}
451
452	/* Save exit status. */
453	PROC_LOCK(p);
454	p->p_xstat = rv;
455	p->p_xthread = td;
456
457	/* In case we are jailed tell the prison that we are gone. */
458	if (jailed(p->p_ucred))
459		prison_proc_free(p->p_ucred->cr_prison);
460
461#ifdef KDTRACE_HOOKS
462	/*
463	 * Tell the DTrace fasttrap provider about the exit if it
464	 * has declared an interest.
465	 */
466	if (dtrace_fasttrap_exit)
467		dtrace_fasttrap_exit(p);
468#endif
469
470	/*
471	 * Notify interested parties of our demise.
472	 */
473	KNOTE_LOCKED(&p->p_klist, NOTE_EXIT);
474
475#ifdef KDTRACE_HOOKS
476	int reason = CLD_EXITED;
477	if (WCOREDUMP(rv))
478		reason = CLD_DUMPED;
479	else if (WIFSIGNALED(rv))
480		reason = CLD_KILLED;
481	SDT_PROBE(proc, kernel, , exit, reason, 0, 0, 0, 0);
482#endif
483
484	/*
485	 * Just delete all entries in the p_klist. At this point we won't
486	 * report any more events, and there are nasty race conditions that
487	 * can beat us if we don't.
488	 */
489	knlist_clear(&p->p_klist, 1);
490
491	/*
492	 * Notify parent that we're gone.  If parent has the PS_NOCLDWAIT
493	 * flag set, or if the handler is set to SIG_IGN, notify process
494	 * 1 instead (and hope it will handle this situation).
495	 */
496	PROC_LOCK(p->p_pptr);
497	mtx_lock(&p->p_pptr->p_sigacts->ps_mtx);
498	if (p->p_pptr->p_sigacts->ps_flag & (PS_NOCLDWAIT | PS_CLDSIGIGN)) {
499		struct proc *pp;
500
501		mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx);
502		pp = p->p_pptr;
503		PROC_UNLOCK(pp);
504		proc_reparent(p, initproc);
505		p->p_sigparent = SIGCHLD;
506		PROC_LOCK(p->p_pptr);
507		/*
508		 * If this was the last child of our parent, notify
509		 * parent, so in case he was wait(2)ing, he will
510		 * continue.
511		 */
512		if (LIST_EMPTY(&pp->p_children))
513			wakeup(pp);
514	} else
515		mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx);
516
517	if (p->p_pptr == initproc)
518		psignal(p->p_pptr, SIGCHLD);
519	else if (p->p_sigparent != 0) {
520		if (p->p_sigparent == SIGCHLD)
521			childproc_exited(p);
522		else	/* LINUX thread */
523			psignal(p->p_pptr, p->p_sigparent);
524	}
525	sx_xunlock(&proctree_lock);
526
527	/*
528	 * The state PRS_ZOMBIE prevents other proesses from sending
529	 * signal to the process, to avoid memory leak, we free memory
530	 * for signal queue at the time when the state is set.
531	 */
532	sigqueue_flush(&p->p_sigqueue);
533	sigqueue_flush(&td->td_sigqueue);
534
535	/*
536	 * We have to wait until after acquiring all locks before
537	 * changing p_state.  We need to avoid all possible context
538	 * switches (including ones from blocking on a mutex) while
539	 * marked as a zombie.  We also have to set the zombie state
540	 * before we release the parent process' proc lock to avoid
541	 * a lost wakeup.  So, we first call wakeup, then we grab the
542	 * sched lock, update the state, and release the parent process'
543	 * proc lock.
544	 */
545	wakeup(p->p_pptr);
546	cv_broadcast(&p->p_pwait);
547	sched_exit(p->p_pptr, td);
548	PROC_SLOCK(p);
549	p->p_state = PRS_ZOMBIE;
550	PROC_UNLOCK(p->p_pptr);
551
552	/*
553	 * Hopefully no one will try to deliver a signal to the process this
554	 * late in the game.
555	 */
556	knlist_destroy(&p->p_klist);
557
558	/*
559	 * Save our children's rusage information in our exit rusage.
560	 */
561	ruadd(&p->p_ru, &p->p_rux, &p->p_stats->p_cru, &p->p_crux);
562
563	/*
564	 * Make sure the scheduler takes this thread out of its tables etc.
565	 * This will also release this thread's reference to the ucred.
566	 * Other thread parts to release include pcb bits and such.
567	 */
568	thread_exit();
569}
570
571
572#ifndef _SYS_SYSPROTO_H_
573struct abort2_args {
574	char *why;
575	int nargs;
576	void **args;
577};
578#endif
579
580int
581abort2(struct thread *td, struct abort2_args *uap)
582{
583	struct proc *p = td->td_proc;
584	struct sbuf *sb;
585	void *uargs[16];
586	int error, i, sig;
587
588	error = 0;	/* satisfy compiler */
589
590	/*
591	 * Do it right now so we can log either proper call of abort2(), or
592	 * note, that invalid argument was passed. 512 is big enough to
593	 * handle 16 arguments' descriptions with additional comments.
594	 */
595	sb = sbuf_new(NULL, NULL, 512, SBUF_FIXEDLEN);
596	sbuf_clear(sb);
597	sbuf_printf(sb, "%s(pid %d uid %d) aborted: ",
598	    p->p_comm, p->p_pid, td->td_ucred->cr_uid);
599	/*
600	 * Since we can't return from abort2(), send SIGKILL in cases, where
601	 * abort2() was called improperly
602	 */
603	sig = SIGKILL;
604	/* Prevent from DoSes from user-space. */
605	if (uap->nargs < 0 || uap->nargs > 16)
606		goto out;
607	if (uap->nargs > 0) {
608		if (uap->args == NULL)
609			goto out;
610		error = copyin(uap->args, uargs, uap->nargs * sizeof(void *));
611		if (error != 0)
612			goto out;
613	}
614	/*
615	 * Limit size of 'reason' string to 128. Will fit even when
616	 * maximal number of arguments was chosen to be logged.
617	 */
618	if (uap->why != NULL) {
619		error = sbuf_copyin(sb, uap->why, 128);
620		if (error < 0)
621			goto out;
622	} else {
623		sbuf_printf(sb, "(null)");
624	}
625	if (uap->nargs > 0) {
626		sbuf_printf(sb, "(");
627		for (i = 0;i < uap->nargs; i++)
628			sbuf_printf(sb, "%s%p", i == 0 ? "" : ", ", uargs[i]);
629		sbuf_printf(sb, ")");
630	}
631	/*
632	 * Final stage: arguments were proper, string has been
633	 * successfully copied from userspace, and copying pointers
634	 * from user-space succeed.
635	 */
636	sig = SIGABRT;
637out:
638	if (sig == SIGKILL) {
639		sbuf_trim(sb);
640		sbuf_printf(sb, " (Reason text inaccessible)");
641	}
642	sbuf_cat(sb, "\n");
643	sbuf_finish(sb);
644	log(LOG_INFO, "%s", sbuf_data(sb));
645	sbuf_delete(sb);
646	exit1(td, W_EXITCODE(0, sig));
647	return (0);
648}
649
650
651#ifdef COMPAT_43
652/*
653 * The dirty work is handled by kern_wait().
654 */
655int
656owait(struct thread *td, struct owait_args *uap __unused)
657{
658	int error, status;
659
660	error = kern_wait(td, WAIT_ANY, &status, 0, NULL);
661	if (error == 0)
662		td->td_retval[1] = status;
663	return (error);
664}
665#endif /* COMPAT_43 */
666
667/*
668 * The dirty work is handled by kern_wait().
669 */
670int
671wait4(struct thread *td, struct wait_args *uap)
672{
673	struct rusage ru, *rup;
674	int error, status;
675
676	if (uap->rusage != NULL)
677		rup = &ru;
678	else
679		rup = NULL;
680	error = kern_wait(td, uap->pid, &status, uap->options, rup);
681	if (uap->status != NULL && error == 0)
682		error = copyout(&status, uap->status, sizeof(status));
683	if (uap->rusage != NULL && error == 0)
684		error = copyout(&ru, uap->rusage, sizeof(struct rusage));
685	return (error);
686}
687
688int
689kern_wait(struct thread *td, pid_t pid, int *status, int options,
690    struct rusage *rusage)
691{
692	struct proc *p, *q, *t;
693	int error, nfound;
694
695	AUDIT_ARG(pid, pid);
696
697	q = td->td_proc;
698	if (pid == 0) {
699		PROC_LOCK(q);
700		pid = -q->p_pgid;
701		PROC_UNLOCK(q);
702	}
703	if (options &~ (WUNTRACED|WNOHANG|WCONTINUED|WNOWAIT|WLINUXCLONE))
704		return (EINVAL);
705loop:
706	if (q->p_flag & P_STATCHILD) {
707		PROC_LOCK(q);
708		q->p_flag &= ~P_STATCHILD;
709		PROC_UNLOCK(q);
710	}
711	nfound = 0;
712	sx_xlock(&proctree_lock);
713	LIST_FOREACH(p, &q->p_children, p_sibling) {
714		PROC_LOCK(p);
715		if (pid != WAIT_ANY &&
716		    p->p_pid != pid && p->p_pgid != -pid) {
717			PROC_UNLOCK(p);
718			continue;
719		}
720		if (p_canwait(td, p)) {
721			PROC_UNLOCK(p);
722			continue;
723		}
724
725		/*
726		 * This special case handles a kthread spawned by linux_clone
727		 * (see linux_misc.c).  The linux_wait4 and linux_waitpid
728		 * functions need to be able to distinguish between waiting
729		 * on a process and waiting on a thread.  It is a thread if
730		 * p_sigparent is not SIGCHLD, and the WLINUXCLONE option
731		 * signifies we want to wait for threads and not processes.
732		 */
733		if ((p->p_sigparent != SIGCHLD) ^
734		    ((options & WLINUXCLONE) != 0)) {
735			PROC_UNLOCK(p);
736			continue;
737		}
738
739		nfound++;
740		PROC_SLOCK(p);
741		if (p->p_state == PRS_ZOMBIE) {
742			if (rusage) {
743				*rusage = p->p_ru;
744				calcru(p, &rusage->ru_utime, &rusage->ru_stime);
745			}
746			PROC_SUNLOCK(p);
747			td->td_retval[0] = p->p_pid;
748			if (status)
749				*status = p->p_xstat;	/* convert to int */
750			if (options & WNOWAIT) {
751
752				/*
753				 *  Only poll, returning the status.
754				 *  Caller does not wish to release the proc
755				 *  struct just yet.
756				 */
757				PROC_UNLOCK(p);
758				sx_xunlock(&proctree_lock);
759				return (0);
760			}
761
762			PROC_LOCK(q);
763			sigqueue_take(p->p_ksi);
764			PROC_UNLOCK(q);
765			PROC_UNLOCK(p);
766
767			/*
768			 * If we got the child via a ptrace 'attach',
769			 * we need to give it back to the old parent.
770			 */
771			if (p->p_oppid && (t = pfind(p->p_oppid)) != NULL) {
772				PROC_LOCK(p);
773				p->p_oppid = 0;
774				proc_reparent(p, t);
775				PROC_UNLOCK(p);
776				tdsignal(t, NULL, SIGCHLD, p->p_ksi);
777				wakeup(t);
778				cv_broadcast(&p->p_pwait);
779				PROC_UNLOCK(t);
780				sx_xunlock(&proctree_lock);
781				return (0);
782			}
783
784			/*
785			 * Remove other references to this process to ensure
786			 * we have an exclusive reference.
787			 */
788			sx_xlock(&allproc_lock);
789			LIST_REMOVE(p, p_list);	/* off zombproc */
790			sx_xunlock(&allproc_lock);
791			LIST_REMOVE(p, p_sibling);
792			leavepgrp(p);
793			sx_xunlock(&proctree_lock);
794
795			/*
796			 * As a side effect of this lock, we know that
797			 * all other writes to this proc are visible now, so
798			 * no more locking is needed for p.
799			 */
800			PROC_LOCK(p);
801			p->p_xstat = 0;		/* XXX: why? */
802			PROC_UNLOCK(p);
803			PROC_LOCK(q);
804			ruadd(&q->p_stats->p_cru, &q->p_crux, &p->p_ru,
805			    &p->p_rux);
806			PROC_UNLOCK(q);
807
808			/*
809			 * Decrement the count of procs running with this uid.
810			 */
811			(void)chgproccnt(p->p_ucred->cr_ruidinfo, -1, 0);
812
813			/*
814			 * Free credentials, arguments, and sigacts.
815			 */
816			crfree(p->p_ucred);
817			p->p_ucred = NULL;
818			pargs_drop(p->p_args);
819			p->p_args = NULL;
820			sigacts_free(p->p_sigacts);
821			p->p_sigacts = NULL;
822
823			/*
824			 * Do any thread-system specific cleanups.
825			 */
826			thread_wait(p);
827
828			/*
829			 * Give vm and machine-dependent layer a chance
830			 * to free anything that cpu_exit couldn't
831			 * release while still running in process context.
832			 */
833			vm_waitproc(p);
834#ifdef MAC
835			mac_proc_destroy(p);
836#endif
837			KASSERT(FIRST_THREAD_IN_PROC(p),
838			    ("kern_wait: no residual thread!"));
839			uma_zfree(proc_zone, p);
840			sx_xlock(&allproc_lock);
841			nprocs--;
842			sx_xunlock(&allproc_lock);
843			return (0);
844		}
845		if ((p->p_flag & P_STOPPED_SIG) &&
846		    (p->p_suspcount == p->p_numthreads) &&
847		    (p->p_flag & P_WAITED) == 0 &&
848		    (p->p_flag & P_TRACED || options & WUNTRACED)) {
849			PROC_SUNLOCK(p);
850			p->p_flag |= P_WAITED;
851			sx_xunlock(&proctree_lock);
852			td->td_retval[0] = p->p_pid;
853			if (status)
854				*status = W_STOPCODE(p->p_xstat);
855
856			PROC_LOCK(q);
857			sigqueue_take(p->p_ksi);
858			PROC_UNLOCK(q);
859			PROC_UNLOCK(p);
860
861			return (0);
862		}
863		PROC_SUNLOCK(p);
864		if (options & WCONTINUED && (p->p_flag & P_CONTINUED)) {
865			sx_xunlock(&proctree_lock);
866			td->td_retval[0] = p->p_pid;
867			p->p_flag &= ~P_CONTINUED;
868
869			PROC_LOCK(q);
870			sigqueue_take(p->p_ksi);
871			PROC_UNLOCK(q);
872			PROC_UNLOCK(p);
873
874			if (status)
875				*status = SIGCONT;
876			return (0);
877		}
878		PROC_UNLOCK(p);
879	}
880	if (nfound == 0) {
881		sx_xunlock(&proctree_lock);
882		return (ECHILD);
883	}
884	if (options & WNOHANG) {
885		sx_xunlock(&proctree_lock);
886		td->td_retval[0] = 0;
887		return (0);
888	}
889	PROC_LOCK(q);
890	sx_xunlock(&proctree_lock);
891	if (q->p_flag & P_STATCHILD) {
892		q->p_flag &= ~P_STATCHILD;
893		error = 0;
894	} else
895		error = msleep(q, &q->p_mtx, PWAIT | PCATCH, "wait", 0);
896	PROC_UNLOCK(q);
897	if (error)
898		return (error);
899	goto loop;
900}
901
902/*
903 * Make process 'parent' the new parent of process 'child'.
904 * Must be called with an exclusive hold of proctree lock.
905 */
906void
907proc_reparent(struct proc *child, struct proc *parent)
908{
909
910	sx_assert(&proctree_lock, SX_XLOCKED);
911	PROC_LOCK_ASSERT(child, MA_OWNED);
912	if (child->p_pptr == parent)
913		return;
914
915	PROC_LOCK(child->p_pptr);
916	sigqueue_take(child->p_ksi);
917	PROC_UNLOCK(child->p_pptr);
918	LIST_REMOVE(child, p_sibling);
919	LIST_INSERT_HEAD(&parent->p_children, child, p_sibling);
920	child->p_pptr = parent;
921}
922