1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2011, Joyent, Inc. All rights reserved.
  25  */
  26 
  27 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  28 
  29 #include <sys/types.h>
  30 #include <sys/param.h>
  31 #include <sys/sysmacros.h>
  32 #include <sys/systm.h>
  33 #include <sys/cred.h>
  34 #include <sys/user.h>
  35 #include <sys/errno.h>
  36 #include <sys/proc.h>
  37 #include <sys/ucontext.h>
  38 #include <sys/procfs.h>
  39 #include <sys/vnode.h>
  40 #include <sys/acct.h>
  41 #include <sys/var.h>
  42 #include <sys/cmn_err.h>
  43 #include <sys/debug.h>
  44 #include <sys/wait.h>
  45 #include <sys/siginfo.h>
  46 #include <sys/procset.h>
  47 #include <sys/class.h>
  48 #include <sys/file.h>
  49 #include <sys/session.h>
  50 #include <sys/kmem.h>
  51 #include <sys/vtrace.h>
  52 #include <sys/prsystm.h>
  53 #include <sys/ipc.h>
  54 #include <sys/sem_impl.h>
  55 #include <c2/audit.h>
  56 #include <sys/aio_impl.h>
  57 #include <vm/as.h>
  58 #include <sys/poll.h>
  59 #include <sys/door.h>
  60 #include <sys/lwpchan_impl.h>
  61 #include <sys/utrap.h>
  62 #include <sys/task.h>
  63 #include <sys/exacct.h>
  64 #include <sys/cyclic.h>
  65 #include <sys/schedctl.h>
  66 #include <sys/rctl.h>
  67 #include <sys/contract_impl.h>
  68 #include <sys/contract/process_impl.h>
  69 #include <sys/list.h>
  70 #include <sys/dtrace.h>
  71 #include <sys/pool.h>
  72 #include <sys/sdt.h>
  73 #include <sys/corectl.h>
  74 #include <sys/brand.h>
  75 #include <sys/libc_kernel.h>
  76 
  77 /*
  78  * convert code/data pair into old style wait status
  79  */
  80 int
  81 wstat(int code, int data)
  82 {
  83         int stat = (data & 0377);
  84 
  85         switch (code) {
  86         case CLD_EXITED:
  87                 stat <<= 8;
  88                 break;
  89         case CLD_DUMPED:
  90                 stat |= WCOREFLG;
  91                 break;
  92         case CLD_KILLED:
  93                 break;
  94         case CLD_TRAPPED:
  95         case CLD_STOPPED:
  96                 stat <<= 8;
  97                 stat |= WSTOPFLG;
  98                 break;
  99         case CLD_CONTINUED:
 100                 stat = WCONTFLG;
 101                 break;
 102         default:
 103                 cmn_err(CE_PANIC, "wstat: bad code");
 104                 /* NOTREACHED */
 105         }
 106         return (stat);
 107 }
 108 
 109 static char *
 110 exit_reason(char *buf, size_t bufsz, int what, int why)
 111 {
 112         switch (why) {
 113         case CLD_EXITED:
 114                 (void) snprintf(buf, bufsz, "exited with status %d", what);
 115                 break;
 116         case CLD_KILLED:
 117                 (void) snprintf(buf, bufsz, "exited on fatal signal %d", what);
 118                 break;
 119         case CLD_DUMPED:
 120                 (void) snprintf(buf, bufsz, "core dumped on signal %d", what);
 121                 break;
 122         default:
 123                 (void) snprintf(buf, bufsz, "encountered unknown error "
 124                     "(%d, %d)", why, what);
 125                 break;
 126         }
 127 
 128         return (buf);
 129 }
 130 
 131 /*
 132  * exit system call: pass back caller's arg.
 133  */
 134 void
 135 rexit(int rval)
 136 {
 137         exit(CLD_EXITED, rval);
 138 }
 139 
 140 /*
 141  * Called by proc_exit() when a zone's init exits, presumably because
 142  * it failed.  As long as the given zone is still in the "running"
 143  * state, we will re-exec() init, but first we need to reset things
 144  * which are usually inherited across exec() but will break init's
 145  * assumption that it is being exec()'d from a virgin process.  Most
 146  * importantly this includes closing all file descriptors (exec only
 147  * closes those marked close-on-exec) and resetting signals (exec only
 148  * resets handled signals, and we need to clear any signals which
 149  * killed init).  Anything else that exec(2) says would be inherited,
 150  * but would affect the execution of init, needs to be reset.
 151  */
 152 static int
 153 restart_init(int what, int why)
 154 {
 155         kthread_t *t = curthread;
 156         klwp_t *lwp = ttolwp(t);
 157         proc_t *p = ttoproc(t);
 158         user_t *up = PTOU(p);
 159 
 160         vnode_t *oldcd, *oldrd;
 161         int i, err;
 162         char reason_buf[64];
 163 
 164         /*
 165          * Let zone admin (and global zone admin if this is for a non-global
 166          * zone) know that init has failed and will be restarted.
 167          */
 168         zcmn_err(p->p_zone->zone_id, CE_WARN,
 169             "init(1M) %s: restarting automatically",
 170             exit_reason(reason_buf, sizeof (reason_buf), what, why));
 171 
 172         if (!INGLOBALZONE(p)) {
 173                 cmn_err(CE_WARN, "init(1M) for zone %s (pid %d) %s: "
 174                     "restarting automatically",
 175                     p->p_zone->zone_name, p->p_pid, reason_buf);
 176         }
 177 
 178         /*
 179          * Remove any fpollinfo_t's for this (last) thread from our file
 180          * descriptors so closeall() can ASSERT() that they're all gone.
 181          * Then close all open file descriptors in the process.
 182          */
 183         pollcleanup();
 184         closeall(P_FINFO(p));
 185 
 186         /*
 187          * Grab p_lock and begin clearing miscellaneous global process
 188          * state that needs to be reset before we exec the new init(1M).
 189          */
 190 
 191         mutex_enter(&p->p_lock);
 192         prbarrier(p);
 193 
 194         p->p_flag &= ~(SKILLED | SEXTKILLED | SEXITING | SDOCORE);
 195         up->u_cmask = CMASK;
 196 
 197         sigemptyset(&t->t_hold);
 198         sigemptyset(&t->t_sig);
 199         sigemptyset(&t->t_extsig);
 200 
 201         sigemptyset(&p->p_sig);
 202         sigemptyset(&p->p_extsig);
 203 
 204         sigdelq(p, t, 0);
 205         sigdelq(p, NULL, 0);
 206 
 207         if (p->p_killsqp) {
 208                 siginfofree(p->p_killsqp);
 209                 p->p_killsqp = NULL;
 210         }
 211 
 212         /*
 213          * Reset any signals that are ignored back to the default disposition.
 214          * Other u_signal members will be cleared when exec calls sigdefault().
 215          */
 216         for (i = 1; i < NSIG; i++) {
 217                 if (up->u_signal[i - 1] == SIG_IGN) {
 218                         up->u_signal[i - 1] = SIG_DFL;
 219                         sigemptyset(&up->u_sigmask[i - 1]);
 220                 }
 221         }
 222 
 223         /*
 224          * Clear the current signal, any signal info associated with it, and
 225          * any signal information from contracts and/or contract templates.
 226          */
 227         lwp->lwp_cursig = 0;
 228         lwp->lwp_extsig = 0;
 229         if (lwp->lwp_curinfo != NULL) {
 230                 siginfofree(lwp->lwp_curinfo);
 231                 lwp->lwp_curinfo = NULL;
 232         }
 233         lwp_ctmpl_clear(lwp);
 234 
 235         /*
 236          * Reset both the process root directory and the current working
 237          * directory to the root of the zone just as we do during boot.
 238          */
 239         VN_HOLD(p->p_zone->zone_rootvp);
 240         oldrd = up->u_rdir;
 241         up->u_rdir = p->p_zone->zone_rootvp;
 242 
 243         VN_HOLD(p->p_zone->zone_rootvp);
 244         oldcd = up->u_cdir;
 245         up->u_cdir = p->p_zone->zone_rootvp;
 246 
 247         if (up->u_cwd != NULL) {
 248                 refstr_rele(up->u_cwd);
 249                 up->u_cwd = NULL;
 250         }
 251 
 252         mutex_exit(&p->p_lock);
 253 
 254         if (oldrd != NULL)
 255                 VN_RELE(oldrd);
 256         if (oldcd != NULL)
 257                 VN_RELE(oldcd);
 258 
 259         /* Free the controlling tty.  (freectty() always assumes curproc.) */
 260         ASSERT(p == curproc);
 261         (void) freectty(B_TRUE);
 262 
 263         /*
 264          * Now exec() the new init(1M) on top of the current process.  If we
 265          * succeed, the caller will treat this like a successful system call.
 266          * If we fail, we issue messages and the caller will proceed with exit.
 267          */
 268         err = exec_init(p->p_zone->zone_initname, NULL);
 269 
 270         if (err == 0)
 271                 return (0);
 272 
 273         zcmn_err(p->p_zone->zone_id, CE_WARN,
 274             "failed to restart init(1M) (err=%d): system reboot required", err);
 275 
 276         if (!INGLOBALZONE(p)) {
 277                 cmn_err(CE_WARN, "failed to restart init(1M) for zone %s "
 278                     "(pid %d, err=%d): zoneadm(1M) boot required",
 279                     p->p_zone->zone_name, p->p_pid, err);
 280         }
 281 
 282         return (-1);
 283 }
 284 
 285 /*
 286  * Release resources.
 287  * Enter zombie state.
 288  * Wake up parent and init processes,
 289  * and dispose of children.
 290  */
 291 void
 292 exit(int why, int what)
 293 {
 294         /*
 295          * If proc_exit() fails, then some other lwp in the process
 296          * got there first.  We just have to call lwp_exit() to allow
 297          * the other lwp to finish exiting the process.  Otherwise we're
 298          * restarting init, and should return.
 299          */
 300         if (proc_exit(why, what) != 0) {
 301                 mutex_enter(&curproc->p_lock);
 302                 ASSERT(curproc->p_flag & SEXITLWPS);
 303                 lwp_exit();
 304                 /* NOTREACHED */
 305         }
 306 }
 307 
 308 /*
 309  * Set the SEXITING flag on the process, after making sure /proc does
 310  * not have it locked.  This is done in more places than proc_exit(),
 311  * so it is a separate function.
 312  */
 313 void
 314 proc_is_exiting(proc_t *p)
 315 {
 316         mutex_enter(&p->p_lock);
 317         prbarrier(p);
 318         p->p_flag |= SEXITING;
 319         mutex_exit(&p->p_lock);
 320 }
 321 
 322 /*
 323  * Return value:
 324  *   1 - exitlwps() failed, call (or continue) lwp_exit()
 325  *   0 - restarting init.  Return through system call path
 326  */
 327 int
 328 proc_exit(int why, int what)
 329 {
 330         kthread_t *t = curthread;
 331         klwp_t *lwp = ttolwp(t);
 332         proc_t *p = ttoproc(t);
 333         zone_t *z = p->p_zone;
 334         timeout_id_t tmp_id;
 335         int rv;
 336         proc_t *q;
 337         task_t *tk;
 338         vnode_t *exec_vp, *execdir_vp, *cdir, *rdir;
 339         sigqueue_t *sqp;
 340         lwpdir_t *lwpdir;
 341         uint_t lwpdir_sz;
 342         tidhash_t *tidhash;
 343         uint_t tidhash_sz;
 344         ret_tidhash_t *ret_tidhash;
 345         refstr_t *cwd;
 346         hrtime_t hrutime, hrstime;
 347         int evaporate;
 348 
 349         /*
 350          * Stop and discard the process's lwps except for the current one,
 351          * unless some other lwp beat us to it.  If exitlwps() fails then
 352          * return and the calling lwp will call (or continue in) lwp_exit().
 353          */
 354         proc_is_exiting(p);
 355         if (exitlwps(0) != 0)
 356                 return (1);
 357 
 358         mutex_enter(&p->p_lock);
 359         if (p->p_ttime > 0) {
 360                 /*
 361                  * Account any remaining ticks charged to this process
 362                  * on its way out.
 363                  */
 364                 (void) task_cpu_time_incr(p->p_task, p->p_ttime);
 365                 p->p_ttime = 0;
 366         }
 367         mutex_exit(&p->p_lock);
 368 
 369         DTRACE_PROC(lwp__exit);
 370         DTRACE_PROC1(exit, int, why);
 371 
 372         /*
 373          * Will perform any brand specific proc exit processing, since this
 374          * is always the last lwp, will also perform lwp_exit and free brand
 375          * data
 376          */
 377         if (PROC_IS_BRANDED(p)) {
 378                 lwp_detach_brand_hdlrs(lwp);
 379                 brand_clearbrand(p, B_FALSE);
 380         }
 381 
 382         /*
 383          * Don't let init exit unless zone_start_init() failed its exec, or
 384          * we are shutting down the zone or the machine.
 385          *
 386          * Since we are single threaded, we don't need to lock the
 387          * following accesses to zone_proc_initpid.
 388          */
 389         if (p->p_pid == z->zone_proc_initpid) {
 390                 if (z->zone_boot_err == 0 &&
 391                     zone_status_get(z) < ZONE_IS_SHUTTING_DOWN &&
 392                     zone_status_get(global_zone) < ZONE_IS_SHUTTING_DOWN) {
 393                         if (z->zone_restart_init == B_TRUE) {
 394                                 if (restart_init(what, why) == 0)
 395                                         return (0);
 396                         } else {
 397                                 (void) zone_kadmin(A_SHUTDOWN, AD_HALT, NULL,
 398                                     CRED());
 399                         }
 400                 }
 401 
 402                 /*
 403                  * Since we didn't or couldn't restart init, we clear
 404                  * the zone's init state and proceed with exit
 405                  * processing.
 406                  */
 407                 z->zone_proc_initpid = -1;
 408         }
 409 
 410         lwp_pcb_exit();
 411 
 412         /*
 413          * Allocate a sigqueue now, before we grab locks.
 414          * It will be given to sigcld(), below.
 415          * Special case:  If we will be making the process disappear
 416          * without a trace because it is either:
 417          *      * an exiting SSYS process, or
 418          *      * a posix_spawn() vfork child who requests it,
 419          * we don't bother to allocate a useless sigqueue.
 420          */
 421         evaporate = (p->p_flag & SSYS) || ((p->p_flag & SVFORK) &&
 422             why == CLD_EXITED && what == _EVAPORATE);
 423         if (!evaporate)
 424                 sqp = kmem_zalloc(sizeof (sigqueue_t), KM_SLEEP);
 425 
 426         /*
 427          * revoke any doors created by the process.
 428          */
 429         if (p->p_door_list)
 430                 door_exit();
 431 
 432         /*
 433          * Release schedctl data structures.
 434          */
 435         if (p->p_pagep)
 436                 schedctl_proc_cleanup();
 437 
 438         /*
 439          * make sure all pending kaio has completed.
 440          */
 441         if (p->p_aio)
 442                 aio_cleanup_exit();
 443 
 444         /*
 445          * discard the lwpchan cache.
 446          */
 447         if (p->p_lcp != NULL)
 448                 lwpchan_destroy_cache(0);
 449 
 450         /*
 451          * Clean up any DTrace helper actions or probes for the process.
 452          */
 453         if (p->p_dtrace_helpers != NULL) {
 454                 ASSERT(dtrace_helpers_cleanup != NULL);
 455                 (*dtrace_helpers_cleanup)();
 456         }
 457 
 458         /*
 459          * Clean up any signalfd state for the process.
 460          */
 461         if (p->p_sigfd != NULL) {
 462                 VERIFY(sigfd_exit_helper != NULL);
 463                 (*sigfd_exit_helper)();
 464         }
 465 
 466         /* untimeout the realtime timers */
 467         if (p->p_itimer != NULL)
 468                 timer_exit();
 469 
 470         if ((tmp_id = p->p_alarmid) != 0) {
 471                 p->p_alarmid = 0;
 472                 (void) untimeout(tmp_id);
 473         }
 474 
 475         /*
 476          * Remove any fpollinfo_t's for this (last) thread from our file
 477          * descriptors so closeall() can ASSERT() that they're all gone.
 478          */
 479         pollcleanup();
 480 
 481         if (p->p_rprof_cyclic != CYCLIC_NONE) {
 482                 mutex_enter(&cpu_lock);
 483                 cyclic_remove(p->p_rprof_cyclic);
 484                 mutex_exit(&cpu_lock);
 485         }
 486 
 487         mutex_enter(&p->p_lock);
 488 
 489         /*
 490          * Clean up any DTrace probes associated with this process.
 491          */
 492         if (p->p_dtrace_probes) {
 493                 ASSERT(dtrace_fasttrap_exit_ptr != NULL);
 494                 dtrace_fasttrap_exit_ptr(p);
 495         }
 496 
 497         while ((tmp_id = p->p_itimerid) != 0) {
 498                 p->p_itimerid = 0;
 499                 mutex_exit(&p->p_lock);
 500                 (void) untimeout(tmp_id);
 501                 mutex_enter(&p->p_lock);
 502         }
 503 
 504         lwp_cleanup();
 505 
 506         /*
 507          * We are about to exit; prevent our resource associations from
 508          * being changed.
 509          */
 510         pool_barrier_enter();
 511 
 512         /*
 513          * Block the process against /proc now that we have really
 514          * acquired p->p_lock (to manipulate p_tlist at least).
 515          */
 516         prbarrier(p);
 517 
 518         sigfillset(&p->p_ignore);
 519         sigemptyset(&p->p_siginfo);
 520         sigemptyset(&p->p_sig);
 521         sigemptyset(&p->p_extsig);
 522         sigemptyset(&t->t_sig);
 523         sigemptyset(&t->t_extsig);
 524         sigemptyset(&p->p_sigmask);
 525         sigdelq(p, t, 0);
 526         lwp->lwp_cursig = 0;
 527         lwp->lwp_extsig = 0;
 528         p->p_flag &= ~(SKILLED | SEXTKILLED);
 529         if (lwp->lwp_curinfo) {
 530                 siginfofree(lwp->lwp_curinfo);
 531                 lwp->lwp_curinfo = NULL;
 532         }
 533 
 534         t->t_proc_flag |= TP_LWPEXIT;
 535         ASSERT(p->p_lwpcnt == 1 && p->p_zombcnt == 0);
 536         prlwpexit(t);           /* notify /proc */
 537         lwp_hash_out(p, t->t_tid);
 538         prexit(p);
 539 
 540         p->p_lwpcnt = 0;
 541         p->p_tlist = NULL;
 542         sigqfree(p);
 543         term_mstate(t);
 544         p->p_mterm = gethrtime();
 545 
 546         exec_vp = p->p_exec;
 547         execdir_vp = p->p_execdir;
 548         p->p_exec = NULLVP;
 549         p->p_execdir = NULLVP;
 550         mutex_exit(&p->p_lock);
 551 
 552         pr_free_watched_pages(p);
 553 
 554         closeall(P_FINFO(p));
 555 
 556         /* Free the controlling tty.  (freectty() always assumes curproc.) */
 557         ASSERT(p == curproc);
 558         (void) freectty(B_TRUE);
 559 
 560 #if defined(__sparc)
 561         if (p->p_utraps != NULL)
 562                 utrap_free(p);
 563 #endif
 564         if (p->p_semacct)                    /* IPC semaphore exit */
 565                 semexit(p);
 566         rv = wstat(why, what);
 567 
 568         acct(rv & 0xff);
 569         exacct_commit_proc(p, rv);
 570 
 571         /*
 572          * Release any resources associated with C2 auditing
 573          */
 574         if (AU_AUDITING()) {
 575                 /*
 576                  * audit exit system call
 577                  */
 578                 audit_exit(why, what);
 579         }
 580 
 581         /*
 582          * Free address space.
 583          */
 584         relvm();
 585 
 586         if (exec_vp) {
 587                 /*
 588                  * Close this executable which has been opened when the process
 589                  * was created by getproc().
 590                  */
 591                 (void) VOP_CLOSE(exec_vp, FREAD, 1, (offset_t)0, CRED(), NULL);
 592                 VN_RELE(exec_vp);
 593         }
 594         if (execdir_vp)
 595                 VN_RELE(execdir_vp);
 596 
 597         /*
 598          * Release held contracts.
 599          */
 600         contract_exit(p);
 601 
 602         /*
 603          * Depart our encapsulating process contract.
 604          */
 605         if ((p->p_flag & SSYS) == 0) {
 606                 ASSERT(p->p_ct_process);
 607                 contract_process_exit(p->p_ct_process, p, rv);
 608         }
 609 
 610         /*
 611          * Remove pool association, and block if requested by pool_do_bind.
 612          */
 613         mutex_enter(&p->p_lock);
 614         ASSERT(p->p_pool->pool_ref > 0);
 615         atomic_dec_32(&p->p_pool->pool_ref);
 616         p->p_pool = pool_default;
 617         /*
 618          * Now that our address space has been freed and all other threads
 619          * in this process have exited, set the PEXITED pool flag.  This
 620          * tells the pools subsystems to ignore this process if it was
 621          * requested to rebind this process to a new pool.
 622          */
 623         p->p_poolflag |= PEXITED;
 624         pool_barrier_exit();
 625         mutex_exit(&p->p_lock);
 626 
 627         mutex_enter(&pidlock);
 628 
 629         /*
 630          * Delete this process from the newstate list of its parent. We
 631          * will put it in the right place in the sigcld in the end.
 632          */
 633         delete_ns(p->p_parent, p);
 634 
 635         /*
 636          * Reassign the orphans to the next of kin.
 637          * Don't rearrange init's orphanage.
 638          */
 639         if ((q = p->p_orphan) != NULL && p != proc_init) {
 640 
 641                 proc_t *nokp = p->p_nextofkin;
 642 
 643                 for (;;) {
 644                         q->p_nextofkin = nokp;
 645                         if (q->p_nextorph == NULL)
 646                                 break;
 647                         q = q->p_nextorph;
 648                 }
 649                 q->p_nextorph = nokp->p_orphan;
 650                 nokp->p_orphan = p->p_orphan;
 651                 p->p_orphan = NULL;
 652         }
 653 
 654         /*
 655          * Reassign the children to init.
 656          * Don't try to assign init's children to init.
 657          */
 658         if ((q = p->p_child) != NULL && p != proc_init) {
 659                 struct proc     *np;
 660                 struct proc     *initp = proc_init;
 661                 boolean_t       setzonetop = B_FALSE;
 662 
 663                 if (!INGLOBALZONE(curproc))
 664                         setzonetop = B_TRUE;
 665 
 666                 pgdetach(p);
 667 
 668                 do {
 669                         np = q->p_sibling;
 670                         /*
 671                          * Delete it from its current parent new state
 672                          * list and add it to init new state list
 673                          */
 674                         delete_ns(q->p_parent, q);
 675 
 676                         q->p_ppid = 1;
 677                         q->p_pidflag &= ~(CLDNOSIGCHLD | CLDWAITPID);
 678                         if (setzonetop) {
 679                                 mutex_enter(&q->p_lock);
 680                                 q->p_flag |= SZONETOP;
 681                                 mutex_exit(&q->p_lock);
 682                         }
 683                         q->p_parent = initp;
 684 
 685                         /*
 686                          * Since q will be the first child,
 687                          * it will not have a previous sibling.
 688                          */
 689                         q->p_psibling = NULL;
 690                         if (initp->p_child) {
 691                                 initp->p_child->p_psibling = q;
 692                         }
 693                         q->p_sibling = initp->p_child;
 694                         initp->p_child = q;
 695                         if (q->p_proc_flag & P_PR_PTRACE) {
 696                                 mutex_enter(&q->p_lock);
 697                                 sigtoproc(q, NULL, SIGKILL);
 698                                 mutex_exit(&q->p_lock);
 699                         }
 700                         /*
 701                          * sigcld() will add the child to parents
 702                          * newstate list.
 703                          */
 704                         if (q->p_stat == SZOMB)
 705                                 sigcld(q, NULL);
 706                 } while ((q = np) != NULL);
 707 
 708                 p->p_child = NULL;
 709                 ASSERT(p->p_child_ns == NULL);
 710         }
 711 
 712         TRACE_1(TR_FAC_PROC, TR_PROC_EXIT, "proc_exit: %p", p);
 713 
 714         mutex_enter(&p->p_lock);
 715         CL_EXIT(curthread); /* tell the scheduler that curthread is exiting */
 716 
 717         /*
 718          * Have our task accummulate our resource usage data before they
 719          * become contaminated by p_cacct etc., and before we renounce
 720          * membership of the task.
 721          *
 722          * We do this regardless of whether or not task accounting is active.
 723          * This is to avoid having nonsense data reported for this task if
 724          * task accounting is subsequently enabled. The overhead is minimal;
 725          * by this point, this process has accounted for the usage of all its
 726          * LWPs. We nonetheless do the work here, and under the protection of
 727          * pidlock, so that the movement of the process's usage to the task
 728          * happens at the same time as the removal of the process from the
 729          * task, from the point of view of exacct_snapshot_task_usage().
 730          */
 731         exacct_update_task_mstate(p);
 732 
 733         hrutime = mstate_aggr_state(p, LMS_USER);
 734         hrstime = mstate_aggr_state(p, LMS_SYSTEM);
 735         p->p_utime = (clock_t)NSEC_TO_TICK(hrutime) + p->p_cutime;
 736         p->p_stime = (clock_t)NSEC_TO_TICK(hrstime) + p->p_cstime;
 737 
 738         p->p_acct[LMS_USER]  += p->p_cacct[LMS_USER];
 739         p->p_acct[LMS_SYSTEM]        += p->p_cacct[LMS_SYSTEM];
 740         p->p_acct[LMS_TRAP]  += p->p_cacct[LMS_TRAP];
 741         p->p_acct[LMS_TFAULT]        += p->p_cacct[LMS_TFAULT];
 742         p->p_acct[LMS_DFAULT]        += p->p_cacct[LMS_DFAULT];
 743         p->p_acct[LMS_KFAULT]        += p->p_cacct[LMS_KFAULT];
 744         p->p_acct[LMS_USER_LOCK] += p->p_cacct[LMS_USER_LOCK];
 745         p->p_acct[LMS_SLEEP] += p->p_cacct[LMS_SLEEP];
 746         p->p_acct[LMS_WAIT_CPU]      += p->p_cacct[LMS_WAIT_CPU];
 747         p->p_acct[LMS_STOPPED]       += p->p_cacct[LMS_STOPPED];
 748 
 749         p->p_ru.minflt       += p->p_cru.minflt;
 750         p->p_ru.majflt       += p->p_cru.majflt;
 751         p->p_ru.nswap        += p->p_cru.nswap;
 752         p->p_ru.inblock      += p->p_cru.inblock;
 753         p->p_ru.oublock      += p->p_cru.oublock;
 754         p->p_ru.msgsnd       += p->p_cru.msgsnd;
 755         p->p_ru.msgrcv       += p->p_cru.msgrcv;
 756         p->p_ru.nsignals += p->p_cru.nsignals;
 757         p->p_ru.nvcsw        += p->p_cru.nvcsw;
 758         p->p_ru.nivcsw       += p->p_cru.nivcsw;
 759         p->p_ru.sysc += p->p_cru.sysc;
 760         p->p_ru.ioch += p->p_cru.ioch;
 761 
 762         p->p_stat = SZOMB;
 763         p->p_proc_flag &= ~P_PR_PTRACE;
 764         p->p_wdata = what;
 765         p->p_wcode = (char)why;
 766 
 767         cdir = PTOU(p)->u_cdir;
 768         rdir = PTOU(p)->u_rdir;
 769         cwd = PTOU(p)->u_cwd;
 770 
 771         ASSERT(cdir != NULL || p->p_parent == &p0);
 772 
 773         /*
 774          * Release resource controls, as they are no longer enforceable.
 775          */
 776         rctl_set_free(p->p_rctls);
 777 
 778         /*
 779          * Decrement tk_nlwps counter for our task.max-lwps resource control.
 780          * An extended accounting record, if that facility is active, is
 781          * scheduled to be written.  We cannot give up task and project
 782          * membership at this point because that would allow zombies to escape
 783          * from the max-processes resource controls.  Zombies stay in their
 784          * current task and project until the process table slot is released
 785          * in freeproc().
 786          */
 787         tk = p->p_task;
 788 
 789         mutex_enter(&p->p_zone->zone_nlwps_lock);
 790         tk->tk_nlwps--;
 791         tk->tk_proj->kpj_nlwps--;
 792         p->p_zone->zone_nlwps--;
 793         mutex_exit(&p->p_zone->zone_nlwps_lock);
 794 
 795         /*
 796          * Clear the lwp directory and the lwpid hash table
 797          * now that /proc can't bother us any more.
 798          * We free the memory below, after dropping p->p_lock.
 799          */
 800         lwpdir = p->p_lwpdir;
 801         lwpdir_sz = p->p_lwpdir_sz;
 802         tidhash = p->p_tidhash;
 803         tidhash_sz = p->p_tidhash_sz;
 804         ret_tidhash = p->p_ret_tidhash;
 805         p->p_lwpdir = NULL;
 806         p->p_lwpfree = NULL;
 807         p->p_lwpdir_sz = 0;
 808         p->p_tidhash = NULL;
 809         p->p_tidhash_sz = 0;
 810         p->p_ret_tidhash = NULL;
 811 
 812         /*
 813          * If the process has context ops installed, call the exit routine
 814          * on behalf of this last remaining thread. Normally exitpctx() is
 815          * called during thread_exit() or lwp_exit(), but because this is the
 816          * last thread in the process, we must call it here. By the time
 817          * thread_exit() is called (below), the association with the relevant
 818          * process has been lost.
 819          *
 820          * We also free the context here.
 821          */
 822         if (p->p_pctx) {
 823                 kpreempt_disable();
 824                 exitpctx(p);
 825                 kpreempt_enable();
 826 
 827                 freepctx(p, 0);
 828         }
 829 
 830         /*
 831          * curthread's proc pointer is changed to point to the 'sched'
 832          * process for the corresponding zone, except in the case when
 833          * the exiting process is in fact a zsched instance, in which
 834          * case the proc pointer is set to p0.  We do so, so that the
 835          * process still points at the right zone when we call the VN_RELE()
 836          * below.
 837          *
 838          * This is because curthread's original proc pointer can be freed as
 839          * soon as the child sends a SIGCLD to its parent.  We use zsched so
 840          * that for user processes, even in the final moments of death, the
 841          * process is still associated with its zone.
 842          */
 843         if (p != t->t_procp->p_zone->zone_zsched)
 844                 t->t_procp = t->t_procp->p_zone->zone_zsched;
 845         else
 846                 t->t_procp = &p0;
 847 
 848         mutex_exit(&p->p_lock);
 849         if (!evaporate) {
 850                 p->p_pidflag &= ~CLDPEND;
 851                 sigcld(p, sqp);
 852         } else {
 853                 /*
 854                  * Do what sigcld() would do if the disposition
 855                  * of the SIGCHLD signal were set to be ignored.
 856                  */
 857                 cv_broadcast(&p->p_srwchan_cv);
 858                 freeproc(p);
 859         }
 860         mutex_exit(&pidlock);
 861 
 862         /*
 863          * We don't release u_cdir and u_rdir until SZOMB is set.
 864          * This protects us against dofusers().
 865          */
 866         if (cdir)
 867                 VN_RELE(cdir);
 868         if (rdir)
 869                 VN_RELE(rdir);
 870         if (cwd)
 871                 refstr_rele(cwd);
 872 
 873         /*
 874          * task_rele() may ultimately cause the zone to go away (or
 875          * may cause the last user process in a zone to go away, which
 876          * signals zsched to go away).  So prior to this call, we must
 877          * no longer point at zsched.
 878          */
 879         t->t_procp = &p0;
 880 
 881         kmem_free(lwpdir, lwpdir_sz * sizeof (lwpdir_t));
 882         kmem_free(tidhash, tidhash_sz * sizeof (tidhash_t));
 883         while (ret_tidhash != NULL) {
 884                 ret_tidhash_t *next = ret_tidhash->rth_next;
 885                 kmem_free(ret_tidhash->rth_tidhash,
 886                     ret_tidhash->rth_tidhash_sz * sizeof (tidhash_t));
 887                 kmem_free(ret_tidhash, sizeof (*ret_tidhash));
 888                 ret_tidhash = next;
 889         }
 890 
 891         thread_exit();
 892         /* NOTREACHED */
 893 }
 894 
 895 /*
 896  * Format siginfo structure for wait system calls.
 897  */
 898 void
 899 winfo(proc_t *pp, k_siginfo_t *ip, int waitflag)
 900 {
 901         ASSERT(MUTEX_HELD(&pidlock));
 902 
 903         bzero(ip, sizeof (k_siginfo_t));
 904         ip->si_signo = SIGCLD;
 905         ip->si_code = pp->p_wcode;
 906         ip->si_pid = pp->p_pid;
 907         ip->si_ctid = PRCTID(pp);
 908         ip->si_zoneid = pp->p_zone->zone_id;
 909         ip->si_status = pp->p_wdata;
 910         ip->si_stime = pp->p_stime;
 911         ip->si_utime = pp->p_utime;
 912 
 913         if (waitflag) {
 914                 pp->p_wcode = 0;
 915                 pp->p_wdata = 0;
 916                 pp->p_pidflag &= ~CLDPEND;
 917         }
 918 }
 919 
 920 /*
 921  * Wait system call.
 922  * Search for a terminated (zombie) child,
 923  * finally lay it to rest, and collect its status.
 924  * Look also for stopped children,
 925  * and pass back status from them.
 926  */
 927 int
 928 waitid(idtype_t idtype, id_t id, k_siginfo_t *ip, int options)
 929 {
 930         int found;
 931         proc_t *cp, *pp;
 932         int proc_gone;
 933         int waitflag = !(options & WNOWAIT);
 934 
 935         /*
 936          * Obsolete flag, defined here only for binary compatibility
 937          * with old statically linked executables.  Delete this when
 938          * we no longer care about these old and broken applications.
 939          */
 940 #define _WNOCHLD        0400
 941         options &= ~_WNOCHLD;
 942 
 943         if (options == 0 || (options & ~WOPTMASK))
 944                 return (EINVAL);
 945 
 946         switch (idtype) {
 947         case P_PID:
 948         case P_PGID:
 949                 if (id < 0 || id >= maxpid)
 950                         return (EINVAL);
 951                 /* FALLTHROUGH */
 952         case P_ALL:
 953                 break;
 954         default:
 955                 return (EINVAL);
 956         }
 957 
 958         pp = ttoproc(curthread);
 959 
 960         /*
 961          * lock parent mutex so that sibling chain can be searched.
 962          */
 963         mutex_enter(&pidlock);
 964 
 965         /*
 966          * if we are only looking for exited processes and child_ns list
 967          * is empty no reason to look at all children.
 968          */
 969         if (idtype == P_ALL &&
 970             (options & ~WNOWAIT) == (WNOHANG | WEXITED) &&
 971             pp->p_child_ns == NULL) {
 972                 if (pp->p_child) {
 973                         mutex_exit(&pidlock);
 974                         bzero(ip, sizeof (k_siginfo_t));
 975                         return (0);
 976                 }
 977                 mutex_exit(&pidlock);
 978                 return (ECHILD);
 979         }
 980 
 981         while (pp->p_child != NULL) {
 982 
 983                 proc_gone = 0;
 984 
 985                 for (cp = pp->p_child_ns; cp != NULL; cp = cp->p_sibling_ns) {
 986                         if (idtype != P_PID && (cp->p_pidflag & CLDWAITPID))
 987                                 continue;
 988                         if (idtype == P_PID && id != cp->p_pid)
 989                                 continue;
 990                         if (idtype == P_PGID && id != cp->p_pgrp)
 991                                 continue;
 992 
 993                         switch (cp->p_wcode) {
 994 
 995                         case CLD_TRAPPED:
 996                         case CLD_STOPPED:
 997                         case CLD_CONTINUED:
 998                                 cmn_err(CE_PANIC,
 999                                     "waitid: wrong state %d on the p_newstate"
1000                                     " list", cp->p_wcode);
1001                                 break;
1002 
1003                         case CLD_EXITED:
1004                         case CLD_DUMPED:
1005                         case CLD_KILLED:
1006                                 if (!(options & WEXITED)) {
1007                                         /*
1008                                          * Count how many are already gone
1009                                          * for good.
1010                                          */
1011                                         proc_gone++;
1012                                         break;
1013                                 }
1014                                 if (!waitflag) {
1015                                         winfo(cp, ip, 0);
1016                                 } else {
1017                                         winfo(cp, ip, 1);
1018                                         freeproc(cp);
1019                                 }
1020                                 mutex_exit(&pidlock);
1021                                 if (waitflag) {         /* accept SIGCLD */
1022                                         sigcld_delete(ip);
1023                                         sigcld_repost();
1024                                 }
1025                                 return (0);
1026                         }
1027 
1028                         if (idtype == P_PID)
1029                                 break;
1030                 }
1031 
1032                 /*
1033                  * Wow! None of the threads on the p_sibling_ns list were
1034                  * interesting threads. Check all the kids!
1035                  */
1036                 found = 0;
1037                 for (cp = pp->p_child; cp != NULL; cp = cp->p_sibling) {
1038                         if (idtype == P_PID && id != cp->p_pid)
1039                                 continue;
1040                         if (idtype == P_PGID && id != cp->p_pgrp)
1041                                 continue;
1042 
1043                         switch (cp->p_wcode) {
1044                         case CLD_TRAPPED:
1045                                 if (!(options & WTRAPPED))
1046                                         break;
1047                                 winfo(cp, ip, waitflag);
1048                                 mutex_exit(&pidlock);
1049                                 if (waitflag) {         /* accept SIGCLD */
1050                                         sigcld_delete(ip);
1051                                         sigcld_repost();
1052                                 }
1053                                 return (0);
1054 
1055                         case CLD_STOPPED:
1056                                 if (!(options & WSTOPPED))
1057                                         break;
1058                                 /* Is it still stopped? */
1059                                 mutex_enter(&cp->p_lock);
1060                                 if (!jobstopped(cp)) {
1061                                         mutex_exit(&cp->p_lock);
1062                                         break;
1063                                 }
1064                                 mutex_exit(&cp->p_lock);
1065                                 winfo(cp, ip, waitflag);
1066                                 mutex_exit(&pidlock);
1067                                 if (waitflag) {         /* accept SIGCLD */
1068                                         sigcld_delete(ip);
1069                                         sigcld_repost();
1070                                 }
1071                                 return (0);
1072 
1073                         case CLD_CONTINUED:
1074                                 if (!(options & WCONTINUED))
1075                                         break;
1076                                 winfo(cp, ip, waitflag);
1077                                 mutex_exit(&pidlock);
1078                                 if (waitflag) {         /* accept SIGCLD */
1079                                         sigcld_delete(ip);
1080                                         sigcld_repost();
1081                                 }
1082                                 return (0);
1083 
1084                         case CLD_EXITED:
1085                         case CLD_DUMPED:
1086                         case CLD_KILLED:
1087                                 if (idtype != P_PID &&
1088                                     (cp->p_pidflag & CLDWAITPID))
1089                                         continue;
1090                                 /*
1091                                  * Don't complain if a process was found in
1092                                  * the first loop but we broke out of the loop
1093                                  * because of the arguments passed to us.
1094                                  */
1095                                 if (proc_gone == 0) {
1096                                         cmn_err(CE_PANIC,
1097                                             "waitid: wrong state on the"
1098                                             " p_child list");
1099                                 } else {
1100                                         break;
1101                                 }
1102                         }
1103 
1104                         found++;
1105 
1106                         if (idtype == P_PID)
1107                                 break;
1108                 }
1109 
1110                 /*
1111                  * If we found no interesting processes at all,
1112                  * break out and return ECHILD.
1113                  */
1114                 if (found + proc_gone == 0)
1115                         break;
1116 
1117                 if (options & WNOHANG) {
1118                         mutex_exit(&pidlock);
1119                         bzero(ip, sizeof (k_siginfo_t));
1120                         /*
1121                          * We should set ip->si_signo = SIGCLD,
1122                          * but there is an SVVS test that expects
1123                          * ip->si_signo to be zero in this case.
1124                          */
1125                         return (0);
1126                 }
1127 
1128                 /*
1129                  * If we found no processes of interest that could
1130                  * change state while we wait, we don't wait at all.
1131                  * Get out with ECHILD according to SVID.
1132                  */
1133                 if (found == proc_gone)
1134                         break;
1135 
1136                 if (!cv_wait_sig_swap(&pp->p_cv, &pidlock)) {
1137                         mutex_exit(&pidlock);
1138                         return (EINTR);
1139                 }
1140         }
1141         mutex_exit(&pidlock);
1142         return (ECHILD);
1143 }
1144 
1145 int
1146 waitsys(idtype_t idtype, id_t id, siginfo_t *infop, int options)
1147 {
1148         int error;
1149         k_siginfo_t info;
1150 
1151         if (error = waitid(idtype, id, &info, options))
1152                 return (set_errno(error));
1153         if (copyout(&info, infop, sizeof (k_siginfo_t)))
1154                 return (set_errno(EFAULT));
1155         return (0);
1156 }
1157 
1158 #ifdef _SYSCALL32_IMPL
1159 
1160 int
1161 waitsys32(idtype_t idtype, id_t id, siginfo_t *infop, int options)
1162 {
1163         int error;
1164         k_siginfo_t info;
1165         siginfo32_t info32;
1166 
1167         if (error = waitid(idtype, id, &info, options))
1168                 return (set_errno(error));
1169         siginfo_kto32(&info, &info32);
1170         if (copyout(&info32, infop, sizeof (info32)))
1171                 return (set_errno(EFAULT));
1172         return (0);
1173 }
1174 
1175 #endif  /* _SYSCALL32_IMPL */
1176 
1177 void
1178 proc_detach(proc_t *p)
1179 {
1180         proc_t *q;
1181 
1182         ASSERT(MUTEX_HELD(&pidlock));
1183 
1184         q = p->p_parent;
1185         ASSERT(q != NULL);
1186 
1187         /*
1188          * Take it off the newstate list of its parent
1189          */
1190         delete_ns(q, p);
1191 
1192         if (q->p_child == p) {
1193                 q->p_child = p->p_sibling;
1194                 /*
1195                  * If the parent has no children, it better not
1196                  * have any with new states either!
1197                  */
1198                 ASSERT(q->p_child ? 1 : q->p_child_ns == NULL);
1199         }
1200 
1201         if (p->p_sibling) {
1202                 p->p_sibling->p_psibling = p->p_psibling;
1203         }
1204 
1205         if (p->p_psibling) {
1206                 p->p_psibling->p_sibling = p->p_sibling;
1207         }
1208 }
1209 
1210 /*
1211  * Remove zombie children from the process table.
1212  */
1213 void
1214 freeproc(proc_t *p)
1215 {
1216         proc_t *q;
1217         task_t *tk;
1218 
1219         ASSERT(p->p_stat == SZOMB);
1220         ASSERT(p->p_tlist == NULL);
1221         ASSERT(MUTEX_HELD(&pidlock));
1222 
1223         sigdelq(p, NULL, 0);
1224         if (p->p_killsqp) {
1225                 siginfofree(p->p_killsqp);
1226                 p->p_killsqp = NULL;
1227         }
1228 
1229         prfree(p);      /* inform /proc */
1230 
1231         /*
1232          * Don't free the init processes.
1233          * Other dying processes will access it.
1234          */
1235         if (p == proc_init)
1236                 return;
1237 
1238 
1239         /*
1240          * We wait until now to free the cred structure because a
1241          * zombie process's credentials may be examined by /proc.
1242          * No cred locking needed because there are no threads at this point.
1243          */
1244         upcount_dec(crgetruid(p->p_cred), crgetzoneid(p->p_cred));
1245         crfree(p->p_cred);
1246         if (p->p_corefile != NULL) {
1247                 corectl_path_rele(p->p_corefile);
1248                 p->p_corefile = NULL;
1249         }
1250         if (p->p_content != NULL) {
1251                 corectl_content_rele(p->p_content);
1252                 p->p_content = NULL;
1253         }
1254 
1255         if (p->p_nextofkin && !((p->p_nextofkin->p_flag & SNOWAIT) ||
1256             (PTOU(p->p_nextofkin)->u_signal[SIGCLD - 1] == SIG_IGN))) {
1257                 /*
1258                  * This should still do the right thing since p_utime/stime
1259                  * get set to the correct value on process exit, so it
1260                  * should get properly updated
1261                  */
1262                 p->p_nextofkin->p_cutime += p->p_utime;
1263                 p->p_nextofkin->p_cstime += p->p_stime;
1264 
1265                 p->p_nextofkin->p_cacct[LMS_USER] += p->p_acct[LMS_USER];
1266                 p->p_nextofkin->p_cacct[LMS_SYSTEM] += p->p_acct[LMS_SYSTEM];
1267                 p->p_nextofkin->p_cacct[LMS_TRAP] += p->p_acct[LMS_TRAP];
1268                 p->p_nextofkin->p_cacct[LMS_TFAULT] += p->p_acct[LMS_TFAULT];
1269                 p->p_nextofkin->p_cacct[LMS_DFAULT] += p->p_acct[LMS_DFAULT];
1270                 p->p_nextofkin->p_cacct[LMS_KFAULT] += p->p_acct[LMS_KFAULT];
1271                 p->p_nextofkin->p_cacct[LMS_USER_LOCK]
1272                     += p->p_acct[LMS_USER_LOCK];
1273                 p->p_nextofkin->p_cacct[LMS_SLEEP] += p->p_acct[LMS_SLEEP];
1274                 p->p_nextofkin->p_cacct[LMS_WAIT_CPU]
1275                     += p->p_acct[LMS_WAIT_CPU];
1276                 p->p_nextofkin->p_cacct[LMS_STOPPED] += p->p_acct[LMS_STOPPED];
1277 
1278                 p->p_nextofkin->p_cru.minflt      += p->p_ru.minflt;
1279                 p->p_nextofkin->p_cru.majflt      += p->p_ru.majflt;
1280                 p->p_nextofkin->p_cru.nswap       += p->p_ru.nswap;
1281                 p->p_nextofkin->p_cru.inblock     += p->p_ru.inblock;
1282                 p->p_nextofkin->p_cru.oublock     += p->p_ru.oublock;
1283                 p->p_nextofkin->p_cru.msgsnd      += p->p_ru.msgsnd;
1284                 p->p_nextofkin->p_cru.msgrcv      += p->p_ru.msgrcv;
1285                 p->p_nextofkin->p_cru.nsignals    += p->p_ru.nsignals;
1286                 p->p_nextofkin->p_cru.nvcsw       += p->p_ru.nvcsw;
1287                 p->p_nextofkin->p_cru.nivcsw      += p->p_ru.nivcsw;
1288                 p->p_nextofkin->p_cru.sysc        += p->p_ru.sysc;
1289                 p->p_nextofkin->p_cru.ioch        += p->p_ru.ioch;
1290 
1291         }
1292 
1293         q = p->p_nextofkin;
1294         if (q && q->p_orphan == p)
1295                 q->p_orphan = p->p_nextorph;
1296         else if (q) {
1297                 for (q = q->p_orphan; q; q = q->p_nextorph)
1298                         if (q->p_nextorph == p)
1299                                 break;
1300                 ASSERT(q && q->p_nextorph == p);
1301                 q->p_nextorph = p->p_nextorph;
1302         }
1303 
1304         /*
1305          * The process table slot is being freed, so it is now safe to give up
1306          * task and project membership.
1307          */
1308         mutex_enter(&p->p_lock);
1309         tk = p->p_task;
1310         task_detach(p);
1311         mutex_exit(&p->p_lock);
1312 
1313         proc_detach(p);
1314         pid_exit(p, tk);        /* frees pid and proc structure */
1315 
1316         task_rele(tk);
1317 }
1318 
1319 /*
1320  * Delete process "child" from the newstate list of process "parent"
1321  */
1322 void
1323 delete_ns(proc_t *parent, proc_t *child)
1324 {
1325         proc_t **ns;
1326 
1327         ASSERT(MUTEX_HELD(&pidlock));
1328         ASSERT(child->p_parent == parent);
1329         for (ns = &parent->p_child_ns; *ns != NULL; ns = &(*ns)->p_sibling_ns) {
1330                 if (*ns == child) {
1331 
1332                         ASSERT((*ns)->p_parent == parent);
1333 
1334                         *ns = child->p_sibling_ns;
1335                         child->p_sibling_ns = NULL;
1336                         return;
1337                 }
1338         }
1339 }
1340 
1341 /*
1342  * Add process "child" to the new state list of process "parent"
1343  */
1344 void
1345 add_ns(proc_t *parent, proc_t *child)
1346 {
1347         ASSERT(child->p_sibling_ns == NULL);
1348         child->p_sibling_ns = parent->p_child_ns;
1349         parent->p_child_ns = child;
1350 }