1 /*- 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 30 */ 31 32 #include <sys/cdefs.h> 33 __FBSDID("$FreeBSD$"); 34 35 #include "opt_ktrace.h" 36 #include "opt_kstack_pages.h" 37 38 #include <sys/param.h> 39 #include <sys/systm.h> 40 #include <sys/kernel.h> 41 #include <sys/lock.h> 42 #include <sys/malloc.h> 43 #include <sys/mutex.h> 44 #include <sys/proc.h> 45 #include <sys/refcount.h> 46 #include <sys/sysent.h> 47 #include <sys/sched.h> 48 #include <sys/smp.h> 49 #include <sys/sysctl.h> 50 #include <sys/filedesc.h> 51 #include <sys/tty.h> 52 #include <sys/signalvar.h> 53 #include <sys/sx.h> 54 #include <sys/user.h> 55 #include <sys/jail.h> 56 #include <sys/vnode.h> 57 #include <sys/eventhandler.h> 58 #ifdef KTRACE 59 #include <sys/uio.h> 60 #include <sys/ktrace.h> 61 #endif 62 63 #include <vm/vm.h> 64 #include <vm/vm_extern.h> 65 #include <vm/pmap.h> 66 #include <vm/vm_map.h> 67 #include <vm/uma.h> 68 69 MALLOC_DEFINE(M_PGRP, "pgrp", "process group header"); 70 MALLOC_DEFINE(M_SESSION, "session", "session header"); 71 static MALLOC_DEFINE(M_PROC, "proc", "Proc structures"); 72 MALLOC_DEFINE(M_SUBPROC, "subproc", "Proc sub-structures"); 73 74 static void doenterpgrp(struct proc *, struct pgrp *); 75 static void orphanpg(struct pgrp *pg); 76 static void fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp); 77 static void fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp); 78 static void pgadjustjobc(struct pgrp *pgrp, int entering); 79 static void pgdelete(struct pgrp *); 80 static int proc_ctor(void *mem, int size, void *arg, int flags); 81 static void proc_dtor(void *mem, int size, void *arg); 82 static int proc_init(void *mem, int size, int flags); 83 static void proc_fini(void *mem, int size); 84 85 /* 86 * Other process lists 87 */ 88 struct pidhashhead *pidhashtbl; 89 u_long pidhash; 90 struct pgrphashhead *pgrphashtbl; 91 u_long pgrphash; 92 struct proclist allproc; 93 struct proclist zombproc; 94 struct sx allproc_lock; 95 struct sx proctree_lock; 96 struct mtx ppeers_lock; 97 uma_zone_t proc_zone; 98 uma_zone_t ithread_zone; 99 100 int kstack_pages = KSTACK_PAGES; 101 SYSCTL_INT(_kern, OID_AUTO, kstack_pages, CTLFLAG_RD, &kstack_pages, 0, ""); 102 103 CTASSERT(sizeof(struct kinfo_proc) == KINFO_PROC_SIZE); 104 105 /* 106 * Initialize global process hashing structures. 107 */ 108 void 109 procinit() 110 { 111 112 sx_init(&allproc_lock, "allproc"); 113 sx_init(&proctree_lock, "proctree"); 114 mtx_init(&ppeers_lock, "p_peers", NULL, MTX_DEF); 115 LIST_INIT(&allproc); 116 LIST_INIT(&zombproc); 117 pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash); 118 pgrphashtbl = hashinit(maxproc / 4, M_PROC, &pgrphash); 119 proc_zone = uma_zcreate("PROC", sched_sizeof_proc(), 120 proc_ctor, proc_dtor, proc_init, proc_fini, 121 UMA_ALIGN_PTR, UMA_ZONE_NOFREE); 122 uihashinit(); 123 } 124 125 /* 126 * Prepare a proc for use. 127 */ 128 static int 129 proc_ctor(void *mem, int size, void *arg, int flags) 130 { 131 struct proc *p; 132 133 p = (struct proc *)mem; 134 EVENTHANDLER_INVOKE(process_ctor, p); 135 return (0); 136 } 137 138 /* 139 * Reclaim a proc after use. 140 */ 141 static void 142 proc_dtor(void *mem, int size, void *arg) 143 { 144 struct proc *p; 145 struct thread *td; 146 147 /* INVARIANTS checks go here */ 148 p = (struct proc *)mem; 149 td = FIRST_THREAD_IN_PROC(p); 150 if (td != NULL) { 151 #ifdef INVARIANTS 152 KASSERT((p->p_numthreads == 1), 153 ("bad number of threads in exiting process")); 154 KASSERT(STAILQ_EMPTY(&p->p_ktr), ("proc_dtor: non-empty p_ktr")); 155 #endif 156 /* Dispose of an alternate kstack, if it exists. 157 * XXX What if there are more than one thread in the proc? 158 * The first thread in the proc is special and not 159 * freed, so you gotta do this here. 160 */ 161 if (((p->p_flag & P_KTHREAD) != 0) && (td->td_altkstack != 0)) 162 vm_thread_dispose_altkstack(td); 163 } 164 EVENTHANDLER_INVOKE(process_dtor, p); 165 if (p->p_ksi != NULL) 166 KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue")); 167 } 168 169 /* 170 * Initialize type-stable parts of a proc (when newly created). 171 */ 172 static int 173 proc_init(void *mem, int size, int flags) 174 { 175 struct proc *p; 176 177 p = (struct proc *)mem; 178 p->p_sched = (struct p_sched *)&p[1]; 179 bzero(&p->p_mtx, sizeof(struct mtx)); 180 mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK); 181 mtx_init(&p->p_slock, "process slock", NULL, MTX_SPIN | MTX_RECURSE); 182 TAILQ_INIT(&p->p_threads); /* all threads in proc */ 183 EVENTHANDLER_INVOKE(process_init, p); 184 p->p_stats = pstats_alloc(); 185 return (0); 186 } 187 188 /* 189 * UMA should ensure that this function is never called. 190 * Freeing a proc structure would violate type stability. 191 */ 192 static void 193 proc_fini(void *mem, int size) 194 { 195 #ifdef notnow 196 struct proc *p; 197 198 p = (struct proc *)mem; 199 EVENTHANDLER_INVOKE(process_fini, p); 200 pstats_free(p->p_stats); 201 thread_free(FIRST_THREAD_IN_PROC(p)); 202 mtx_destroy(&p->p_mtx); 203 if (p->p_ksi != NULL) 204 ksiginfo_free(p->p_ksi); 205 #else 206 panic("proc reclaimed"); 207 #endif 208 } 209 210 /* 211 * Is p an inferior of the current process? 212 */ 213 int 214 inferior(p) 215 register struct proc *p; 216 { 217 218 sx_assert(&proctree_lock, SX_LOCKED); 219 for (; p != curproc; p = p->p_pptr) 220 if (p->p_pid == 0) 221 return (0); 222 return (1); 223 } 224 225 /* 226 * Locate a process by number; return only "live" processes -- i.e., neither 227 * zombies nor newly born but incompletely initialized processes. By not 228 * returning processes in the PRS_NEW state, we allow callers to avoid 229 * testing for that condition to avoid dereferencing p_ucred, et al. 230 */ 231 struct proc * 232 pfind(pid) 233 register pid_t pid; 234 { 235 register struct proc *p; 236 237 sx_slock(&allproc_lock); 238 LIST_FOREACH(p, PIDHASH(pid), p_hash) 239 if (p->p_pid == pid) { 240 if (p->p_state == PRS_NEW) { 241 p = NULL; 242 break; 243 } 244 PROC_LOCK(p); 245 break; 246 } 247 sx_sunlock(&allproc_lock); 248 return (p); 249 } 250 251 /* 252 * Locate a process group by number. 253 * The caller must hold proctree_lock. 254 */ 255 struct pgrp * 256 pgfind(pgid) 257 register pid_t pgid; 258 { 259 register struct pgrp *pgrp; 260 261 sx_assert(&proctree_lock, SX_LOCKED); 262 263 LIST_FOREACH(pgrp, PGRPHASH(pgid), pg_hash) { 264 if (pgrp->pg_id == pgid) { 265 PGRP_LOCK(pgrp); 266 return (pgrp); 267 } 268 } 269 return (NULL); 270 } 271 272 /* 273 * Create a new process group. 274 * pgid must be equal to the pid of p. 275 * Begin a new session if required. 276 */ 277 int 278 enterpgrp(p, pgid, pgrp, sess) 279 register struct proc *p; 280 pid_t pgid; 281 struct pgrp *pgrp; 282 struct session *sess; 283 { 284 struct pgrp *pgrp2; 285 286 sx_assert(&proctree_lock, SX_XLOCKED); 287 288 KASSERT(pgrp != NULL, ("enterpgrp: pgrp == NULL")); 289 KASSERT(p->p_pid == pgid, 290 ("enterpgrp: new pgrp and pid != pgid")); 291 292 pgrp2 = pgfind(pgid); 293 294 KASSERT(pgrp2 == NULL, 295 ("enterpgrp: pgrp with pgid exists")); 296 KASSERT(!SESS_LEADER(p), 297 ("enterpgrp: session leader attempted setpgrp")); 298 299 mtx_init(&pgrp->pg_mtx, "process group", NULL, MTX_DEF | MTX_DUPOK); 300 301 if (sess != NULL) { 302 /* 303 * new session 304 */ 305 mtx_init(&sess->s_mtx, "session", NULL, MTX_DEF); 306 mtx_lock(&Giant); /* XXX TTY */ 307 PROC_LOCK(p); 308 p->p_flag &= ~P_CONTROLT; 309 PROC_UNLOCK(p); 310 PGRP_LOCK(pgrp); 311 sess->s_leader = p; 312 sess->s_sid = p->p_pid; 313 sess->s_count = 1; 314 sess->s_ttyvp = NULL; 315 sess->s_ttyp = NULL; 316 bcopy(p->p_session->s_login, sess->s_login, 317 sizeof(sess->s_login)); 318 pgrp->pg_session = sess; 319 KASSERT(p == curproc, 320 ("enterpgrp: mksession and p != curproc")); 321 } else { 322 mtx_lock(&Giant); /* XXX TTY */ 323 pgrp->pg_session = p->p_session; 324 SESS_LOCK(pgrp->pg_session); 325 pgrp->pg_session->s_count++; 326 SESS_UNLOCK(pgrp->pg_session); 327 PGRP_LOCK(pgrp); 328 } 329 pgrp->pg_id = pgid; 330 LIST_INIT(&pgrp->pg_members); 331 332 /* 333 * As we have an exclusive lock of proctree_lock, 334 * this should not deadlock. 335 */ 336 LIST_INSERT_HEAD(PGRPHASH(pgid), pgrp, pg_hash); 337 pgrp->pg_jobc = 0; 338 SLIST_INIT(&pgrp->pg_sigiolst); 339 PGRP_UNLOCK(pgrp); 340 mtx_unlock(&Giant); /* XXX TTY */ 341 342 doenterpgrp(p, pgrp); 343 344 return (0); 345 } 346 347 /* 348 * Move p to an existing process group 349 */ 350 int 351 enterthispgrp(p, pgrp) 352 register struct proc *p; 353 struct pgrp *pgrp; 354 { 355 356 sx_assert(&proctree_lock, SX_XLOCKED); 357 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 358 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 359 PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); 360 SESS_LOCK_ASSERT(p->p_session, MA_NOTOWNED); 361 KASSERT(pgrp->pg_session == p->p_session, 362 ("%s: pgrp's session %p, p->p_session %p.\n", 363 __func__, 364 pgrp->pg_session, 365 p->p_session)); 366 KASSERT(pgrp != p->p_pgrp, 367 ("%s: p belongs to pgrp.", __func__)); 368 369 doenterpgrp(p, pgrp); 370 371 return (0); 372 } 373 374 /* 375 * Move p to a process group 376 */ 377 static void 378 doenterpgrp(p, pgrp) 379 struct proc *p; 380 struct pgrp *pgrp; 381 { 382 struct pgrp *savepgrp; 383 384 sx_assert(&proctree_lock, SX_XLOCKED); 385 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 386 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 387 PGRP_LOCK_ASSERT(p->p_pgrp, MA_NOTOWNED); 388 SESS_LOCK_ASSERT(p->p_session, MA_NOTOWNED); 389 390 savepgrp = p->p_pgrp; 391 392 /* 393 * Adjust eligibility of affected pgrps to participate in job control. 394 * Increment eligibility counts before decrementing, otherwise we 395 * could reach 0 spuriously during the first call. 396 */ 397 fixjobc(p, pgrp, 1); 398 fixjobc(p, p->p_pgrp, 0); 399 400 mtx_lock(&Giant); /* XXX TTY */ 401 PGRP_LOCK(pgrp); 402 PGRP_LOCK(savepgrp); 403 PROC_LOCK(p); 404 LIST_REMOVE(p, p_pglist); 405 p->p_pgrp = pgrp; 406 PROC_UNLOCK(p); 407 LIST_INSERT_HEAD(&pgrp->pg_members, p, p_pglist); 408 PGRP_UNLOCK(savepgrp); 409 PGRP_UNLOCK(pgrp); 410 mtx_unlock(&Giant); /* XXX TTY */ 411 if (LIST_EMPTY(&savepgrp->pg_members)) 412 pgdelete(savepgrp); 413 } 414 415 /* 416 * remove process from process group 417 */ 418 int 419 leavepgrp(p) 420 register struct proc *p; 421 { 422 struct pgrp *savepgrp; 423 424 sx_assert(&proctree_lock, SX_XLOCKED); 425 savepgrp = p->p_pgrp; 426 mtx_lock(&Giant); /* XXX TTY */ 427 PGRP_LOCK(savepgrp); 428 PROC_LOCK(p); 429 LIST_REMOVE(p, p_pglist); 430 p->p_pgrp = NULL; 431 PROC_UNLOCK(p); 432 PGRP_UNLOCK(savepgrp); 433 mtx_unlock(&Giant); /* XXX TTY */ 434 if (LIST_EMPTY(&savepgrp->pg_members)) 435 pgdelete(savepgrp); 436 return (0); 437 } 438 439 /* 440 * delete a process group 441 */ 442 static void 443 pgdelete(pgrp) 444 register struct pgrp *pgrp; 445 { 446 struct session *savesess; 447 448 sx_assert(&proctree_lock, SX_XLOCKED); 449 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 450 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); 451 452 /* 453 * Reset any sigio structures pointing to us as a result of 454 * F_SETOWN with our pgid. 455 */ 456 funsetownlst(&pgrp->pg_sigiolst); 457 458 mtx_lock(&Giant); /* XXX TTY */ 459 PGRP_LOCK(pgrp); 460 if (pgrp->pg_session->s_ttyp != NULL && 461 pgrp->pg_session->s_ttyp->t_pgrp == pgrp) 462 pgrp->pg_session->s_ttyp->t_pgrp = NULL; 463 LIST_REMOVE(pgrp, pg_hash); 464 savesess = pgrp->pg_session; 465 SESSRELE(savesess); 466 PGRP_UNLOCK(pgrp); 467 mtx_destroy(&pgrp->pg_mtx); 468 FREE(pgrp, M_PGRP); 469 mtx_unlock(&Giant); /* XXX TTY */ 470 } 471 472 static void 473 pgadjustjobc(pgrp, entering) 474 struct pgrp *pgrp; 475 int entering; 476 { 477 478 PGRP_LOCK(pgrp); 479 if (entering) 480 pgrp->pg_jobc++; 481 else { 482 --pgrp->pg_jobc; 483 if (pgrp->pg_jobc == 0) 484 orphanpg(pgrp); 485 } 486 PGRP_UNLOCK(pgrp); 487 } 488 489 /* 490 * Adjust pgrp jobc counters when specified process changes process group. 491 * We count the number of processes in each process group that "qualify" 492 * the group for terminal job control (those with a parent in a different 493 * process group of the same session). If that count reaches zero, the 494 * process group becomes orphaned. Check both the specified process' 495 * process group and that of its children. 496 * entering == 0 => p is leaving specified group. 497 * entering == 1 => p is entering specified group. 498 */ 499 void 500 fixjobc(p, pgrp, entering) 501 register struct proc *p; 502 register struct pgrp *pgrp; 503 int entering; 504 { 505 register struct pgrp *hispgrp; 506 register struct session *mysession; 507 508 sx_assert(&proctree_lock, SX_LOCKED); 509 PROC_LOCK_ASSERT(p, MA_NOTOWNED); 510 PGRP_LOCK_ASSERT(pgrp, MA_NOTOWNED); 511 SESS_LOCK_ASSERT(pgrp->pg_session, MA_NOTOWNED); 512 513 /* 514 * Check p's parent to see whether p qualifies its own process 515 * group; if so, adjust count for p's process group. 516 */ 517 mysession = pgrp->pg_session; 518 if ((hispgrp = p->p_pptr->p_pgrp) != pgrp && 519 hispgrp->pg_session == mysession) 520 pgadjustjobc(pgrp, entering); 521 522 /* 523 * Check this process' children to see whether they qualify 524 * their process groups; if so, adjust counts for children's 525 * process groups. 526 */ 527 LIST_FOREACH(p, &p->p_children, p_sibling) { 528 hispgrp = p->p_pgrp; 529 if (hispgrp == pgrp || 530 hispgrp->pg_session != mysession) 531 continue; 532 PROC_LOCK(p); 533 if (p->p_state == PRS_ZOMBIE) { 534 PROC_UNLOCK(p); 535 continue; 536 } 537 PROC_UNLOCK(p); 538 pgadjustjobc(hispgrp, entering); 539 } 540 } 541 542 /* 543 * A process group has become orphaned; 544 * if there are any stopped processes in the group, 545 * hang-up all process in that group. 546 */ 547 static void 548 orphanpg(pg) 549 struct pgrp *pg; 550 { 551 register struct proc *p; 552 553 PGRP_LOCK_ASSERT(pg, MA_OWNED); 554 555 LIST_FOREACH(p, &pg->pg_members, p_pglist) { 556 PROC_LOCK(p); 557 if (P_SHOULDSTOP(p)) { 558 PROC_UNLOCK(p); 559 LIST_FOREACH(p, &pg->pg_members, p_pglist) { 560 PROC_LOCK(p); 561 psignal(p, SIGHUP); 562 psignal(p, SIGCONT); 563 PROC_UNLOCK(p); 564 } 565 return; 566 } 567 PROC_UNLOCK(p); 568 } 569 } 570 571 void 572 sessrele(struct session *s) 573 { 574 int i; 575 576 SESS_LOCK(s); 577 i = --s->s_count; 578 SESS_UNLOCK(s); 579 if (i == 0) { 580 if (s->s_ttyp != NULL) 581 ttyrel(s->s_ttyp); 582 mtx_destroy(&s->s_mtx); 583 FREE(s, M_SESSION); 584 } 585 } 586 587 #include "opt_ddb.h" 588 #ifdef DDB 589 #include <ddb/ddb.h> 590 591 DB_SHOW_COMMAND(pgrpdump, pgrpdump) 592 { 593 register struct pgrp *pgrp; 594 register struct proc *p; 595 register int i; 596 597 for (i = 0; i <= pgrphash; i++) { 598 if (!LIST_EMPTY(&pgrphashtbl[i])) { 599 printf("\tindx %d\n", i); 600 LIST_FOREACH(pgrp, &pgrphashtbl[i], pg_hash) { 601 printf( 602 "\tpgrp %p, pgid %ld, sess %p, sesscnt %d, mem %p\n", 603 (void *)pgrp, (long)pgrp->pg_id, 604 (void *)pgrp->pg_session, 605 pgrp->pg_session->s_count, 606 (void *)LIST_FIRST(&pgrp->pg_members)); 607 LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { 608 printf("\t\tpid %ld addr %p pgrp %p\n", 609 (long)p->p_pid, (void *)p, 610 (void *)p->p_pgrp); 611 } 612 } 613 } 614 } 615 } 616 #endif /* DDB */ 617 618 /* 619 * Clear kinfo_proc and fill in any information that is common 620 * to all threads in the process. 621 * Must be called with the target process locked. 622 */ 623 static void 624 fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp) 625 { 626 struct thread *td0; 627 struct tty *tp; 628 struct session *sp; 629 struct ucred *cred; 630 struct sigacts *ps; 631 632 bzero(kp, sizeof(*kp)); 633 634 kp->ki_structsize = sizeof(*kp); 635 kp->ki_paddr = p; 636 PROC_LOCK_ASSERT(p, MA_OWNED); 637 kp->ki_addr =/* p->p_addr; */0; /* XXXKSE */ 638 kp->ki_args = p->p_args; 639 kp->ki_textvp = p->p_textvp; 640 #ifdef KTRACE 641 kp->ki_tracep = p->p_tracevp; 642 mtx_lock(&ktrace_mtx); 643 kp->ki_traceflag = p->p_traceflag; 644 mtx_unlock(&ktrace_mtx); 645 #endif 646 kp->ki_fd = p->p_fd; 647 kp->ki_vmspace = p->p_vmspace; 648 kp->ki_flag = p->p_flag; 649 cred = p->p_ucred; 650 if (cred) { 651 kp->ki_uid = cred->cr_uid; 652 kp->ki_ruid = cred->cr_ruid; 653 kp->ki_svuid = cred->cr_svuid; 654 /* XXX bde doesn't like KI_NGROUPS */ 655 kp->ki_ngroups = min(cred->cr_ngroups, KI_NGROUPS); 656 bcopy(cred->cr_groups, kp->ki_groups, 657 kp->ki_ngroups * sizeof(gid_t)); 658 kp->ki_rgid = cred->cr_rgid; 659 kp->ki_svgid = cred->cr_svgid; 660 /* If jailed(cred), emulate the old P_JAILED flag. */ 661 if (jailed(cred)) { 662 kp->ki_flag |= P_JAILED; 663 /* If inside a jail, use 0 as a jail ID. */ 664 if (!jailed(curthread->td_ucred)) 665 kp->ki_jid = cred->cr_prison->pr_id; 666 } 667 } 668 ps = p->p_sigacts; 669 if (ps) { 670 mtx_lock(&ps->ps_mtx); 671 kp->ki_sigignore = ps->ps_sigignore; 672 kp->ki_sigcatch = ps->ps_sigcatch; 673 mtx_unlock(&ps->ps_mtx); 674 } 675 PROC_SLOCK(p); 676 if (p->p_state != PRS_NEW && 677 p->p_state != PRS_ZOMBIE && 678 p->p_vmspace != NULL) { 679 struct vmspace *vm = p->p_vmspace; 680 681 kp->ki_size = vm->vm_map.size; 682 kp->ki_rssize = vmspace_resident_count(vm); /*XXX*/ 683 FOREACH_THREAD_IN_PROC(p, td0) { 684 if (!TD_IS_SWAPPED(td0)) 685 kp->ki_rssize += td0->td_kstack_pages; 686 if (td0->td_altkstack_obj != NULL) 687 kp->ki_rssize += td0->td_altkstack_pages; 688 } 689 kp->ki_swrss = vm->vm_swrss; 690 kp->ki_tsize = vm->vm_tsize; 691 kp->ki_dsize = vm->vm_dsize; 692 kp->ki_ssize = vm->vm_ssize; 693 } else if (p->p_state == PRS_ZOMBIE) 694 kp->ki_stat = SZOMB; 695 if (kp->ki_flag & P_INMEM) 696 kp->ki_sflag = PS_INMEM; 697 else 698 kp->ki_sflag = 0; 699 /* Calculate legacy swtime as seconds since 'swtick'. */ 700 kp->ki_swtime = (ticks - p->p_swtick) / hz; 701 kp->ki_pid = p->p_pid; 702 kp->ki_nice = p->p_nice; 703 rufetch(p, &kp->ki_rusage); 704 kp->ki_runtime = cputick2usec(p->p_rux.rux_runtime); 705 PROC_SUNLOCK(p); 706 if ((p->p_flag & P_INMEM) && p->p_stats != NULL) { 707 kp->ki_start = p->p_stats->p_start; 708 timevaladd(&kp->ki_start, &boottime); 709 PROC_SLOCK(p); 710 calcru(p, &kp->ki_rusage.ru_utime, &kp->ki_rusage.ru_stime); 711 PROC_SUNLOCK(p); 712 calccru(p, &kp->ki_childutime, &kp->ki_childstime); 713 714 /* Some callers want child-times in a single value */ 715 kp->ki_childtime = kp->ki_childstime; 716 timevaladd(&kp->ki_childtime, &kp->ki_childutime); 717 } 718 tp = NULL; 719 if (p->p_pgrp) { 720 kp->ki_pgid = p->p_pgrp->pg_id; 721 kp->ki_jobc = p->p_pgrp->pg_jobc; 722 sp = p->p_pgrp->pg_session; 723 724 if (sp != NULL) { 725 kp->ki_sid = sp->s_sid; 726 SESS_LOCK(sp); 727 strlcpy(kp->ki_login, sp->s_login, 728 sizeof(kp->ki_login)); 729 if (sp->s_ttyvp) 730 kp->ki_kiflag |= KI_CTTY; 731 if (SESS_LEADER(p)) 732 kp->ki_kiflag |= KI_SLEADER; 733 tp = sp->s_ttyp; 734 SESS_UNLOCK(sp); 735 } 736 } 737 if ((p->p_flag & P_CONTROLT) && tp != NULL) { 738 kp->ki_tdev = dev2udev(tp->t_dev); 739 kp->ki_tpgid = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; 740 if (tp->t_session) 741 kp->ki_tsid = tp->t_session->s_sid; 742 } else 743 kp->ki_tdev = NODEV; 744 if (p->p_comm[0] != '\0') 745 strlcpy(kp->ki_comm, p->p_comm, sizeof(kp->ki_comm)); 746 if (p->p_sysent && p->p_sysent->sv_name != NULL && 747 p->p_sysent->sv_name[0] != '\0') 748 strlcpy(kp->ki_emul, p->p_sysent->sv_name, sizeof(kp->ki_emul)); 749 kp->ki_siglist = p->p_siglist; 750 kp->ki_xstat = p->p_xstat; 751 kp->ki_acflag = p->p_acflag; 752 kp->ki_lock = p->p_lock; 753 if (p->p_pptr) 754 kp->ki_ppid = p->p_pptr->p_pid; 755 } 756 757 /* 758 * Fill in information that is thread specific. 759 * Must be called with p_slock locked. 760 */ 761 static void 762 fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp) 763 { 764 struct proc *p; 765 766 p = td->td_proc; 767 PROC_SLOCK_ASSERT(p, MA_OWNED); 768 769 thread_lock(td); 770 if (td->td_wmesg != NULL) 771 strlcpy(kp->ki_wmesg, td->td_wmesg, sizeof(kp->ki_wmesg)); 772 else 773 bzero(kp->ki_wmesg, sizeof(kp->ki_wmesg)); 774 if (td->td_name[0] != '\0') 775 strlcpy(kp->ki_ocomm, td->td_name, sizeof(kp->ki_ocomm)); 776 if (TD_ON_LOCK(td)) { 777 kp->ki_kiflag |= KI_LOCKBLOCK; 778 strlcpy(kp->ki_lockname, td->td_lockname, 779 sizeof(kp->ki_lockname)); 780 } else { 781 kp->ki_kiflag &= ~KI_LOCKBLOCK; 782 bzero(kp->ki_lockname, sizeof(kp->ki_lockname)); 783 } 784 785 if (p->p_state == PRS_NORMAL) { /* XXXKSE very approximate */ 786 if (TD_ON_RUNQ(td) || 787 TD_CAN_RUN(td) || 788 TD_IS_RUNNING(td)) { 789 kp->ki_stat = SRUN; 790 } else if (P_SHOULDSTOP(p)) { 791 kp->ki_stat = SSTOP; 792 } else if (TD_IS_SLEEPING(td)) { 793 kp->ki_stat = SSLEEP; 794 } else if (TD_ON_LOCK(td)) { 795 kp->ki_stat = SLOCK; 796 } else { 797 kp->ki_stat = SWAIT; 798 } 799 } else if (p->p_state == PRS_ZOMBIE) { 800 kp->ki_stat = SZOMB; 801 } else { 802 kp->ki_stat = SIDL; 803 } 804 805 /* Things in the thread */ 806 kp->ki_wchan = td->td_wchan; 807 kp->ki_pri.pri_level = td->td_priority; 808 kp->ki_pri.pri_native = td->td_base_pri; 809 kp->ki_lastcpu = td->td_lastcpu; 810 kp->ki_oncpu = td->td_oncpu; 811 kp->ki_tdflags = td->td_flags; 812 kp->ki_tid = td->td_tid; 813 kp->ki_numthreads = p->p_numthreads; 814 kp->ki_pcb = td->td_pcb; 815 kp->ki_kstack = (void *)td->td_kstack; 816 kp->ki_pctcpu = sched_pctcpu(td); 817 kp->ki_estcpu = td->td_estcpu; 818 kp->ki_slptime = (ticks - td->td_slptick) / hz; 819 kp->ki_pri.pri_class = td->td_pri_class; 820 kp->ki_pri.pri_user = td->td_user_pri; 821 822 /* We can't get this anymore but ps etc never used it anyway. */ 823 kp->ki_rqindex = 0; 824 825 SIGSETOR(kp->ki_siglist, td->td_siglist); 826 kp->ki_sigmask = td->td_sigmask; 827 thread_unlock(td); 828 } 829 830 /* 831 * Fill in a kinfo_proc structure for the specified process. 832 * Must be called with the target process locked. 833 */ 834 void 835 fill_kinfo_proc(struct proc *p, struct kinfo_proc *kp) 836 { 837 838 fill_kinfo_proc_only(p, kp); 839 PROC_SLOCK(p); 840 if (FIRST_THREAD_IN_PROC(p) != NULL) 841 fill_kinfo_thread(FIRST_THREAD_IN_PROC(p), kp); 842 PROC_SUNLOCK(p); 843 } 844 845 struct pstats * 846 pstats_alloc(void) 847 { 848 849 return (malloc(sizeof(struct pstats), M_SUBPROC, M_ZERO|M_WAITOK)); 850 } 851 852 /* 853 * Copy parts of p_stats; zero the rest of p_stats (statistics). 854 */ 855 void 856 pstats_fork(struct pstats *src, struct pstats *dst) 857 { 858 859 bzero(&dst->pstat_startzero, 860 __rangeof(struct pstats, pstat_startzero, pstat_endzero)); 861 bcopy(&src->pstat_startcopy, &dst->pstat_startcopy, 862 __rangeof(struct pstats, pstat_startcopy, pstat_endcopy)); 863 } 864 865 void 866 pstats_free(struct pstats *ps) 867 { 868 869 free(ps, M_SUBPROC); 870 } 871 872 /* 873 * Locate a zombie process by number 874 */ 875 struct proc * 876 zpfind(pid_t pid) 877 { 878 struct proc *p; 879 880 sx_slock(&allproc_lock); 881 LIST_FOREACH(p, &zombproc, p_list) 882 if (p->p_pid == pid) { 883 PROC_LOCK(p); 884 break; 885 } 886 sx_sunlock(&allproc_lock); 887 return (p); 888 } 889 890 #define KERN_PROC_ZOMBMASK 0x3 891 #define KERN_PROC_NOTHREADS 0x4 892 893 /* 894 * Must be called with the process locked and will return with it unlocked. 895 */ 896 static int 897 sysctl_out_proc(struct proc *p, struct sysctl_req *req, int flags) 898 { 899 struct thread *td; 900 struct kinfo_proc kinfo_proc; 901 int error = 0; 902 struct proc *np; 903 pid_t pid = p->p_pid; 904 905 PROC_LOCK_ASSERT(p, MA_OWNED); 906 907 fill_kinfo_proc_only(p, &kinfo_proc); 908 if (flags & KERN_PROC_NOTHREADS) { 909 PROC_SLOCK(p); 910 if (FIRST_THREAD_IN_PROC(p) != NULL) 911 fill_kinfo_thread(FIRST_THREAD_IN_PROC(p), &kinfo_proc); 912 PROC_SUNLOCK(p); 913 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 914 sizeof(kinfo_proc)); 915 } else { 916 PROC_SLOCK(p); 917 if (FIRST_THREAD_IN_PROC(p) != NULL) 918 FOREACH_THREAD_IN_PROC(p, td) { 919 fill_kinfo_thread(td, &kinfo_proc); 920 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 921 sizeof(kinfo_proc)); 922 if (error) 923 break; 924 } 925 else 926 error = SYSCTL_OUT(req, (caddr_t)&kinfo_proc, 927 sizeof(kinfo_proc)); 928 PROC_SUNLOCK(p); 929 } 930 PROC_UNLOCK(p); 931 if (error) 932 return (error); 933 if (flags & KERN_PROC_ZOMBMASK) 934 np = zpfind(pid); 935 else { 936 if (pid == 0) 937 return (0); 938 np = pfind(pid); 939 } 940 if (np == NULL) 941 return EAGAIN; 942 if (np != p) { 943 PROC_UNLOCK(np); 944 return EAGAIN; 945 } 946 PROC_UNLOCK(np); 947 return (0); 948 } 949 950 static int 951 sysctl_kern_proc(SYSCTL_HANDLER_ARGS) 952 { 953 int *name = (int*) arg1; 954 u_int namelen = arg2; 955 struct proc *p; 956 int flags, doingzomb, oid_number; 957 int error = 0; 958 959 oid_number = oidp->oid_number; 960 if (oid_number != KERN_PROC_ALL && 961 (oid_number & KERN_PROC_INC_THREAD) == 0) 962 flags = KERN_PROC_NOTHREADS; 963 else { 964 flags = 0; 965 oid_number &= ~KERN_PROC_INC_THREAD; 966 } 967 if (oid_number == KERN_PROC_PID) { 968 if (namelen != 1) 969 return (EINVAL); 970 error = sysctl_wire_old_buffer(req, 0); 971 if (error) 972 return (error); 973 p = pfind((pid_t)name[0]); 974 if (!p) 975 return (ESRCH); 976 if ((error = p_cansee(curthread, p))) { 977 PROC_UNLOCK(p); 978 return (error); 979 } 980 error = sysctl_out_proc(p, req, flags); 981 return (error); 982 } 983 984 switch (oid_number) { 985 case KERN_PROC_ALL: 986 if (namelen != 0) 987 return (EINVAL); 988 break; 989 case KERN_PROC_PROC: 990 if (namelen != 0 && namelen != 1) 991 return (EINVAL); 992 break; 993 default: 994 if (namelen != 1) 995 return (EINVAL); 996 break; 997 } 998 999 if (!req->oldptr) { 1000 /* overestimate by 5 procs */ 1001 error = SYSCTL_OUT(req, 0, sizeof (struct kinfo_proc) * 5); 1002 if (error) 1003 return (error); 1004 } 1005 error = sysctl_wire_old_buffer(req, 0); 1006 if (error != 0) 1007 return (error); 1008 sx_slock(&allproc_lock); 1009 for (doingzomb=0 ; doingzomb < 2 ; doingzomb++) { 1010 if (!doingzomb) 1011 p = LIST_FIRST(&allproc); 1012 else 1013 p = LIST_FIRST(&zombproc); 1014 for (; p != 0; p = LIST_NEXT(p, p_list)) { 1015 /* 1016 * Skip embryonic processes. 1017 */ 1018 PROC_SLOCK(p); 1019 if (p->p_state == PRS_NEW) { 1020 PROC_SUNLOCK(p); 1021 continue; 1022 } 1023 PROC_SUNLOCK(p); 1024 PROC_LOCK(p); 1025 KASSERT(p->p_ucred != NULL, 1026 ("process credential is NULL for non-NEW proc")); 1027 /* 1028 * Show a user only appropriate processes. 1029 */ 1030 if (p_cansee(curthread, p)) { 1031 PROC_UNLOCK(p); 1032 continue; 1033 } 1034 /* 1035 * TODO - make more efficient (see notes below). 1036 * do by session. 1037 */ 1038 switch (oid_number) { 1039 1040 case KERN_PROC_GID: 1041 if (p->p_ucred->cr_gid != (gid_t)name[0]) { 1042 PROC_UNLOCK(p); 1043 continue; 1044 } 1045 break; 1046 1047 case KERN_PROC_PGRP: 1048 /* could do this by traversing pgrp */ 1049 if (p->p_pgrp == NULL || 1050 p->p_pgrp->pg_id != (pid_t)name[0]) { 1051 PROC_UNLOCK(p); 1052 continue; 1053 } 1054 break; 1055 1056 case KERN_PROC_RGID: 1057 if (p->p_ucred->cr_rgid != (gid_t)name[0]) { 1058 PROC_UNLOCK(p); 1059 continue; 1060 } 1061 break; 1062 1063 case KERN_PROC_SESSION: 1064 if (p->p_session == NULL || 1065 p->p_session->s_sid != (pid_t)name[0]) { 1066 PROC_UNLOCK(p); 1067 continue; 1068 } 1069 break; 1070 1071 case KERN_PROC_TTY: 1072 if ((p->p_flag & P_CONTROLT) == 0 || 1073 p->p_session == NULL) { 1074 PROC_UNLOCK(p); 1075 continue; 1076 } 1077 SESS_LOCK(p->p_session); 1078 if (p->p_session->s_ttyp == NULL || 1079 dev2udev(p->p_session->s_ttyp->t_dev) != 1080 (dev_t)name[0]) { 1081 SESS_UNLOCK(p->p_session); 1082 PROC_UNLOCK(p); 1083 continue; 1084 } 1085 SESS_UNLOCK(p->p_session); 1086 break; 1087 1088 case KERN_PROC_UID: 1089 if (p->p_ucred->cr_uid != (uid_t)name[0]) { 1090 PROC_UNLOCK(p); 1091 continue; 1092 } 1093 break; 1094 1095 case KERN_PROC_RUID: 1096 if (p->p_ucred->cr_ruid != (uid_t)name[0]) { 1097 PROC_UNLOCK(p); 1098 continue; 1099 } 1100 break; 1101 1102 case KERN_PROC_PROC: 1103 break; 1104 1105 default: 1106 break; 1107 1108 } 1109 1110 error = sysctl_out_proc(p, req, flags | doingzomb); 1111 if (error) { 1112 sx_sunlock(&allproc_lock); 1113 return (error); 1114 } 1115 } 1116 } 1117 sx_sunlock(&allproc_lock); 1118 return (0); 1119 } 1120 1121 struct pargs * 1122 pargs_alloc(int len) 1123 { 1124 struct pargs *pa; 1125 1126 MALLOC(pa, struct pargs *, sizeof(struct pargs) + len, M_PARGS, 1127 M_WAITOK); 1128 refcount_init(&pa->ar_ref, 1); 1129 pa->ar_length = len; 1130 return (pa); 1131 } 1132 1133 void 1134 pargs_free(struct pargs *pa) 1135 { 1136 1137 FREE(pa, M_PARGS); 1138 } 1139 1140 void 1141 pargs_hold(struct pargs *pa) 1142 { 1143 1144 if (pa == NULL) 1145 return; 1146 refcount_acquire(&pa->ar_ref); 1147 } 1148 1149 void 1150 pargs_drop(struct pargs *pa) 1151 { 1152 1153 if (pa == NULL) 1154 return; 1155 if (refcount_release(&pa->ar_ref)) 1156 pargs_free(pa); 1157 } 1158 1159 /* 1160 * This sysctl allows a process to retrieve the argument list or process 1161 * title for another process without groping around in the address space 1162 * of the other process. It also allow a process to set its own "process 1163 * title to a string of its own choice. 1164 */ 1165 static int 1166 sysctl_kern_proc_args(SYSCTL_HANDLER_ARGS) 1167 { 1168 int *name = (int*) arg1; 1169 u_int namelen = arg2; 1170 struct pargs *newpa, *pa; 1171 struct proc *p; 1172 int error = 0; 1173 1174 if (namelen != 1) 1175 return (EINVAL); 1176 1177 p = pfind((pid_t)name[0]); 1178 if (!p) 1179 return (ESRCH); 1180 1181 if ((error = p_cansee(curthread, p)) != 0) { 1182 PROC_UNLOCK(p); 1183 return (error); 1184 } 1185 1186 if (req->newptr && curproc != p) { 1187 PROC_UNLOCK(p); 1188 return (EPERM); 1189 } 1190 1191 pa = p->p_args; 1192 pargs_hold(pa); 1193 PROC_UNLOCK(p); 1194 if (req->oldptr != NULL && pa != NULL) 1195 error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length); 1196 pargs_drop(pa); 1197 if (error != 0 || req->newptr == NULL) 1198 return (error); 1199 1200 if (req->newlen + sizeof(struct pargs) > ps_arg_cache_limit) 1201 return (ENOMEM); 1202 newpa = pargs_alloc(req->newlen); 1203 error = SYSCTL_IN(req, newpa->ar_args, req->newlen); 1204 if (error != 0) { 1205 pargs_free(newpa); 1206 return (error); 1207 } 1208 PROC_LOCK(p); 1209 pa = p->p_args; 1210 p->p_args = newpa; 1211 PROC_UNLOCK(p); 1212 pargs_drop(pa); 1213 return (0); 1214 } 1215 1216 /* 1217 * This sysctl allows a process to retrieve the path of the executable for 1218 * itself or another process. 1219 */ 1220 static int 1221 sysctl_kern_proc_pathname(SYSCTL_HANDLER_ARGS) 1222 { 1223 pid_t *pidp = (pid_t *)arg1; 1224 unsigned int arglen = arg2; 1225 struct proc *p; 1226 struct vnode *vp; 1227 char *retbuf, *freebuf; 1228 int error; 1229 1230 if (arglen != 1) 1231 return (EINVAL); 1232 if (*pidp == -1) { /* -1 means this process */ 1233 p = req->td->td_proc; 1234 } else { 1235 p = pfind(*pidp); 1236 if (p == NULL) 1237 return (ESRCH); 1238 if ((error = p_cansee(curthread, p)) != 0) { 1239 PROC_UNLOCK(p); 1240 return (error); 1241 } 1242 } 1243 1244 vp = p->p_textvp; 1245 if (vp == NULL) { 1246 if (*pidp != -1) 1247 PROC_UNLOCK(p); 1248 return (0); 1249 } 1250 vref(vp); 1251 if (*pidp != -1) 1252 PROC_UNLOCK(p); 1253 error = vn_fullpath(req->td, vp, &retbuf, &freebuf); 1254 vrele(vp); 1255 if (error) 1256 return (error); 1257 error = SYSCTL_OUT(req, retbuf, strlen(retbuf) + 1); 1258 free(freebuf, M_TEMP); 1259 return (error); 1260 } 1261 1262 static int 1263 sysctl_kern_proc_sv_name(SYSCTL_HANDLER_ARGS) 1264 { 1265 struct proc *p; 1266 char *sv_name; 1267 int *name; 1268 int namelen; 1269 int error; 1270 1271 namelen = arg2; 1272 if (namelen != 1) 1273 return (EINVAL); 1274 1275 name = (int *)arg1; 1276 if ((p = pfind((pid_t)name[0])) == NULL) 1277 return (ESRCH); 1278 if ((error = p_cansee(curthread, p))) { 1279 PROC_UNLOCK(p); 1280 return (error); 1281 } 1282 sv_name = p->p_sysent->sv_name; 1283 PROC_UNLOCK(p); 1284 return (sysctl_handle_string(oidp, sv_name, 0, req)); 1285 } 1286 1287 1288 static SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table"); 1289 1290 SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT, 1291 0, 0, sysctl_kern_proc, "S,proc", "Return entire process table"); 1292 1293 static SYSCTL_NODE(_kern_proc, KERN_PROC_GID, gid, CTLFLAG_RD, 1294 sysctl_kern_proc, "Process table"); 1295 1296 static SYSCTL_NODE(_kern_proc, KERN_PROC_PGRP, pgrp, CTLFLAG_RD, 1297 sysctl_kern_proc, "Process table"); 1298 1299 static SYSCTL_NODE(_kern_proc, KERN_PROC_RGID, rgid, CTLFLAG_RD, 1300 sysctl_kern_proc, "Process table"); 1301 1302 static SYSCTL_NODE(_kern_proc, KERN_PROC_SESSION, sid, CTLFLAG_RD, 1303 sysctl_kern_proc, "Process table"); 1304 1305 static SYSCTL_NODE(_kern_proc, KERN_PROC_TTY, tty, CTLFLAG_RD, 1306 sysctl_kern_proc, "Process table"); 1307 1308 static SYSCTL_NODE(_kern_proc, KERN_PROC_UID, uid, CTLFLAG_RD, 1309 sysctl_kern_proc, "Process table"); 1310 1311 static SYSCTL_NODE(_kern_proc, KERN_PROC_RUID, ruid, CTLFLAG_RD, 1312 sysctl_kern_proc, "Process table"); 1313 1314 static SYSCTL_NODE(_kern_proc, KERN_PROC_PID, pid, CTLFLAG_RD, 1315 sysctl_kern_proc, "Process table"); 1316 1317 static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD, 1318 sysctl_kern_proc, "Return process table, no threads"); 1319 1320 static SYSCTL_NODE(_kern_proc, KERN_PROC_ARGS, args, 1321 CTLFLAG_RW | CTLFLAG_ANYBODY, 1322 sysctl_kern_proc_args, "Process argument list"); 1323 1324 static SYSCTL_NODE(_kern_proc, KERN_PROC_PATHNAME, pathname, CTLFLAG_RD, 1325 sysctl_kern_proc_pathname, "Process executable path"); 1326 1327 static SYSCTL_NODE(_kern_proc, KERN_PROC_SV_NAME, sv_name, CTLFLAG_RD, 1328 sysctl_kern_proc_sv_name, "Process syscall vector name (ABI type)"); 1329 1330 static SYSCTL_NODE(_kern_proc, (KERN_PROC_GID | KERN_PROC_INC_THREAD), gid_td, 1331 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1332 1333 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PGRP | KERN_PROC_INC_THREAD), pgrp_td, 1334 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1335 1336 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RGID | KERN_PROC_INC_THREAD), rgid_td, 1337 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1338 1339 static SYSCTL_NODE(_kern_proc, (KERN_PROC_SESSION | KERN_PROC_INC_THREAD), 1340 sid_td, CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1341 1342 static SYSCTL_NODE(_kern_proc, (KERN_PROC_TTY | KERN_PROC_INC_THREAD), tty_td, 1343 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1344 1345 static SYSCTL_NODE(_kern_proc, (KERN_PROC_UID | KERN_PROC_INC_THREAD), uid_td, 1346 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1347 1348 static SYSCTL_NODE(_kern_proc, (KERN_PROC_RUID | KERN_PROC_INC_THREAD), ruid_td, 1349 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1350 1351 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PID | KERN_PROC_INC_THREAD), pid_td, 1352 CTLFLAG_RD, sysctl_kern_proc, "Process table"); 1353 1354 static SYSCTL_NODE(_kern_proc, (KERN_PROC_PROC | KERN_PROC_INC_THREAD), proc_td, 1355 CTLFLAG_RD, sysctl_kern_proc, "Return process table, no threads"); 1356