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 */ 242void 243proc_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 249void 250proc_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 */ 267void 268threadinit(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 */ 286void 287thread_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 */ 297void 298thread_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 */ 307void 308thread_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 */ 335struct thread * 336thread_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 352int 353thread_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 */ 367void 368thread_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 */ 390void 391thread_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 */ 501void 502thread_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 */ 528void 529thread_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 */ 553void 554thread_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 */ 566void 567thread_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 578static int 579calc_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 */ 609int 610thread_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 705stopme: 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 */ 761int 762thread_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 847void 848thread_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 876void 877thread_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 890int 891thread_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 */ 906void 907thread_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 */ 941void 942thread_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 975struct thread * 976thread_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. */ 989struct thread * 990tdfind(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 1026void 1027tidhash_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 1034void 1035tidhash_remove(struct thread *td) 1036{ 1037 rw_wlock(&tidhash_lock); 1038 LIST_REMOVE(td, td_hash); 1039 rw_wunlock(&tidhash_lock); 1040}
|