1 /*- 2 * Copyright (C) 2001 Julian Elischer <julian@freebsd.org>. 3 * 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(s), this list of conditions and the following disclaimer as 10 * the first lines of this file unmodified other than the possible 11 * addition of one or more copyright notices. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice(s), this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 26 * DAMAGE. 27 */ 28 29 #include "opt_witness.h" 30 #include "opt_kdtrace.h" 31 #include "opt_hwpmc_hooks.h" 32 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD$"); 35 36 #include <sys/param.h> 37 #include <sys/systm.h> 38 #include <sys/kernel.h> 39 #include <sys/lock.h> 40 #include <sys/mutex.h> 41 #include <sys/proc.h> 42 #include <sys/rangelock.h> 43 #include <sys/resourcevar.h> 44 #include <sys/sdt.h> 45 #include <sys/smp.h> 46 #include <sys/sched.h> 47 #include <sys/sleepqueue.h> 48 #include <sys/selinfo.h> 49 #include <sys/turnstile.h> 50 #include <sys/ktr.h> 51 #include <sys/rwlock.h> 52 #include <sys/umtx.h> 53 #include <sys/cpuset.h> 54 #ifdef HWPMC_HOOKS 55 #include <sys/pmckern.h> 56 #endif 57 58 #include <security/audit/audit.h> 59 60 #include <vm/vm.h> 61 #include <vm/vm_extern.h> 62 #include <vm/uma.h> 63 #include <sys/eventhandler.h> 64 65 SDT_PROVIDER_DECLARE(proc); 66 SDT_PROBE_DEFINE(proc, , , lwp_exit, lwp-exit); 67 68 69 /* 70 * thread related storage. 71 */ 72 static uma_zone_t thread_zone; 73 74 TAILQ_HEAD(, thread) zombie_threads = TAILQ_HEAD_INITIALIZER(zombie_threads); 75 static struct mtx zombie_lock; 76 MTX_SYSINIT(zombie_lock, &zombie_lock, "zombie lock", MTX_SPIN); 77 78 static void thread_zombie(struct thread *); 79 80 #define TID_BUFFER_SIZE 1024 81 82 struct mtx tid_lock; 83 static struct unrhdr *tid_unrhdr; 84 static lwpid_t tid_buffer[TID_BUFFER_SIZE]; 85 static int tid_head, tid_tail; 86 static MALLOC_DEFINE(M_TIDHASH, "tidhash", "thread hash"); 87 88 struct tidhashhead *tidhashtbl; 89 u_long tidhash; 90 struct rwlock tidhash_lock; 91 92 static lwpid_t 93 tid_alloc(void) 94 { 95 lwpid_t tid; 96 97 tid = alloc_unr(tid_unrhdr); 98 if (tid != -1) 99 return (tid); 100 mtx_lock(&tid_lock); 101 if (tid_head == tid_tail) { 102 mtx_unlock(&tid_lock); 103 return (-1); 104 } 105 tid = tid_buffer[tid_head++]; 106 tid_head %= TID_BUFFER_SIZE; 107 mtx_unlock(&tid_lock); 108 return (tid); 109 } 110 111 static void 112 tid_free(lwpid_t tid) 113 { 114 lwpid_t tmp_tid = -1; 115 116 mtx_lock(&tid_lock); 117 if ((tid_tail + 1) % TID_BUFFER_SIZE == tid_head) { 118 tmp_tid = tid_buffer[tid_head++]; 119 tid_head = (tid_head + 1) % TID_BUFFER_SIZE; 120 } 121 tid_buffer[tid_tail++] = tid; 122 tid_tail %= TID_BUFFER_SIZE; 123 mtx_unlock(&tid_lock); 124 if (tmp_tid != -1) 125 free_unr(tid_unrhdr, tmp_tid); 126 } 127 128 /* 129 * Prepare a thread for use. 130 */ 131 static int 132 thread_ctor(void *mem, int size, void *arg, int flags) 133 { 134 struct thread *td; 135 136 td = (struct thread *)mem; 137 td->td_state = TDS_INACTIVE; 138 td->td_oncpu = NOCPU; 139 140 td->td_tid = tid_alloc(); 141 142 /* 143 * Note that td_critnest begins life as 1 because the thread is not 144 * running and is thereby implicitly waiting to be on the receiving 145 * end of a context switch. 146 */ 147 td->td_critnest = 1; 148 td->td_lend_user_pri = PRI_MAX; 149 EVENTHANDLER_INVOKE(thread_ctor, td); 150 #ifdef AUDIT 151 audit_thread_alloc(td); 152 #endif 153 umtx_thread_alloc(td); 154 return (0); 155 } 156 157 /* 158 * Reclaim a thread after use. 159 */ 160 static void 161 thread_dtor(void *mem, int size, void *arg) 162 { 163 struct thread *td; 164 165 td = (struct thread *)mem; 166 167 #ifdef INVARIANTS 168 /* Verify that this thread is in a safe state to free. */ 169 switch (td->td_state) { 170 case TDS_INHIBITED: 171 case TDS_RUNNING: 172 case TDS_CAN_RUN: 173 case TDS_RUNQ: 174 /* 175 * We must never unlink a thread that is in one of 176 * these states, because it is currently active. 177 */ 178 panic("bad state for thread unlinking"); 179 /* NOTREACHED */ 180 case TDS_INACTIVE: 181 break; 182 default: 183 panic("bad thread state"); 184 /* NOTREACHED */ 185 } 186 #endif 187 #ifdef AUDIT 188 audit_thread_free(td); 189 #endif 190 /* Free all OSD associated to this thread. */ 191 osd_thread_exit(td); 192 193 EVENTHANDLER_INVOKE(thread_dtor, td); 194 tid_free(td->td_tid); 195 } 196 197 /* 198 * Initialize type-stable parts of a thread (when newly created). 199 */ 200 static int 201 thread_init(void *mem, int size, int flags) 202 { 203 struct thread *td; 204 205 td = (struct thread *)mem; 206 207 td->td_sleepqueue = sleepq_alloc(); 208 td->td_turnstile = turnstile_alloc(); 209 td->td_rlqe = NULL; 210 EVENTHANDLER_INVOKE(thread_init, td); 211 td->td_sched = (struct td_sched *)&td[1]; 212 umtx_thread_init(td); 213 td->td_kstack = 0; 214 return (0); 215 } 216 217 /* 218 * Tear down type-stable parts of a thread (just before being discarded). 219 */ 220 static void 221 thread_fini(void *mem, int size) 222 { 223 struct thread *td; 224 225 td = (struct thread *)mem; 226 EVENTHANDLER_INVOKE(thread_fini, td); 227 rlqentry_free(td->td_rlqe); 228 turnstile_free(td->td_turnstile); 229 sleepq_free(td->td_sleepqueue); 230 umtx_thread_fini(td); 231 seltdfini(td); 232 } 233 234 /* 235 * For a newly created process, 236 * link up all the structures and its initial threads etc. 237 * called from: 238 * {arch}/{arch}/machdep.c ia64_init(), init386() etc. 239 * proc_dtor() (should go away) 240 * proc_init() 241 */ 242 void 243 proc_linkup0(struct proc *p, struct thread *td) 244 { 245 TAILQ_INIT(&p->p_threads); /* all threads in proc */ 246 proc_linkup(p, td); 247 } 248 249 void 250 proc_linkup(struct proc *p, struct thread *td) 251 { 252 253 sigqueue_init(&p->p_sigqueue, p); 254 p->p_ksi = ksiginfo_alloc(1); 255 if (p->p_ksi != NULL) { 256 /* XXX p_ksi may be null if ksiginfo zone is not ready */ 257 p->p_ksi->ksi_flags = KSI_EXT | KSI_INS; 258 } 259 LIST_INIT(&p->p_mqnotifier); 260 p->p_numthreads = 0; 261 thread_link(td, p); 262 } 263 264 /* 265 * Initialize global thread allocation resources. 266 */ 267 void 268 threadinit(void) 269 { 270 271 mtx_init(&tid_lock, "TID lock", NULL, MTX_DEF); 272 /* leave one number for thread0 */ 273 tid_unrhdr = new_unrhdr(PID_MAX + 2, INT_MAX, &tid_lock); 274 275 thread_zone = uma_zcreate("THREAD", sched_sizeof_thread(), 276 thread_ctor, thread_dtor, thread_init, thread_fini, 277 16 - 1, 0); 278 tidhashtbl = hashinit(maxproc / 2, M_TIDHASH, &tidhash); 279 rw_init(&tidhash_lock, "tidhash"); 280 } 281 282 /* 283 * Place an unused thread on the zombie list. 284 * Use the slpq as that must be unused by now. 285 */ 286 void 287 thread_zombie(struct thread *td) 288 { 289 mtx_lock_spin(&zombie_lock); 290 TAILQ_INSERT_HEAD(&zombie_threads, td, td_slpq); 291 mtx_unlock_spin(&zombie_lock); 292 } 293 294 /* 295 * Release a thread that has exited after cpu_throw(). 296 */ 297 void 298 thread_stash(struct thread *td) 299 { 300 atomic_subtract_rel_int(&td->td_proc->p_exitthreads, 1); 301 thread_zombie(td); 302 } 303 304 /* 305 * Reap zombie resources. 306 */ 307 void 308 thread_reap(void) 309 { 310 struct thread *td_first, *td_next; 311 312 /* 313 * Don't even bother to lock if none at this instant, 314 * we really don't care about the next instant.. 315 */ 316 if (!TAILQ_EMPTY(&zombie_threads)) { 317 mtx_lock_spin(&zombie_lock); 318 td_first = TAILQ_FIRST(&zombie_threads); 319 if (td_first) 320 TAILQ_INIT(&zombie_threads); 321 mtx_unlock_spin(&zombie_lock); 322 while (td_first) { 323 td_next = TAILQ_NEXT(td_first, td_slpq); 324 if (td_first->td_ucred) 325 crfree(td_first->td_ucred); 326 thread_free(td_first); 327 td_first = td_next; 328 } 329 } 330 } 331 332 /* 333 * Allocate a thread. 334 */ 335 struct thread * 336 thread_alloc(int pages) 337 { 338 struct thread *td; 339 340 thread_reap(); /* check if any zombies to get */ 341 342 td = (struct thread *)uma_zalloc(thread_zone, M_WAITOK); 343 KASSERT(td->td_kstack == 0, ("thread_alloc got thread with kstack")); 344 if (!vm_thread_new(td, pages)) { 345 uma_zfree(thread_zone, td); 346 return (NULL); 347 } 348 cpu_thread_alloc(td); 349 return (td); 350 } 351 352 int 353 thread_alloc_stack(struct thread *td, int pages) 354 { 355 356 KASSERT(td->td_kstack == 0, 357 ("thread_alloc_stack called on a thread with kstack")); 358 if (!vm_thread_new(td, pages)) 359 return (0); 360 cpu_thread_alloc(td); 361 return (1); 362 } 363 364 /* 365 * Deallocate a thread. 366 */ 367 void 368 thread_free(struct thread *td) 369 { 370 371 lock_profile_thread_exit(td); 372 if (td->td_cpuset) 373 cpuset_rel(td->td_cpuset); 374 td->td_cpuset = NULL; 375 cpu_thread_free(td); 376 if (td->td_kstack != 0) 377 vm_thread_dispose(td); 378 uma_zfree(thread_zone, td); 379 } 380 381 /* 382 * Discard the current thread and exit from its context. 383 * Always called with scheduler locked. 384 * 385 * Because we can't free a thread while we're operating under its context, 386 * push the current thread into our CPU's deadthread holder. This means 387 * we needn't worry about someone else grabbing our context before we 388 * do a cpu_throw(). 389 */ 390 void 391 thread_exit(void) 392 { 393 uint64_t runtime, new_switchtime; 394 struct thread *td; 395 struct thread *td2; 396 struct proc *p; 397 int wakeup_swapper; 398 399 td = curthread; 400 p = td->td_proc; 401 402 PROC_SLOCK_ASSERT(p, MA_OWNED); 403 mtx_assert(&Giant, MA_NOTOWNED); 404 405 PROC_LOCK_ASSERT(p, MA_OWNED); 406 KASSERT(p != NULL, ("thread exiting without a process")); 407 CTR3(KTR_PROC, "thread_exit: thread %p (pid %ld, %s)", td, 408 (long)p->p_pid, td->td_name); 409 KASSERT(TAILQ_EMPTY(&td->td_sigqueue.sq_list), ("signal pending")); 410 411 #ifdef AUDIT 412 AUDIT_SYSCALL_EXIT(0, td); 413 #endif 414 umtx_thread_exit(td); 415 /* 416 * drop FPU & debug register state storage, or any other 417 * architecture specific resources that 418 * would not be on a new untouched process. 419 */ 420 cpu_thread_exit(td); /* XXXSMP */ 421 422 /* 423 * The last thread is left attached to the process 424 * So that the whole bundle gets recycled. Skip 425 * all this stuff if we never had threads. 426 * EXIT clears all sign of other threads when 427 * it goes to single threading, so the last thread always 428 * takes the short path. 429 */ 430 if (p->p_flag & P_HADTHREADS) { 431 if (p->p_numthreads > 1) { 432 thread_unlink(td); 433 td2 = FIRST_THREAD_IN_PROC(p); 434 sched_exit_thread(td2, td); 435 436 /* 437 * The test below is NOT true if we are the 438 * sole exiting thread. P_STOPPED_SINGLE is unset 439 * in exit1() after it is the only survivor. 440 */ 441 if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) { 442 if (p->p_numthreads == p->p_suspcount) { 443 thread_lock(p->p_singlethread); 444 wakeup_swapper = thread_unsuspend_one( 445 p->p_singlethread); 446 thread_unlock(p->p_singlethread); 447 if (wakeup_swapper) 448 kick_proc0(); 449 } 450 } 451 452 atomic_add_int(&td->td_proc->p_exitthreads, 1); 453 PCPU_SET(deadthread, td); 454 } else { 455 /* 456 * The last thread is exiting.. but not through exit() 457 */ 458 panic ("thread_exit: Last thread exiting on its own"); 459 } 460 } 461 #ifdef HWPMC_HOOKS 462 /* 463 * If this thread is part of a process that is being tracked by hwpmc(4), 464 * inform the module of the thread's impending exit. 465 */ 466 if (PMC_PROC_IS_USING_PMCS(td->td_proc)) 467 PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT); 468 #endif 469 PROC_UNLOCK(p); 470 471 /* Do the same timestamp bookkeeping that mi_switch() would do. */ 472 new_switchtime = cpu_ticks(); 473 runtime = new_switchtime - PCPU_GET(switchtime); 474 td->td_runtime += runtime; 475 td->td_incruntime += runtime; 476 PCPU_SET(switchtime, new_switchtime); 477 PCPU_SET(switchticks, ticks); 478 PCPU_INC(cnt.v_swtch); 479 480 /* Save our resource usage in our process. */ 481 td->td_ru.ru_nvcsw++; 482 ruxagg(p, td); 483 rucollect(&p->p_ru, &td->td_ru); 484 485 thread_lock(td); 486 PROC_SUNLOCK(p); 487 td->td_state = TDS_INACTIVE; 488 #ifdef WITNESS 489 witness_thread_exit(td); 490 #endif 491 CTR1(KTR_PROC, "thread_exit: cpu_throw() thread %p", td); 492 sched_throw(td); 493 panic("I'm a teapot!"); 494 /* NOTREACHED */ 495 } 496 497 /* 498 * Do any thread specific cleanups that may be needed in wait() 499 * called with Giant, proc and schedlock not held. 500 */ 501 void 502 thread_wait(struct proc *p) 503 { 504 struct thread *td; 505 506 mtx_assert(&Giant, MA_NOTOWNED); 507 KASSERT((p->p_numthreads == 1), ("Multiple threads in wait1()")); 508 td = FIRST_THREAD_IN_PROC(p); 509 /* Lock the last thread so we spin until it exits cpu_throw(). */ 510 thread_lock(td); 511 thread_unlock(td); 512 /* Wait for any remaining threads to exit cpu_throw(). */ 513 while (p->p_exitthreads) 514 sched_relinquish(curthread); 515 lock_profile_thread_exit(td); 516 cpuset_rel(td->td_cpuset); 517 td->td_cpuset = NULL; 518 cpu_thread_clean(td); 519 crfree(td->td_ucred); 520 thread_reap(); /* check for zombie threads etc. */ 521 } 522 523 /* 524 * Link a thread to a process. 525 * set up anything that needs to be initialized for it to 526 * be used by the process. 527 */ 528 void 529 thread_link(struct thread *td, struct proc *p) 530 { 531 532 /* 533 * XXX This can't be enabled because it's called for proc0 before 534 * its lock has been created. 535 * PROC_LOCK_ASSERT(p, MA_OWNED); 536 */ 537 td->td_state = TDS_INACTIVE; 538 td->td_proc = p; 539 td->td_flags = TDF_INMEM; 540 541 LIST_INIT(&td->td_contested); 542 LIST_INIT(&td->td_lprof[0]); 543 LIST_INIT(&td->td_lprof[1]); 544 sigqueue_init(&td->td_sigqueue, p); 545 callout_init(&td->td_slpcallout, CALLOUT_MPSAFE); 546 TAILQ_INSERT_HEAD(&p->p_threads, td, td_plist); 547 p->p_numthreads++; 548 } 549 550 /* 551 * Convert a process with one thread to an unthreaded process. 552 */ 553 void 554 thread_unthread(struct thread *td) 555 { 556 struct proc *p = td->td_proc; 557 558 KASSERT((p->p_numthreads == 1), ("Unthreading with >1 threads")); 559 p->p_flag &= ~P_HADTHREADS; 560 } 561 562 /* 563 * Called from: 564 * thread_exit() 565 */ 566 void 567 thread_unlink(struct thread *td) 568 { 569 struct proc *p = td->td_proc; 570 571 PROC_LOCK_ASSERT(p, MA_OWNED); 572 TAILQ_REMOVE(&p->p_threads, td, td_plist); 573 p->p_numthreads--; 574 /* could clear a few other things here */ 575 /* Must NOT clear links to proc! */ 576 } 577 578 static int 579 calc_remaining(struct proc *p, int mode) 580 { 581 int remaining; 582 583 PROC_LOCK_ASSERT(p, MA_OWNED); 584 PROC_SLOCK_ASSERT(p, MA_OWNED); 585 if (mode == SINGLE_EXIT) 586 remaining = p->p_numthreads; 587 else if (mode == SINGLE_BOUNDARY) 588 remaining = p->p_numthreads - p->p_boundary_count; 589 else if (mode == SINGLE_NO_EXIT) 590 remaining = p->p_numthreads - p->p_suspcount; 591 else 592 panic("calc_remaining: wrong mode %d", mode); 593 return (remaining); 594 } 595 596 /* 597 * Enforce single-threading. 598 * 599 * Returns 1 if the caller must abort (another thread is waiting to 600 * exit the process or similar). Process is locked! 601 * Returns 0 when you are successfully the only thread running. 602 * A process has successfully single threaded in the suspend mode when 603 * There are no threads in user mode. Threads in the kernel must be 604 * allowed to continue until they get to the user boundary. They may even 605 * copy out their return values and data before suspending. They may however be 606 * accelerated in reaching the user boundary as we will wake up 607 * any sleeping threads that are interruptable. (PCATCH). 608 */ 609 int 610 thread_single(int mode) 611 { 612 struct thread *td; 613 struct thread *td2; 614 struct proc *p; 615 int remaining, wakeup_swapper; 616 617 td = curthread; 618 p = td->td_proc; 619 mtx_assert(&Giant, MA_NOTOWNED); 620 PROC_LOCK_ASSERT(p, MA_OWNED); 621 KASSERT((td != NULL), ("curthread is NULL")); 622 623 if ((p->p_flag & P_HADTHREADS) == 0) 624 return (0); 625 626 /* Is someone already single threading? */ 627 if (p->p_singlethread != NULL && p->p_singlethread != td) 628 return (1); 629 630 if (mode == SINGLE_EXIT) { 631 p->p_flag |= P_SINGLE_EXIT; 632 p->p_flag &= ~P_SINGLE_BOUNDARY; 633 } else { 634 p->p_flag &= ~P_SINGLE_EXIT; 635 if (mode == SINGLE_BOUNDARY) 636 p->p_flag |= P_SINGLE_BOUNDARY; 637 else 638 p->p_flag &= ~P_SINGLE_BOUNDARY; 639 } 640 p->p_flag |= P_STOPPED_SINGLE; 641 PROC_SLOCK(p); 642 p->p_singlethread = td; 643 remaining = calc_remaining(p, mode); 644 while (remaining != 1) { 645 if (P_SHOULDSTOP(p) != P_STOPPED_SINGLE) 646 goto stopme; 647 wakeup_swapper = 0; 648 FOREACH_THREAD_IN_PROC(p, td2) { 649 if (td2 == td) 650 continue; 651 thread_lock(td2); 652 td2->td_flags |= TDF_ASTPENDING | TDF_NEEDSUSPCHK; 653 if (TD_IS_INHIBITED(td2)) { 654 switch (mode) { 655 case SINGLE_EXIT: 656 if (TD_IS_SUSPENDED(td2)) 657 wakeup_swapper |= 658 thread_unsuspend_one(td2); 659 if (TD_ON_SLEEPQ(td2) && 660 (td2->td_flags & TDF_SINTR)) 661 wakeup_swapper |= 662 sleepq_abort(td2, EINTR); 663 break; 664 case SINGLE_BOUNDARY: 665 if (TD_IS_SUSPENDED(td2) && 666 !(td2->td_flags & TDF_BOUNDARY)) 667 wakeup_swapper |= 668 thread_unsuspend_one(td2); 669 if (TD_ON_SLEEPQ(td2) && 670 (td2->td_flags & TDF_SINTR)) 671 wakeup_swapper |= 672 sleepq_abort(td2, ERESTART); 673 break; 674 case SINGLE_NO_EXIT: 675 if (TD_IS_SUSPENDED(td2) && 676 !(td2->td_flags & TDF_BOUNDARY)) 677 wakeup_swapper |= 678 thread_unsuspend_one(td2); 679 if (TD_ON_SLEEPQ(td2) && 680 (td2->td_flags & TDF_SINTR)) 681 wakeup_swapper |= 682 sleepq_abort(td2, ERESTART); 683 break; 684 default: 685 break; 686 } 687 } 688 #ifdef SMP 689 else if (TD_IS_RUNNING(td2) && td != td2) { 690 forward_signal(td2); 691 } 692 #endif 693 thread_unlock(td2); 694 } 695 if (wakeup_swapper) 696 kick_proc0(); 697 remaining = calc_remaining(p, mode); 698 699 /* 700 * Maybe we suspended some threads.. was it enough? 701 */ 702 if (remaining == 1) 703 break; 704 705 stopme: 706 /* 707 * Wake us up when everyone else has suspended. 708 * In the mean time we suspend as well. 709 */ 710 thread_suspend_switch(td); 711 remaining = calc_remaining(p, mode); 712 } 713 if (mode == SINGLE_EXIT) { 714 /* 715 * We have gotten rid of all the other threads and we 716 * are about to either exit or exec. In either case, 717 * we try our utmost to revert to being a non-threaded 718 * process. 719 */ 720 p->p_singlethread = NULL; 721 p->p_flag &= ~(P_STOPPED_SINGLE | P_SINGLE_EXIT); 722 thread_unthread(td); 723 } 724 PROC_SUNLOCK(p); 725 return (0); 726 } 727 728 /* 729 * Called in from locations that can safely check to see 730 * whether we have to suspend or at least throttle for a 731 * single-thread event (e.g. fork). 732 * 733 * Such locations include userret(). 734 * If the "return_instead" argument is non zero, the thread must be able to 735 * accept 0 (caller may continue), or 1 (caller must abort) as a result. 736 * 737 * The 'return_instead' argument tells the function if it may do a 738 * thread_exit() or suspend, or whether the caller must abort and back 739 * out instead. 740 * 741 * If the thread that set the single_threading request has set the 742 * P_SINGLE_EXIT bit in the process flags then this call will never return 743 * if 'return_instead' is false, but will exit. 744 * 745 * P_SINGLE_EXIT | return_instead == 0| return_instead != 0 746 *---------------+--------------------+--------------------- 747 * 0 | returns 0 | returns 0 or 1 748 * | when ST ends | immediatly 749 *---------------+--------------------+--------------------- 750 * 1 | thread exits | returns 1 751 * | | immediatly 752 * 0 = thread_exit() or suspension ok, 753 * other = return error instead of stopping the thread. 754 * 755 * While a full suspension is under effect, even a single threading 756 * thread would be suspended if it made this call (but it shouldn't). 757 * This call should only be made from places where 758 * thread_exit() would be safe as that may be the outcome unless 759 * return_instead is set. 760 */ 761 int 762 thread_suspend_check(int return_instead) 763 { 764 struct thread *td; 765 struct proc *p; 766 int wakeup_swapper; 767 768 td = curthread; 769 p = td->td_proc; 770 mtx_assert(&Giant, MA_NOTOWNED); 771 PROC_LOCK_ASSERT(p, MA_OWNED); 772 while (P_SHOULDSTOP(p) || 773 ((p->p_flag & P_TRACED) && (td->td_dbgflags & TDB_SUSPEND))) { 774 if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) { 775 KASSERT(p->p_singlethread != NULL, 776 ("singlethread not set")); 777 /* 778 * The only suspension in action is a 779 * single-threading. Single threader need not stop. 780 * XXX Should be safe to access unlocked 781 * as it can only be set to be true by us. 782 */ 783 if (p->p_singlethread == td) 784 return (0); /* Exempt from stopping. */ 785 } 786 if ((p->p_flag & P_SINGLE_EXIT) && return_instead) 787 return (EINTR); 788 789 /* Should we goto user boundary if we didn't come from there? */ 790 if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE && 791 (p->p_flag & P_SINGLE_BOUNDARY) && return_instead) 792 return (ERESTART); 793 794 /* 795 * If the process is waiting for us to exit, 796 * this thread should just suicide. 797 * Assumes that P_SINGLE_EXIT implies P_STOPPED_SINGLE. 798 */ 799 if ((p->p_flag & P_SINGLE_EXIT) && (p->p_singlethread != td)) { 800 PROC_UNLOCK(p); 801 tidhash_remove(td); 802 PROC_LOCK(p); 803 tdsigcleanup(td); 804 PROC_SLOCK(p); 805 thread_stopped(p); 806 thread_exit(); 807 } 808 809 PROC_SLOCK(p); 810 thread_stopped(p); 811 if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) { 812 if (p->p_numthreads == p->p_suspcount + 1) { 813 thread_lock(p->p_singlethread); 814 wakeup_swapper = 815 thread_unsuspend_one(p->p_singlethread); 816 thread_unlock(p->p_singlethread); 817 if (wakeup_swapper) 818 kick_proc0(); 819 } 820 } 821 PROC_UNLOCK(p); 822 thread_lock(td); 823 /* 824 * When a thread suspends, it just 825 * gets taken off all queues. 826 */ 827 thread_suspend_one(td); 828 if (return_instead == 0) { 829 p->p_boundary_count++; 830 td->td_flags |= TDF_BOUNDARY; 831 } 832 PROC_SUNLOCK(p); 833 mi_switch(SW_INVOL | SWT_SUSPEND, NULL); 834 if (return_instead == 0) 835 td->td_flags &= ~TDF_BOUNDARY; 836 thread_unlock(td); 837 PROC_LOCK(p); 838 if (return_instead == 0) { 839 PROC_SLOCK(p); 840 p->p_boundary_count--; 841 PROC_SUNLOCK(p); 842 } 843 } 844 return (0); 845 } 846 847 void 848 thread_suspend_switch(struct thread *td) 849 { 850 struct proc *p; 851 852 p = td->td_proc; 853 KASSERT(!TD_IS_SUSPENDED(td), ("already suspended")); 854 PROC_LOCK_ASSERT(p, MA_OWNED); 855 PROC_SLOCK_ASSERT(p, MA_OWNED); 856 /* 857 * We implement thread_suspend_one in stages here to avoid 858 * dropping the proc lock while the thread lock is owned. 859 */ 860 thread_stopped(p); 861 p->p_suspcount++; 862 PROC_UNLOCK(p); 863 thread_lock(td); 864 td->td_flags &= ~TDF_NEEDSUSPCHK; 865 TD_SET_SUSPENDED(td); 866 sched_sleep(td, 0); 867 PROC_SUNLOCK(p); 868 DROP_GIANT(); 869 mi_switch(SW_VOL | SWT_SUSPEND, NULL); 870 thread_unlock(td); 871 PICKUP_GIANT(); 872 PROC_LOCK(p); 873 PROC_SLOCK(p); 874 } 875 876 void 877 thread_suspend_one(struct thread *td) 878 { 879 struct proc *p = td->td_proc; 880 881 PROC_SLOCK_ASSERT(p, MA_OWNED); 882 THREAD_LOCK_ASSERT(td, MA_OWNED); 883 KASSERT(!TD_IS_SUSPENDED(td), ("already suspended")); 884 p->p_suspcount++; 885 td->td_flags &= ~TDF_NEEDSUSPCHK; 886 TD_SET_SUSPENDED(td); 887 sched_sleep(td, 0); 888 } 889 890 int 891 thread_unsuspend_one(struct thread *td) 892 { 893 struct proc *p = td->td_proc; 894 895 PROC_SLOCK_ASSERT(p, MA_OWNED); 896 THREAD_LOCK_ASSERT(td, MA_OWNED); 897 KASSERT(TD_IS_SUSPENDED(td), ("Thread not suspended")); 898 TD_CLR_SUSPENDED(td); 899 p->p_suspcount--; 900 return (setrunnable(td)); 901 } 902 903 /* 904 * Allow all threads blocked by single threading to continue running. 905 */ 906 void 907 thread_unsuspend(struct proc *p) 908 { 909 struct thread *td; 910 int wakeup_swapper; 911 912 PROC_LOCK_ASSERT(p, MA_OWNED); 913 PROC_SLOCK_ASSERT(p, MA_OWNED); 914 wakeup_swapper = 0; 915 if (!P_SHOULDSTOP(p)) { 916 FOREACH_THREAD_IN_PROC(p, td) { 917 thread_lock(td); 918 if (TD_IS_SUSPENDED(td)) { 919 wakeup_swapper |= thread_unsuspend_one(td); 920 } 921 thread_unlock(td); 922 } 923 } else if ((P_SHOULDSTOP(p) == P_STOPPED_SINGLE) && 924 (p->p_numthreads == p->p_suspcount)) { 925 /* 926 * Stopping everything also did the job for the single 927 * threading request. Now we've downgraded to single-threaded, 928 * let it continue. 929 */ 930 thread_lock(p->p_singlethread); 931 wakeup_swapper = thread_unsuspend_one(p->p_singlethread); 932 thread_unlock(p->p_singlethread); 933 } 934 if (wakeup_swapper) 935 kick_proc0(); 936 } 937 938 /* 939 * End the single threading mode.. 940 */ 941 void 942 thread_single_end(void) 943 { 944 struct thread *td; 945 struct proc *p; 946 int wakeup_swapper; 947 948 td = curthread; 949 p = td->td_proc; 950 PROC_LOCK_ASSERT(p, MA_OWNED); 951 p->p_flag &= ~(P_STOPPED_SINGLE | P_SINGLE_EXIT | P_SINGLE_BOUNDARY); 952 PROC_SLOCK(p); 953 p->p_singlethread = NULL; 954 wakeup_swapper = 0; 955 /* 956 * If there are other threads they may now run, 957 * unless of course there is a blanket 'stop order' 958 * on the process. The single threader must be allowed 959 * to continue however as this is a bad place to stop. 960 */ 961 if ((p->p_numthreads != 1) && (!P_SHOULDSTOP(p))) { 962 FOREACH_THREAD_IN_PROC(p, td) { 963 thread_lock(td); 964 if (TD_IS_SUSPENDED(td)) { 965 wakeup_swapper |= thread_unsuspend_one(td); 966 } 967 thread_unlock(td); 968 } 969 } 970 PROC_SUNLOCK(p); 971 if (wakeup_swapper) 972 kick_proc0(); 973 } 974 975 struct thread * 976 thread_find(struct proc *p, lwpid_t tid) 977 { 978 struct thread *td; 979 980 PROC_LOCK_ASSERT(p, MA_OWNED); 981 FOREACH_THREAD_IN_PROC(p, td) { 982 if (td->td_tid == tid) 983 break; 984 } 985 return (td); 986 } 987 988 /* Locate a thread by number; return with proc lock held. */ 989 struct thread * 990 tdfind(lwpid_t tid, pid_t pid) 991 { 992 #define RUN_THRESH 16 993 struct thread *td; 994 int run = 0; 995 996 rw_rlock(&tidhash_lock); 997 LIST_FOREACH(td, TIDHASH(tid), td_hash) { 998 if (td->td_tid == tid) { 999 if (pid != -1 && td->td_proc->p_pid != pid) { 1000 td = NULL; 1001 break; 1002 } 1003 PROC_LOCK(td->td_proc); 1004 if (td->td_proc->p_state == PRS_NEW) { 1005 PROC_UNLOCK(td->td_proc); 1006 td = NULL; 1007 break; 1008 } 1009 if (run > RUN_THRESH) { 1010 if (rw_try_upgrade(&tidhash_lock)) { 1011 LIST_REMOVE(td, td_hash); 1012 LIST_INSERT_HEAD(TIDHASH(td->td_tid), 1013 td, td_hash); 1014 rw_wunlock(&tidhash_lock); 1015 return (td); 1016 } 1017 } 1018 break; 1019 } 1020 run++; 1021 } 1022 rw_runlock(&tidhash_lock); 1023 return (td); 1024 } 1025 1026 void 1027 tidhash_add(struct thread *td) 1028 { 1029 rw_wlock(&tidhash_lock); 1030 LIST_INSERT_HEAD(TIDHASH(td->td_tid), td, td_hash); 1031 rw_wunlock(&tidhash_lock); 1032 } 1033 1034 void 1035 tidhash_remove(struct thread *td) 1036 { 1037 rw_wlock(&tidhash_lock); 1038 LIST_REMOVE(td, td_hash); 1039 rw_wunlock(&tidhash_lock); 1040 } 1041