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.
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.
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]
23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * Copyright (c) 2013, Joyent, Inc. All rights reserved.
31 #include <sys/param.h>
32 #include <sys/types.h>
33 #include <sys/sysmacros.h>
34 #include <sys/systm.h>
35 #include <sys/thread.h>
38 #include <sys/project.h>
39 #include <sys/signal.h>
40 #include <sys/errno.h>
41 #include <sys/vmparam.h>
42 #include <sys/stack.h>
43 #include <sys/procfs.h>
44 #include <sys/prsystm.h>
45 #include <sys/cpuvar.h>
47 #include <sys/vtrace.h>
49 #include <vm/seg_kp.h>
50 #include <sys/debug.h>
52 #include <sys/schedctl.h>
54 #include <sys/copyops.h>
55 #include <sys/lwp_upimutex_impl.h>
56 #include <sys/cpupart.h>
59 #include <sys/contract_impl.h>
60 #include <sys/cpc_impl.h>
62 #include <sys/cmn_err.h>
63 #include <sys/brand.h>
64 #include <sys/cyclic.h>
67 /* hash function for the lwpid hash table, p->p_tidhash[] */
68 #define TIDHASH(tid, hash_sz) ((tid) & ((hash_sz) - 1))
70 void *segkp_lwp
; /* cookie for pool of segkp resources */
71 extern void reapq_move_lq_to_tq(kthread_t
*);
72 extern void freectx_ctx(struct ctxop
*);
75 * Create a kernel thread associated with a particular system process. Give
76 * it an LWP so that microstate accounting will be available for it.
79 lwp_kernel_create(proc_t
*p
, void (*proc
)(), void *arg
, int state
, pri_t pri
)
83 VERIFY((p
->p_flag
& SSYS
) != 0);
85 lwp
= lwp_create(proc
, arg
, 0, p
, state
, pri
, &t0
.t_hold
, syscid
, 0);
93 * Create a thread that appears to be stopped at sys_rtt.
96 lwp_create(void (*proc
)(), caddr_t arg
, size_t len
, proc_t
*p
,
97 int state
, int pri
, const k_sigset_t
*smask
, int cid
, id_t lwpid
)
102 cpupart_t
*oldpart
= NULL
;
104 caddr_t lwpdata
= NULL
;
105 processorid_t binding
;
107 kproject_t
*oldkpj
, *newkpj
;
111 lwpdir_t
*old_dir
= NULL
;
112 uint_t old_dirsz
= 0;
113 tidhash_t
*old_hash
= NULL
;
114 uint_t old_hashsz
= 0;
115 ret_tidhash_t
*ret_tidhash
= NULL
;
118 boolean_t branded
= 0;
119 struct ctxop
*ctx
= NULL
;
121 ASSERT(cid
!= sysdccid
); /* system threads must start in SYS */
123 ASSERT(p
!= &p0
); /* No new LWPs in p0. */
125 mutex_enter(&p
->p_lock
);
126 mutex_enter(&p
->p_zone
->zone_nlwps_lock
);
128 * don't enforce rctl limits on system processes
130 if (!CLASS_KERNEL(cid
)) {
131 if (p
->p_task
->tk_nlwps
>= p
->p_task
->tk_nlwps_ctl
)
132 if (rctl_test(rc_task_lwps
, p
->p_task
->tk_rctls
, p
,
135 if (p
->p_task
->tk_proj
->kpj_nlwps
>=
136 p
->p_task
->tk_proj
->kpj_nlwps_ctl
)
137 if (rctl_test(rc_project_nlwps
,
138 p
->p_task
->tk_proj
->kpj_rctls
, p
, 1, 0)
141 if (p
->p_zone
->zone_nlwps
>= p
->p_zone
->zone_nlwps_ctl
)
142 if (rctl_test(rc_zone_nlwps
, p
->p_zone
->zone_rctls
, p
,
147 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
148 mutex_exit(&p
->p_lock
);
149 atomic_inc_32(&p
->p_zone
->zone_ffcap
);
152 p
->p_task
->tk_nlwps
++;
153 p
->p_task
->tk_proj
->kpj_nlwps
++;
154 p
->p_zone
->zone_nlwps
++;
155 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
156 mutex_exit(&p
->p_lock
);
158 curlwp
= ttolwp(curthread
);
159 if (curlwp
== NULL
|| (stksize
= curlwp
->lwp_childstksz
) == 0)
160 stksize
= lwp_default_stksize
;
162 if (CLASS_KERNEL(cid
)) {
164 * Since we are creating an LWP in an SSYS process, we do not
165 * inherit anything from the current thread's LWP. We set
166 * stksize and lwpdata to 0 in order to let thread_create()
167 * allocate a regular kernel thread stack for this thread.
173 } else if (stksize
== lwp_default_stksize
) {
175 * Try to reuse an <lwp,stack> from the LWP deathrow.
177 if (lwp_reapcnt
> 0) {
178 mutex_enter(&reaplock
);
179 if ((t
= lwp_deathrow
) != NULL
) {
181 lwp_deathrow
= t
->t_forw
;
189 reapq_move_lq_to_tq(t
);
191 mutex_exit(&reaplock
);
199 if (lwpdata
== NULL
&&
200 (lwpdata
= (caddr_t
)segkp_cache_get(segkp_lwp
)) == NULL
) {
201 mutex_enter(&p
->p_lock
);
202 mutex_enter(&p
->p_zone
->zone_nlwps_lock
);
203 p
->p_task
->tk_nlwps
--;
204 p
->p_task
->tk_proj
->kpj_nlwps
--;
205 p
->p_zone
->zone_nlwps
--;
206 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
207 mutex_exit(&p
->p_lock
);
208 atomic_inc_32(&p
->p_zone
->zone_ffnomem
);
212 stksize
= roundup(stksize
, PAGESIZE
);
213 if ((lwpdata
= (caddr_t
)segkp_get(segkp
, stksize
,
214 (KPD_NOWAIT
| KPD_HASREDZONE
| KPD_LOCKED
))) == NULL
) {
215 mutex_enter(&p
->p_lock
);
216 mutex_enter(&p
->p_zone
->zone_nlwps_lock
);
217 p
->p_task
->tk_nlwps
--;
218 p
->p_task
->tk_proj
->kpj_nlwps
--;
219 p
->p_zone
->zone_nlwps
--;
220 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
221 mutex_exit(&p
->p_lock
);
222 atomic_inc_32(&p
->p_zone
->zone_ffnomem
);
228 * Create a thread, initializing the stack pointer
230 t
= thread_create(lwpdata
, stksize
, NULL
, NULL
, 0, p
, TS_STOPPED
, pri
);
233 * If a non-NULL stack base is passed in, thread_create() assumes
234 * that the stack might be statically allocated (as opposed to being
235 * allocated from segkp), and so it does not set t_swap. Since
236 * the lwpdata was allocated from segkp, we must set t_swap to point
239 * This would be less confusing if t_swap had a better name; it really
240 * indicates that the stack is allocated from segkp, regardless of
241 * whether or not it is swappable.
243 if (lwpdata
!= NULL
) {
244 ASSERT(!CLASS_KERNEL(cid
));
245 ASSERT(t
->t_swap
== NULL
);
246 t
->t_swap
= lwpdata
; /* Start of page-able data */
250 * If the stack and lwp can be reused, mark the thread as such.
251 * When we get to reapq_add() from resume_from_zombie(), these
252 * threads will go onto lwp_deathrow instead of thread_deathrow.
254 if (!CLASS_KERNEL(cid
) && stksize
== lwp_default_stksize
)
255 t
->t_flag
|= T_LWPREUSE
;
258 lwp
= kmem_cache_alloc(lwp_cache
, KM_SLEEP
);
259 bzero(lwp
, sizeof (*lwp
));
265 lwp
->lwp_sigaltstack
.ss_flags
= SS_DISABLE
;
266 if (curlwp
!= NULL
&& curlwp
->lwp_childstksz
!= 0)
267 lwp
->lwp_childstksz
= curlwp
->lwp_childstksz
;
269 t
->t_stk
= lwp_stk_init(lwp
, t
->t_stk
);
270 thread_load(t
, proc
, arg
, len
);
273 * Allocate the SIGPROF buffer if ITIMER_REALPROF is in effect.
275 if (p
->p_rprof_cyclic
!= CYCLIC_NONE
)
276 t
->t_rprof
= kmem_zalloc(sizeof (struct rprof
), KM_SLEEP
);
279 (void) CL_ALLOC(&bufp
, cid
, KM_SLEEP
);
282 * Allocate an lwp directory entry for the new lwp.
284 lep
= kmem_zalloc(sizeof (*lep
), KM_SLEEP
);
286 mutex_enter(&p
->p_lock
);
289 * Grow the lwp (thread) directory and lwpid hash table if necessary.
290 * A note on the growth algorithm:
291 * The new lwp directory size is computed as:
293 * Starting with an initial size of 2 (see exec_common()),
294 * this yields numbers that are a power of two minus 2:
295 * 2, 6, 14, 30, 62, 126, 254, 510, 1022, ...
296 * The size of the lwpid hash table must be a power of two
297 * and must be commensurate in size with the lwp directory
298 * so that hash bucket chains remain short. Therefore,
299 * the lwpid hash table size is computed as:
300 * hashsz = (dirsz + 2) / 2
301 * which leads to these hash table sizes corresponding to
302 * the above directory sizes:
303 * 2, 4, 8, 16, 32, 64, 128, 256, 512, ...
304 * A note on growing the hash table:
305 * For performance reasons, code in lwp_unpark() does not
306 * acquire curproc->p_lock when searching the hash table.
307 * Rather, it calls lwp_hash_lookup_and_lock() which
308 * acquires only the individual hash bucket lock, taking
309 * care to deal with reallocation of the hash table
310 * during the time it takes to acquire the lock.
312 * This is sufficient to protect the integrity of the
313 * hash table, but it requires us to acquire all of the
314 * old hash bucket locks before growing the hash table
315 * and to release them afterwards. It also requires us
316 * not to free the old hash table because some thread
317 * in lwp_hash_lookup_and_lock() might still be trying
318 * to acquire the old bucket lock.
320 * So we adopt the tactic of keeping all of the retired
321 * hash tables on a linked list, so they can be safely
322 * freed when the process exits or execs.
324 * Because the hash table grows in powers of two, the
325 * total size of all of the hash tables will be slightly
326 * less than twice the size of the largest hash table.
328 while (p
->p_lwpfree
== NULL
) {
329 uint_t dirsz
= p
->p_lwpdir_sz
;
336 mutex_exit(&p
->p_lock
);
339 * Prepare to remember the old p_tidhash for later
340 * kmem_free()ing when the process exits or execs.
342 if (ret_tidhash
== NULL
)
343 ret_tidhash
= kmem_zalloc(sizeof (ret_tidhash_t
),
346 kmem_free(old_dir
, old_dirsz
* sizeof (*old_dir
));
347 if (old_hash
!= NULL
)
348 kmem_free(old_hash
, old_hashsz
* sizeof (*old_hash
));
350 new_dirsz
= 2 * dirsz
+ 2;
351 new_dir
= kmem_zalloc(new_dirsz
* sizeof (lwpdir_t
), KM_SLEEP
);
352 for (ldp
= new_dir
, i
= 1; i
< new_dirsz
; i
++, ldp
++)
353 ldp
->ld_next
= ldp
+ 1;
354 new_hashsz
= (new_dirsz
+ 2) / 2;
355 new_hash
= kmem_zalloc(new_hashsz
* sizeof (tidhash_t
),
358 mutex_enter(&p
->p_lock
);
362 if (dirsz
!= p
->p_lwpdir_sz
|| p
->p_lwpfree
!= NULL
) {
364 * Someone else beat us to it or some lwp exited.
365 * Set up to free our memory and take a lap.
368 old_dirsz
= new_dirsz
;
370 old_hashsz
= new_hashsz
;
373 * For the benefit of lwp_hash_lookup_and_lock(),
374 * called from lwp_unpark(), which searches the
375 * tid hash table without acquiring p->p_lock,
376 * we must acquire all of the tid hash table
377 * locks before replacing p->p_tidhash.
379 old_hash
= p
->p_tidhash
;
380 old_hashsz
= p
->p_tidhash_sz
;
381 for (i
= 0; i
< old_hashsz
; i
++) {
382 mutex_enter(&old_hash
[i
].th_lock
);
383 mutex_enter(&new_hash
[i
].th_lock
);
387 * We simply hash in all of the old directory entries.
388 * This works because the old directory has no empty
389 * slots and the new hash table starts out empty.
390 * This reproduces the original directory ordering
391 * (required for /proc directory semantics).
393 old_dir
= p
->p_lwpdir
;
394 old_dirsz
= p
->p_lwpdir_sz
;
395 p
->p_lwpdir
= new_dir
;
396 p
->p_lwpfree
= new_dir
;
397 p
->p_lwpdir_sz
= new_dirsz
;
398 for (ldp
= old_dir
, i
= 0; i
< old_dirsz
; i
++, ldp
++)
399 lwp_hash_in(p
, ldp
->ld_entry
,
400 new_hash
, new_hashsz
, 0);
403 * Remember the old hash table along with all
404 * of the previously-remembered hash tables.
405 * We will free them at process exit or exec.
407 ret_tidhash
->rth_tidhash
= old_hash
;
408 ret_tidhash
->rth_tidhash_sz
= old_hashsz
;
409 ret_tidhash
->rth_next
= p
->p_ret_tidhash
;
410 p
->p_ret_tidhash
= ret_tidhash
;
413 * Now establish the new tid hash table.
414 * As soon as we assign p->p_tidhash,
415 * code in lwp_unpark() can start using it.
418 p
->p_tidhash
= new_hash
;
421 * It is necessary that p_tidhash reach global
422 * visibility before p_tidhash_sz. Otherwise,
423 * code in lwp_hash_lookup_and_lock() could
424 * index into the old p_tidhash using the new
425 * p_tidhash_sz and thereby access invalid data.
428 p
->p_tidhash_sz
= new_hashsz
;
431 * Release the locks; allow lwp_unpark() to carry on.
433 for (i
= 0; i
< old_hashsz
; i
++) {
434 mutex_exit(&old_hash
[i
].th_lock
);
435 mutex_exit(&new_hash
[i
].th_lock
);
439 * Avoid freeing these objects below.
448 * Block the process against /proc while we manipulate p->p_tlist,
449 * unless lwp_create() was called by /proc for the PCAGENT operation.
450 * We want to do this early enough so that we don't drop p->p_lock
451 * until the thread is put on the p->p_tlist.
456 * If the current lwp has been requested to stop, do so now.
457 * Otherwise we have a race condition between /proc attempting
458 * to stop the process and this thread creating a new lwp
459 * that was not seen when the /proc PCSTOP request was issued.
460 * We rely on stop() to call prbarrier(p) before returning.
462 while ((curthread
->t_proc_flag
& TP_PRSTOP
) &&
463 !ttolwp(curthread
)->lwp_nostop
) {
465 * We called pool_barrier_enter() before calling
466 * here to lwp_create(). We have to call
467 * pool_barrier_exit() before stopping.
471 stop(PR_REQUESTED
, 0);
473 * And we have to repeat the call to
474 * pool_barrier_enter after stopping.
476 pool_barrier_enter();
481 * If process is exiting, there could be a race between
482 * the agent lwp creation and the new lwp currently being
483 * created. So to prevent this race lwp creation is failed
484 * if the process is exiting.
486 if (p
->p_flag
& (SEXITLWPS
|SKILLED
)) {
492 * Since we might have dropped p->p_lock, the
493 * lwp directory free list might have changed.
495 if (p
->p_lwpfree
== NULL
)
499 kpreempt_disable(); /* can't grab cpu_lock here */
502 * Inherit processor and processor set bindings from curthread.
504 * For kernel LWPs, we do not inherit processor set bindings at
505 * process creation time (i.e. when p != curproc). After the
506 * kernel process is created, any subsequent LWPs must be created
507 * by threads in the kernel process, at which point we *will*
508 * inherit processor set bindings.
510 if (CLASS_KERNEL(cid
) && p
!= curproc
) {
511 t
->t_bind_cpu
= binding
= PBIND_NONE
;
512 t
->t_cpupart
= oldpart
= &cp_default
;
513 t
->t_bind_pset
= PS_NONE
;
514 t
->t_bindflag
= (uchar_t
)default_binding_mode
;
516 binding
= curthread
->t_bind_cpu
;
517 t
->t_bind_cpu
= binding
;
518 oldpart
= t
->t_cpupart
;
519 t
->t_cpupart
= curthread
->t_cpupart
;
520 t
->t_bind_pset
= curthread
->t_bind_pset
;
521 t
->t_bindflag
= curthread
->t_bindflag
|
522 (uchar_t
)default_binding_mode
;
526 * thread_create() initializes this thread's home lgroup to the root.
527 * Choose a more suitable lgroup, since this thread is associated
530 ASSERT(oldpart
!= NULL
);
531 if (binding
!= PBIND_NONE
&& t
->t_affinitycnt
== 0) {
532 t
->t_bound_cpu
= cpu
[binding
];
533 if (t
->t_lpl
!= t
->t_bound_cpu
->cpu_lpl
)
534 lgrp_move_thread(t
, t
->t_bound_cpu
->cpu_lpl
, 1);
535 } else if (CLASS_KERNEL(cid
)) {
537 * Kernel threads are always in the root lgrp.
540 &t
->t_cpupart
->cp_lgrploads
[LGRP_ROOTID
], 1);
542 lgrp_move_thread(t
, lgrp_choose(t
, t
->t_cpupart
), 1);
548 * make sure lpl points to our own partition
550 ASSERT(t
->t_lpl
>= t
->t_cpupart
->cp_lgrploads
);
551 ASSERT(t
->t_lpl
< t
->t_cpupart
->cp_lgrploads
+
552 t
->t_cpupart
->cp_nlgrploads
);
555 * It is safe to point the thread to the new project without holding it
556 * since we're holding the target process' p_lock here and therefore
557 * we're guaranteed that it will not move to another project.
559 newkpj
= p
->p_task
->tk_proj
;
561 if (newkpj
!= oldkpj
) {
563 (void) project_hold(newkpj
);
564 project_rele(oldkpj
);
567 if (cid
!= NOCLASS
) {
569 * If the lwp is being created in the current process
570 * and matches the current thread's scheduling class,
571 * we should propagate the current thread's scheduling
572 * parameters by calling CL_FORK. Otherwise just use
573 * the defaults by calling CL_ENTERCLASS.
575 if (p
!= curproc
|| curthread
->t_cid
!= cid
) {
576 err
= CL_ENTERCLASS(t
, cid
, NULL
, NULL
, bufp
);
577 t
->t_pri
= pri
; /* CL_ENTERCLASS may have changed it */
579 * We don't call schedctl_set_cidpri(t) here
580 * because the schedctl data is not yet set
581 * up for the newly-created lwp.
584 t
->t_clfuncs
= &(sclass
[cid
].cl_funcs
->thread
);
585 err
= CL_FORK(curthread
, t
, bufp
);
589 atomic_inc_32(&p
->p_zone
->zone_ffmisc
);
597 * If we were given an lwpid then use it, else allocate one.
603 * lwp/thread id 0 is never valid; reserved for special checks.
604 * lwp/thread id 1 is reserved for the main thread.
605 * Start again at 2 when INT_MAX has been reached
606 * (id_t is a signed 32-bit integer).
608 id_t prev_id
= p
->p_lwpid
; /* last allocated tid */
610 do { /* avoid lwpid duplication */
611 if (p
->p_lwpid
== INT_MAX
) {
612 p
->p_flag
|= SLWPWRAP
;
615 if ((t
->t_tid
= ++p
->p_lwpid
) == prev_id
) {
617 * All lwpids are allocated; fail the request.
620 atomic_inc_32(&p
->p_zone
->zone_ffnoproc
);
624 * We only need to worry about colliding with an id
625 * that's already in use if this process has
626 * cycled through all available lwp ids.
628 if ((p
->p_flag
& SLWPWRAP
) == 0)
630 } while (lwp_hash_lookup(p
, t
->t_tid
) != NULL
);
634 * If this is a branded process, let the brand do any necessary lwp
637 if (PROC_IS_BRANDED(p
)) {
638 if (BROP(p
)->b_initlwp(lwp
)) {
640 atomic_inc_32(&p
->p_zone
->zone_ffmisc
);
648 ASSERT(t
->t_lpl
!= NULL
);
649 p
->p_t1_lgrpid
= t
->t_lpl
->lpl_lgrpid
;
651 if (p
->p_tr_lgrpid
!= LGRP_NONE
&&
652 p
->p_tr_lgrpid
!= p
->p_t1_lgrpid
) {
653 lgrp_update_trthr_migrations(1);
661 * Turn microstate accounting on for thread if on for process.
663 if (p
->p_flag
& SMSACCT
)
664 t
->t_proc_flag
|= TP_MSACCT
;
667 * If the process has watchpoints, mark the new thread as such.
669 if (pr_watch_active(p
))
673 * The lwp is being created in the stopped state.
674 * We set all the necessary flags to indicate that fact here.
675 * We omit the TS_CREATE flag from t_schedflag so that the lwp
676 * cannot be set running until the caller is finished with it,
677 * even if lwp_continue() is called on it after we drop p->p_lock.
678 * When the caller is finished with the newly-created lwp,
679 * the caller must call lwp_create_done() to allow the lwp
680 * to be set running. If the TP_HOLDLWP is left set, the
681 * lwp will suspend itself after reaching system call exit.
683 init_mstate(t
, LMS_STOPPED
);
684 t
->t_proc_flag
|= TP_HOLDLWP
;
685 t
->t_schedflag
|= (TS_ALLSTART
& ~(TS_CSTART
| TS_CREATE
));
686 t
->t_whystop
= PR_SUSPENDED
;
687 t
->t_whatstop
= SUSPEND_NORMAL
;
688 t
->t_sig_check
= 1; /* ensure that TP_HOLDLWP is honored */
691 * Set system call processing flags in case tracing or profiling
692 * is set. The first system call will evaluate these and turn
693 * them off if they aren't needed.
699 * Insert the new thread into the list of all threads.
701 if ((tx
= p
->p_tlist
) == NULL
) {
707 t
->t_back
= tx
->t_back
;
708 tx
->t_back
->t_forw
= t
;
713 * Insert the new lwp into an lwp directory slot position
714 * and into the lwpid hash table.
717 lep
->le_lwpid
= t
->t_tid
;
718 lep
->le_start
= t
->t_start
;
719 lwp_hash_in(p
, lep
, p
->p_tidhash
, p
->p_tidhash_sz
, 1);
723 if (state
== TS_RUN
) {
725 * We set the new lwp running immediately.
727 t
->t_proc_flag
&= ~TP_HOLDLWP
;
733 if (CLASS_KERNEL(cid
)) {
735 * This should only happen if a system process runs
736 * out of lwpids, which shouldn't occur.
738 panic("Failed to create a system LWP");
741 * We have failed to create an lwp, so decrement the number
742 * of lwps in the task and let the lgroup load averages know
743 * that this thread isn't going to show up.
746 lgrp_move_thread(t
, NULL
, 1);
749 ASSERT(MUTEX_HELD(&p
->p_lock
));
750 mutex_enter(&p
->p_zone
->zone_nlwps_lock
);
751 p
->p_task
->tk_nlwps
--;
752 p
->p_task
->tk_proj
->kpj_nlwps
--;
753 p
->p_zone
->zone_nlwps
--;
754 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
755 if (cid
!= NOCLASS
&& bufp
!= NULL
)
759 BROP(p
)->b_freelwp(lwp
);
761 mutex_exit(&p
->p_lock
);
762 t
->t_state
= TS_FREE
;
766 * We need to remove t from the list of all threads
767 * because thread_exit()/lwp_exit() isn't called on t.
769 mutex_enter(&pidlock
);
770 ASSERT(t
!= t
->t_next
); /* t0 never exits */
771 t
->t_next
->t_prev
= t
->t_prev
;
772 t
->t_prev
->t_next
= t
->t_next
;
773 mutex_exit(&pidlock
);
776 kmem_free(lep
, sizeof (*lep
));
779 mutex_exit(&p
->p_lock
);
783 kmem_free(old_dir
, old_dirsz
* sizeof (*old_dir
));
784 if (old_hash
!= NULL
)
785 kmem_free(old_hash
, old_hashsz
* sizeof (*old_hash
));
786 if (ret_tidhash
!= NULL
)
787 kmem_free(ret_tidhash
, sizeof (ret_tidhash_t
));
789 DTRACE_PROC1(lwp__create
, kthread_t
*, t
);
794 * lwp_create_done() is called by the caller of lwp_create() to set the
795 * newly-created lwp running after the caller has finished manipulating it.
798 lwp_create_done(kthread_t
*t
)
800 proc_t
*p
= ttoproc(t
);
802 ASSERT(MUTEX_HELD(&p
->p_lock
));
805 * We set the TS_CREATE and TS_CSTART flags and call setrun_locked().
806 * (The absence of the TS_CREATE flag prevents the lwp from running
807 * until we are finished with it, even if lwp_continue() is called on
808 * it by some other lwp in the process or elsewhere in the kernel.)
811 ASSERT(t
->t_state
== TS_STOPPED
&& !(t
->t_schedflag
& TS_CREATE
));
813 * If TS_CSTART is set, lwp_continue(t) has been called and
814 * has already incremented p_lwprcnt; avoid doing this twice.
816 if (!(t
->t_schedflag
& TS_CSTART
))
818 t
->t_schedflag
|= (TS_CSTART
| TS_CREATE
);
824 * Copy an LWP's active templates, and clear the latest contracts.
827 lwp_ctmpl_copy(klwp_t
*dst
, klwp_t
*src
)
831 for (i
= 0; i
< ct_ntypes
; i
++) {
832 dst
->lwp_ct_active
[i
] = ctmpl_dup(src
->lwp_ct_active
[i
]);
833 dst
->lwp_ct_latest
[i
] = NULL
;
838 * Clear an LWP's contract template state.
841 lwp_ctmpl_clear(klwp_t
*lwp
)
846 for (i
= 0; i
< ct_ntypes
; i
++) {
847 if ((tmpl
= lwp
->lwp_ct_active
[i
]) != NULL
) {
849 lwp
->lwp_ct_active
[i
] = NULL
;
852 if (lwp
->lwp_ct_latest
[i
] != NULL
) {
853 contract_rele(lwp
->lwp_ct_latest
[i
]);
854 lwp
->lwp_ct_latest
[i
] = NULL
;
860 * Individual lwp exit.
861 * If this is the last lwp, exit the whole process.
866 kthread_t
*t
= curthread
;
867 klwp_t
*lwp
= ttolwp(t
);
868 proc_t
*p
= ttoproc(t
);
870 ASSERT(MUTEX_HELD(&p
->p_lock
));
872 mutex_exit(&p
->p_lock
);
875 tsd_exit(); /* free thread specific data */
877 kcpc_passivate(); /* Clean up performance counter state */
884 if (t
->t_schedctl
!= NULL
)
885 schedctl_lwp_cleanup(t
);
887 if (t
->t_upimutex
!= NULL
)
891 * Perform any brand specific exit processing, then release any
892 * brand data associated with the lwp
894 if (PROC_IS_BRANDED(p
))
895 BROP(p
)->b_lwpexit(lwp
);
899 mutex_enter(&p
->p_lock
);
903 * When this process is dumping core, its lwps are held here
904 * until the core dump is finished. Then exitlwps() is called
905 * again to release these lwps so that they can finish exiting.
907 if (p
->p_flag
& SCOREDUMP
)
908 stop(PR_SUSPENDED
, SUSPEND_NORMAL
);
911 * Block the process against /proc now that we have really acquired
912 * p->p_lock (to decrement p_lwpcnt and manipulate p_tlist at least).
917 * Call proc_exit() if this is the last non-daemon lwp in the process.
919 if (!(t
->t_proc_flag
& TP_DAEMON
) &&
920 p
->p_lwpcnt
== p
->p_lwpdaemon
+ 1) {
921 mutex_exit(&p
->p_lock
);
922 if (proc_exit(CLD_EXITED
, 0) == 0) {
923 /* Restarting init. */
928 * proc_exit() returns a non-zero value when some other
929 * lwp got there first. We just have to continue in
932 mutex_enter(&p
->p_lock
);
933 ASSERT(curproc
->p_flag
& SEXITLWPS
);
937 DTRACE_PROC(lwp__exit
);
940 * If the lwp is a detached lwp or if the process is exiting,
941 * remove (lwp_hash_out()) the lwp from the lwp directory.
942 * Otherwise null out the lwp's le_thread pointer in the lwp
943 * directory so that other threads will see it as a zombie lwp.
945 prlwpexit(t
); /* notify /proc */
946 if (!(t
->t_proc_flag
& TP_TWAIT
) || (p
->p_flag
& SEXITLWPS
))
947 lwp_hash_out(p
, t
->t_tid
);
949 ASSERT(!(t
->t_proc_flag
& TP_DAEMON
));
950 p
->p_lwpdir
[t
->t_dslot
].ld_entry
->le_thread
= NULL
;
952 cv_broadcast(&p
->p_lwpexit
);
954 if (t
->t_proc_flag
& TP_DAEMON
) {
956 t
->t_proc_flag
&= ~TP_DAEMON
;
958 t
->t_proc_flag
&= ~TP_TWAIT
;
961 * Maintain accurate lwp count for task.max-lwps resource control.
963 mutex_enter(&p
->p_zone
->zone_nlwps_lock
);
964 p
->p_task
->tk_nlwps
--;
965 p
->p_task
->tk_proj
->kpj_nlwps
--;
966 p
->p_zone
->zone_nlwps
--;
967 mutex_exit(&p
->p_zone
->zone_nlwps_lock
);
969 CL_EXIT(t
); /* tell the scheduler that t is exiting */
970 ASSERT(p
->p_lwpcnt
!= 0);
974 * If all remaining non-daemon lwps are waiting in lwp_wait(),
975 * wake them up so someone can return EDEADLK.
976 * (See the block comment preceeding lwp_wait().)
978 if (p
->p_lwpcnt
== p
->p_lwpdaemon
+ (p
->p_lwpwait
- p
->p_lwpdwait
))
979 cv_broadcast(&p
->p_lwpexit
);
981 t
->t_proc_flag
|= TP_LWPEXIT
;
990 t
->t_forw
->t_back
= t
->t_back
;
991 t
->t_back
->t_forw
= t
->t_forw
;
993 p
->p_tlist
= t
->t_forw
;
996 * Clean up the signal state.
998 if (t
->t_sigqueue
!= NULL
)
1000 if (lwp
->lwp_curinfo
!= NULL
) {
1001 siginfofree(lwp
->lwp_curinfo
);
1002 lwp
->lwp_curinfo
= NULL
;
1006 * If we have spymaster information (that is, if we're an agent LWP),
1009 if (lwp
->lwp_spymaster
!= NULL
) {
1010 kmem_free(lwp
->lwp_spymaster
, sizeof (psinfo_t
));
1011 lwp
->lwp_spymaster
= NULL
;
1017 * Terminated lwps are associated with process zero and are put onto
1018 * death-row by resume(). Avoid preemption after resetting t->t_procp.
1022 if (t
->t_ctx
!= NULL
)
1024 if (p
->p_pctx
!= NULL
)
1030 * Notify the HAT about the change of address space
1034 * When this is the last running lwp in this process and some lwp is
1035 * waiting for this condition to become true, or this thread was being
1036 * suspended, then the waiting lwp is awakened.
1038 * Also, if the process is exiting, we may have a thread waiting in
1039 * exitlwps() that needs to be notified.
1041 if (--p
->p_lwprcnt
== 0 || (t
->t_proc_flag
& TP_HOLDLWP
) ||
1042 (p
->p_flag
& SEXITLWPS
))
1043 cv_broadcast(&p
->p_holdlwps
);
1046 * Need to drop p_lock so we can reacquire pidlock.
1048 mutex_exit(&p
->p_lock
);
1049 mutex_enter(&pidlock
);
1051 ASSERT(t
!= t
->t_next
); /* t0 never exits */
1052 t
->t_next
->t_prev
= t
->t_prev
;
1053 t
->t_prev
->t_next
= t
->t_next
;
1054 cv_broadcast(&t
->t_joincv
); /* wake up anyone in thread_join */
1055 mutex_exit(&pidlock
);
1057 t
->t_state
= TS_ZOMB
;
1058 swtch_from_zombie();
1064 * Cleanup function for an exiting lwp.
1065 * Called both from lwp_exit() and from proc_exit().
1066 * p->p_lock is repeatedly released and grabbed in this function.
1071 kthread_t
*t
= curthread
;
1072 proc_t
*p
= ttoproc(t
);
1074 ASSERT(MUTEX_HELD(&p
->p_lock
));
1076 /* untimeout any lwp-bound realtime timers */
1077 if (p
->p_itimer
!= NULL
)
1081 * If this is the /proc agent lwp that is exiting, readjust p_lwpid
1082 * so it appears that the agent never existed, and clear p_agenttp.
1084 if (t
== p
->p_agenttp
) {
1085 ASSERT(t
->t_tid
== p
->p_lwpid
);
1087 p
->p_agenttp
= NULL
;
1091 * Do lgroup bookkeeping to account for thread exiting.
1094 lgrp_move_thread(t
, NULL
, 1);
1095 if (t
->t_tid
== 1) {
1096 p
->p_t1_lgrpid
= LGRP_NONE
;
1100 lwp_ctmpl_clear(ttolwp(t
));
1104 lwp_suspend(kthread_t
*t
)
1107 proc_t
*p
= ttoproc(t
);
1109 ASSERT(MUTEX_HELD(&p
->p_lock
));
1112 * Set the thread's TP_HOLDLWP flag so it will stop in holdlwp().
1113 * If an lwp is stopping itself, there is no need to wait.
1116 t
->t_proc_flag
|= TP_HOLDLWP
;
1117 if (t
== curthread
) {
1121 * Make sure the lwp stops promptly.
1126 * XXX Should use virtual stop like /proc does instead of
1127 * XXX waking the thread to get it to stop.
1129 if (ISWAKEABLE(t
) || ISWAITING(t
)) {
1131 } else if (t
->t_state
== TS_ONPROC
&& t
->t_cpu
!= CPU
) {
1132 poke_cpu(t
->t_cpu
->cpu_id
);
1135 tid
= t
->t_tid
; /* remember thread ID */
1137 * Wait for lwp to stop
1139 while (!SUSPENDED(t
)) {
1141 * Drop the thread lock before waiting and reacquire it
1142 * afterwards, so the thread can change its t_state
1148 * Check if aborted by exitlwps().
1150 if (p
->p_flag
& SEXITLWPS
)
1154 * Cooperate with jobcontrol signals and /proc stopping
1155 * by calling cv_wait_sig() to wait for the target
1156 * lwp to stop. Just using cv_wait() can lead to
1157 * deadlock because, if some other lwp has stopped
1158 * by either of these mechanisms, then p_lwprcnt will
1159 * never become zero if we do a cv_wait().
1161 if (!cv_wait_sig(&p
->p_holdlwps
, &p
->p_lock
))
1165 * Check to see if thread died while we were
1166 * waiting for it to suspend.
1168 if (idtot(p
, tid
) == NULL
)
1173 * If the TP_HOLDLWP flag went away, lwp_continue()
1174 * or vfork() must have been called while we were
1175 * waiting, so start over again.
1177 if ((t
->t_proc_flag
& TP_HOLDLWP
) == 0) {
1188 * continue a lwp that's been stopped by lwp_suspend().
1191 lwp_continue(kthread_t
*t
)
1193 proc_t
*p
= ttoproc(t
);
1194 int was_suspended
= t
->t_proc_flag
& TP_HOLDLWP
;
1196 ASSERT(MUTEX_HELD(&p
->p_lock
));
1198 t
->t_proc_flag
&= ~TP_HOLDLWP
;
1201 !(p
->p_flag
& (SHOLDFORK
| SHOLDFORK1
| SHOLDWATCH
))) {
1203 t
->t_schedflag
|= TS_CSTART
;
1208 * Wakeup anyone waiting for this thread to be suspended
1211 cv_broadcast(&p
->p_holdlwps
);
1215 * ********************************
1216 * Miscellaneous lwp routines *
1217 * ********************************
1220 * When a process is undergoing a forkall(), its p_flag is set to SHOLDFORK.
1221 * This will cause the process's lwps to stop at a hold point. A hold
1222 * point is where a kernel thread has a flat stack. This is at the
1223 * return from a system call and at the return from a user level trap.
1225 * When a process is undergoing a fork1() or vfork(), its p_flag is set to
1226 * SHOLDFORK1. This will cause the process's lwps to stop at a modified
1227 * hold point. The lwps in the process are not being cloned, so they
1228 * are held at the usual hold points and also within issig_forreal().
1229 * This has the side-effect that their system calls do not return
1232 * An lwp can also be held. This is identified by the TP_HOLDLWP flag on
1233 * the thread. The TP_HOLDLWP flag is set in lwp_suspend(), where the active
1234 * lwp is waiting for the target lwp to be stopped.
1239 proc_t
*p
= curproc
;
1240 kthread_t
*t
= curthread
;
1242 mutex_enter(&p
->p_lock
);
1244 * Don't terminate immediately if the process is dumping core.
1245 * Once the process has dumped core, all lwps are terminated.
1247 if (!(p
->p_flag
& SCOREDUMP
)) {
1248 if ((p
->p_flag
& SEXITLWPS
) || (t
->t_proc_flag
& TP_EXITLWP
))
1251 if (!(ISHOLD(p
)) && !(p
->p_flag
& (SHOLDFORK1
| SHOLDWATCH
))) {
1252 mutex_exit(&p
->p_lock
);
1256 * stop() decrements p->p_lwprcnt and cv_signal()s &p->p_holdlwps
1257 * when p->p_lwprcnt becomes zero.
1259 stop(PR_SUSPENDED
, SUSPEND_NORMAL
);
1260 if (p
->p_flag
& SEXITLWPS
)
1262 mutex_exit(&p
->p_lock
);
1266 * Have all lwps within the process hold at a point where they are
1267 * cloneable (SHOLDFORK) or just safe w.r.t. fork1 (SHOLDFORK1).
1270 holdlwps(int holdflag
)
1272 proc_t
*p
= curproc
;
1274 ASSERT(holdflag
== SHOLDFORK
|| holdflag
== SHOLDFORK1
);
1275 mutex_enter(&p
->p_lock
);
1276 schedctl_finish_sigblock(curthread
);
1278 while (p
->p_flag
& (SEXITLWPS
| SHOLDFORK
| SHOLDFORK1
| SHOLDWATCH
)) {
1280 * If another lwp is doing a forkall() or proc_exit(), bail out.
1282 if (p
->p_flag
& (SEXITLWPS
| SHOLDFORK
)) {
1283 mutex_exit(&p
->p_lock
);
1287 * Another lwp is doing a fork1() or is undergoing
1288 * watchpoint activity. We hold here for it to complete.
1290 stop(PR_SUSPENDED
, SUSPEND_NORMAL
);
1292 p
->p_flag
|= holdflag
;
1296 * Wait for the process to become quiescent (p->p_lwprcnt == 0).
1298 while (p
->p_lwprcnt
> 0) {
1300 * Check if aborted by exitlwps().
1301 * Also check if SHOLDWATCH is set; it takes precedence.
1303 if (p
->p_flag
& (SEXITLWPS
| SHOLDWATCH
)) {
1305 p
->p_flag
&= ~holdflag
;
1306 cv_broadcast(&p
->p_holdlwps
);
1310 * Cooperate with jobcontrol signals and /proc stopping.
1311 * If some other lwp has stopped by either of these
1312 * mechanisms, then p_lwprcnt will never become zero
1313 * and the process will appear deadlocked unless we
1314 * stop here in sympathy with the other lwp before
1315 * doing the cv_wait() below.
1317 * If the other lwp stops after we do the cv_wait(), it
1318 * will wake us up to loop around and do the sympathy stop.
1320 * Since stop() drops p->p_lock, we must start from
1321 * the top again on returning from stop().
1323 if (p
->p_stopsig
| (curthread
->t_proc_flag
& TP_PRSTOP
)) {
1324 int whystop
= p
->p_stopsig
? PR_JOBCONTROL
:
1327 p
->p_flag
&= ~holdflag
;
1328 stop(whystop
, p
->p_stopsig
);
1331 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1334 p
->p_flag
&= ~holdflag
;
1335 mutex_exit(&p
->p_lock
);
1340 * See comments for holdwatch(), below.
1343 holdcheck(int clearflags
)
1345 proc_t
*p
= curproc
;
1348 * If we are trying to exit, that takes precedence over anything else.
1350 if (p
->p_flag
& SEXITLWPS
) {
1352 p
->p_flag
&= ~clearflags
;
1357 * If another thread is calling fork1(), stop the current thread so the
1358 * other can complete.
1360 if (p
->p_flag
& SHOLDFORK1
) {
1362 stop(PR_SUSPENDED
, SUSPEND_NORMAL
);
1363 if (p
->p_flag
& SEXITLWPS
) {
1364 p
->p_flag
&= ~clearflags
;
1371 * If another thread is calling fork(), then indicate we are doing
1372 * watchpoint activity. This will cause holdlwps() above to stop the
1373 * forking thread, at which point we can continue with watchpoint
1376 if (p
->p_flag
& SHOLDFORK
) {
1378 while (p
->p_flag
& SHOLDFORK
) {
1379 p
->p_flag
|= SHOLDWATCH
;
1380 cv_broadcast(&p
->p_holdlwps
);
1381 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1382 p
->p_flag
&= ~SHOLDWATCH
;
1391 * Stop all lwps within the process, holding themselves in the kernel while the
1392 * active lwp undergoes watchpoint activity. This is more complicated than
1393 * expected because stop() relies on calling holdwatch() in order to copyin data
1394 * from the user's address space. A double barrier is used to prevent an
1397 * o The first thread into holdwatch() is the 'master' thread and does
1400 * - Sets SHOLDWATCH on the current process
1401 * - Sets TP_WATCHSTOP on the current thread
1402 * - Waits for all threads to be either stopped or have
1404 * - Sets the SWATCHOK flag on the process
1405 * - Unsets TP_WATCHSTOP
1406 * - Waits for the other threads to completely stop
1409 * o If SHOLDWATCH is already set when we enter this function, then another
1410 * thread is already trying to stop this thread. This 'slave' thread
1411 * does the following:
1413 * - Sets TP_WATCHSTOP on the current thread
1414 * - Waits for SWATCHOK flag to be set
1417 * o If SWATCHOK is set on the process, then this function immediately
1418 * returns, as we must have been called via stop().
1420 * In addition, there are other flags that take precedence over SHOLDWATCH:
1422 * o If SEXITLWPS is set, exit immediately.
1424 * o If SHOLDFORK1 is set, wait for fork1() to complete.
1426 * o If SHOLDFORK is set, then watchpoint activity takes precedence In this
1427 * case, set SHOLDWATCH, signalling the forking thread to stop first.
1429 * o If the process is being stopped via /proc (TP_PRSTOP is set), then we
1430 * stop the current thread.
1432 * Returns 0 if all threads have been quiesced. Returns non-zero if not all
1433 * threads were stopped, or the list of watched pages has changed.
1438 proc_t
*p
= curproc
;
1439 kthread_t
*t
= curthread
;
1442 mutex_enter(&p
->p_lock
);
1447 * Check for bail-out conditions as outlined above.
1449 if (holdcheck(0) != 0) {
1450 mutex_exit(&p
->p_lock
);
1454 if (!(p
->p_flag
& SHOLDWATCH
)) {
1456 * We are the master watchpoint thread. Set SHOLDWATCH and poke
1457 * the other threads.
1459 p
->p_flag
|= SHOLDWATCH
;
1463 * Wait for all threads to be stopped or have TP_WATCHSTOP set.
1465 while (pr_allstopped(p
, 1) > 0) {
1466 if (holdcheck(SHOLDWATCH
) != 0) {
1467 p
->p_flag
&= ~SHOLDWATCH
;
1468 mutex_exit(&p
->p_lock
);
1472 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1476 * All threads are now stopped or in the process of stopping.
1477 * Set SWATCHOK and let them stop completely.
1479 p
->p_flag
|= SWATCHOK
;
1480 t
->t_proc_flag
&= ~TP_WATCHSTOP
;
1481 cv_broadcast(&p
->p_holdlwps
);
1483 while (pr_allstopped(p
, 0) > 0) {
1485 * At first glance, it may appear that we don't need a
1486 * call to holdcheck() here. But if the process gets a
1487 * SIGKILL signal, one of our stopped threads may have
1488 * been awakened and is waiting in exitlwps(), which
1489 * takes precedence over watchpoints.
1491 if (holdcheck(SHOLDWATCH
| SWATCHOK
) != 0) {
1492 p
->p_flag
&= ~(SHOLDWATCH
| SWATCHOK
);
1493 mutex_exit(&p
->p_lock
);
1497 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1501 * All threads are now completely stopped.
1503 p
->p_flag
&= ~SWATCHOK
;
1504 p
->p_flag
&= ~SHOLDWATCH
;
1507 } else if (!(p
->p_flag
& SWATCHOK
)) {
1510 * SHOLDWATCH is set, so another thread is trying to do
1511 * watchpoint activity. Indicate this thread is stopping, and
1512 * wait for the OK from the master thread.
1514 t
->t_proc_flag
|= TP_WATCHSTOP
;
1515 cv_broadcast(&p
->p_holdlwps
);
1517 while (!(p
->p_flag
& SWATCHOK
)) {
1518 if (holdcheck(0) != 0) {
1519 t
->t_proc_flag
&= ~TP_WATCHSTOP
;
1520 mutex_exit(&p
->p_lock
);
1524 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1528 * Once the master thread has given the OK, this thread can
1529 * actually call stop().
1531 t
->t_proc_flag
&= ~TP_WATCHSTOP
;
1534 stop(PR_SUSPENDED
, SUSPEND_NORMAL
);
1537 * It's not OK to do watchpoint activity, notify caller to
1545 * The only way we can hit the case where SHOLDWATCH is set and
1546 * SWATCHOK is set is if we are triggering this from within a
1547 * stop() call. Assert that this is the case.
1550 ASSERT(t
->t_proc_flag
& TP_STOPPING
);
1554 mutex_exit(&p
->p_lock
);
1560 * force all interruptible lwps to trap into the kernel.
1567 ASSERT(MUTEX_HELD(&p
->p_lock
));
1574 aston(t
); /* make thread trap or do post_syscall */
1575 if (ISWAKEABLE(t
) || ISWAITING(t
)) {
1577 } else if (t
->t_state
== TS_STOPPED
) {
1579 * Ensure that proc_exit() is not blocked by lwps
1580 * that were stopped via jobcontrol or /proc.
1582 if (p
->p_flag
& SEXITLWPS
) {
1584 t
->t_schedflag
|= (TS_XSTART
| TS_PSTART
);
1588 * If we are holding lwps for a forkall(),
1589 * force lwps that have been suspended via
1590 * lwp_suspend() and are suspended inside
1591 * of a system call to proceed to their
1592 * holdlwp() points where they are clonable.
1594 if ((p
->p_flag
& SHOLDFORK
) && SUSPENDED(t
)) {
1595 if ((t
->t_schedflag
& TS_CSTART
) == 0) {
1597 t
->t_schedflag
|= TS_CSTART
;
1601 } else if (t
->t_state
== TS_ONPROC
) {
1602 if (t
->t_cpu
!= CPU
)
1603 poke_cpu(t
->t_cpu
->cpu_id
);
1606 } while ((t
= t
->t_forw
) != p
->p_tlist
);
1610 * undo the effects of holdlwps() or holdwatch().
1613 continuelwps(proc_t
*p
)
1618 * If this flag is set, then the original holdwatch() didn't actually
1619 * stop the process. See comments for holdwatch().
1621 if (p
->p_flag
& SWATCHOK
) {
1622 ASSERT(curthread
->t_proc_flag
& TP_STOPPING
);
1626 ASSERT(MUTEX_HELD(&p
->p_lock
));
1627 ASSERT((p
->p_flag
& (SHOLDFORK
| SHOLDFORK1
| SHOLDWATCH
)) == 0);
1631 thread_lock(t
); /* SUSPENDED looks at t_schedflag */
1632 if (SUSPENDED(t
) && !(t
->t_proc_flag
& TP_HOLDLWP
)) {
1634 t
->t_schedflag
|= TS_CSTART
;
1638 } while ((t
= t
->t_forw
) != p
->p_tlist
);
1642 * Force all other LWPs in the current process other than the caller to exit,
1643 * and then cv_wait() on p_holdlwps for them to exit. The exitlwps() function
1644 * is typically used in these situations:
1646 * (a) prior to an exec() system call
1647 * (b) prior to dumping a core file
1648 * (c) prior to a uadmin() shutdown
1650 * If the 'coredump' flag is set, other LWPs are quiesced but not destroyed.
1651 * Multiple threads in the process can call this function at one time by
1652 * triggering execs or core dumps simultaneously, so the SEXITLWPS bit is used
1653 * to declare one particular thread the winner who gets to kill the others.
1654 * If a thread wins the exitlwps() dance, zero is returned; otherwise an
1655 * appropriate errno value is returned to caller for its system call to return.
1658 exitlwps(int coredump
)
1660 proc_t
*p
= curproc
;
1663 if (curthread
->t_door
)
1667 if (curthread
->t_schedctl
!= NULL
)
1668 schedctl_lwp_cleanup(curthread
);
1671 * Ensure that before starting to wait for other lwps to exit,
1672 * cleanup all upimutexes held by curthread. Otherwise, some other
1673 * lwp could be waiting (uninterruptibly) for a upimutex held by
1674 * curthread, and the call to pokelwps() below would deadlock.
1675 * Even if a blocked upimutex_lock is made interruptible,
1676 * curthread's upimutexes need to be unlocked: do it here.
1678 if (curthread
->t_upimutex
!= NULL
)
1682 * Grab p_lock in order to check and set SEXITLWPS to declare a winner.
1683 * We must also block any further /proc access from this point forward.
1685 mutex_enter(&p
->p_lock
);
1688 if (p
->p_flag
& SEXITLWPS
) {
1689 mutex_exit(&p
->p_lock
);
1690 aston(curthread
); /* force a trip through post_syscall */
1691 return (set_errno(EINTR
));
1694 p
->p_flag
|= SEXITLWPS
;
1695 if (coredump
) /* tell other lwps to stop, not exit */
1696 p
->p_flag
|= SCOREDUMP
;
1699 * Give precedence to exitlwps() if a holdlwps() is
1700 * in progress. The lwp doing the holdlwps() operation
1701 * is aborted when it is awakened.
1703 while (p
->p_flag
& (SHOLDFORK
| SHOLDFORK1
| SHOLDWATCH
)) {
1704 cv_broadcast(&p
->p_holdlwps
);
1705 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1708 p
->p_flag
|= SHOLDFORK
;
1712 * Wait for process to become quiescent.
1715 while (p
->p_lwprcnt
> 0) {
1716 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1720 ASSERT(p
->p_lwprcnt
== 1);
1723 * The SCOREDUMP flag puts the process into a quiescent
1724 * state. The process's lwps remain attached to this
1725 * process until exitlwps() is called again without the
1726 * 'coredump' flag set, then the lwps are terminated
1727 * and the process can exit.
1730 p
->p_flag
&= ~(SCOREDUMP
| SHOLDFORK
| SEXITLWPS
);
1735 * Determine if there are any lwps left dangling in
1736 * the stopped state. This happens when exitlwps()
1737 * aborts a holdlwps() operation.
1739 p
->p_flag
&= ~SHOLDFORK
;
1740 if ((heldcnt
= p
->p_lwpcnt
) > 1) {
1742 for (t
= curthread
->t_forw
; --heldcnt
> 0; t
= t
->t_forw
) {
1743 t
->t_proc_flag
&= ~TP_TWAIT
;
1749 * Wait for all other lwps to exit.
1752 while (p
->p_lwpcnt
> 1) {
1753 cv_wait(&p
->p_holdlwps
, &p
->p_lock
);
1757 ASSERT(p
->p_lwpcnt
== 1 && p
->p_lwprcnt
== 1);
1759 p
->p_flag
&= ~SEXITLWPS
;
1760 curthread
->t_proc_flag
&= ~TP_TWAIT
;
1763 if (!coredump
&& p
->p_zombcnt
) { /* cleanup the zombie lwps */
1768 for (ldp
= p
->p_lwpdir
, i
= 0; i
< p
->p_lwpdir_sz
; i
++, ldp
++) {
1769 lep
= ldp
->ld_entry
;
1770 if (lep
!= NULL
&& lep
->le_thread
!= curthread
) {
1771 ASSERT(lep
->le_thread
== NULL
);
1773 lwp_hash_out(p
, lep
->le_lwpid
);
1776 ASSERT(p
->p_zombcnt
== 0);
1780 * If some other LWP in the process wanted us to suspend ourself,
1781 * then we will not do it. The other LWP is now terminated and
1782 * no one will ever continue us again if we suspend ourself.
1784 curthread
->t_proc_flag
&= ~TP_HOLDLWP
;
1785 p
->p_flag
&= ~(SHOLDFORK
| SHOLDFORK1
| SHOLDWATCH
| SLWPWRAP
);
1786 mutex_exit(&p
->p_lock
);
1794 forklwp(klwp_t
*lwp
, proc_t
*cp
, id_t lwpid
)
1798 kthread_t
*t
= lwptot(lwp
);
1800 proc_t
*p
= lwptoproc(lwp
);
1806 ASSERT(p
== curproc
);
1807 ASSERT(t
== curthread
|| (SUSPENDED(t
) && lwp
->lwp_asleep
== 0));
1811 /* copy args out of registers first */
1812 (void) save_syscall_args();
1814 clwp
= lwp_create(cp
->p_lwpcnt
== 0 ? lwp_rtt_initial
: lwp_rtt
,
1815 NULL
, 0, cp
, TS_STOPPED
, t
->t_pri
, &t
->t_hold
, NOCLASS
, lwpid
);
1820 * most of the parent's lwp can be copied to its duplicate,
1821 * except for the fields that are unique to each lwp, like
1822 * lwp_thread, lwp_procp, lwp_regs, and lwp_ap.
1824 ct
= clwp
->lwp_thread
;
1825 tregs
= clwp
->lwp_regs
;
1826 tfpu
= clwp
->lwp_fpu
;
1827 brand_data
= clwp
->lwp_brand
;
1830 * Copy parent lwp to child lwp. Hold child's p_lock to prevent
1831 * mstate_aggr_state() from reading stale mstate entries copied
1834 mutex_enter(&cp
->p_lock
);
1837 /* clear microstate and resource usage data in new lwp */
1838 init_mstate(ct
, LMS_STOPPED
);
1839 bzero(&clwp
->lwp_ru
, sizeof (clwp
->lwp_ru
));
1840 mutex_exit(&cp
->p_lock
);
1842 /* fix up child's lwp */
1844 clwp
->lwp_pcb
.pcb_flags
= 0;
1845 clwp
->lwp_cursig
= 0;
1846 clwp
->lwp_extsig
= 0;
1847 clwp
->lwp_curinfo
= NULL
;
1848 clwp
->lwp_thread
= ct
;
1849 ct
->t_sysnum
= t
->t_sysnum
;
1850 clwp
->lwp_regs
= tregs
;
1851 clwp
->lwp_fpu
= tfpu
;
1852 clwp
->lwp_brand
= brand_data
;
1853 clwp
->lwp_ap
= clwp
->lwp_arg
;
1854 clwp
->lwp_procp
= cp
;
1855 bzero(clwp
->lwp_timer
, sizeof (clwp
->lwp_timer
));
1856 clwp
->lwp_lastfault
= 0;
1857 clwp
->lwp_lastfaddr
= 0;
1859 /* copy parent's struct regs to child. */
1860 lwp_forkregs(lwp
, clwp
);
1863 * Fork thread context ops, if any.
1868 /* fix door state in the child */
1872 /* copy current contract templates, clear latest contracts */
1873 lwp_ctmpl_copy(clwp
, lwp
);
1875 mutex_enter(&cp
->p_lock
);
1876 /* lwp_create() set the TP_HOLDLWP flag */
1877 if (!(t
->t_proc_flag
& TP_HOLDLWP
))
1878 ct
->t_proc_flag
&= ~TP_HOLDLWP
;
1879 if (cp
->p_flag
& SMSACCT
)
1880 ct
->t_proc_flag
|= TP_MSACCT
;
1881 mutex_exit(&cp
->p_lock
);
1883 /* Allow brand to propagate brand-specific state */
1884 if (PROC_IS_BRANDED(p
))
1885 BROP(p
)->b_forklwp(lwp
, clwp
);
1890 val
= CL_ALLOC(&bufp
, cid
, KM_SLEEP
);
1893 mutex_enter(&p
->p_lock
);
1894 if (cid
!= t
->t_cid
) {
1896 * Someone just changed this thread's scheduling class,
1897 * so try pre-allocating the buffer again. Hopefully we
1898 * don't hit this often.
1900 mutex_exit(&p
->p_lock
);
1905 ct
->t_unpark
= t
->t_unpark
;
1906 ct
->t_clfuncs
= t
->t_clfuncs
;
1907 CL_FORK(t
, ct
, bufp
);
1908 ct
->t_cid
= t
->t_cid
; /* after data allocated so prgetpsinfo works */
1909 mutex_exit(&p
->p_lock
);
1915 * Add a new lwp entry to the lwp directory and to the lwpid hash table.
1918 lwp_hash_in(proc_t
*p
, lwpent_t
*lep
, tidhash_t
*tidhash
, uint_t tidhash_sz
,
1921 tidhash_t
*thp
= &tidhash
[TIDHASH(lep
->le_lwpid
, tidhash_sz
)];
1927 * Allocate a directory element from the free list.
1928 * Code elsewhere guarantees a free slot.
1931 p
->p_lwpfree
= ldp
->ld_next
;
1932 ASSERT(ldp
->ld_entry
== NULL
);
1933 ldp
->ld_entry
= lep
;
1936 mutex_enter(&thp
->th_lock
);
1939 * Insert it into the lwpid hash table.
1941 ldpp
= &thp
->th_list
;
1942 ldp
->ld_next
= *ldpp
;
1946 * Set the active thread's directory slot entry.
1948 if ((t
= lep
->le_thread
) != NULL
) {
1949 ASSERT(lep
->le_lwpid
== t
->t_tid
);
1950 t
->t_dslot
= (int)(ldp
- p
->p_lwpdir
);
1954 mutex_exit(&thp
->th_lock
);
1958 * Remove an lwp from the lwpid hash table and free its directory entry.
1959 * This is done when a detached lwp exits in lwp_exit() or
1960 * when a non-detached lwp is waited for in lwp_wait() or
1961 * when a zombie lwp is detached in lwp_detach().
1964 lwp_hash_out(proc_t
*p
, id_t lwpid
)
1966 tidhash_t
*thp
= &p
->p_tidhash
[TIDHASH(lwpid
, p
->p_tidhash_sz
)];
1971 mutex_enter(&thp
->th_lock
);
1972 for (ldpp
= &thp
->th_list
;
1973 (ldp
= *ldpp
) != NULL
; ldpp
= &ldp
->ld_next
) {
1974 lep
= ldp
->ld_entry
;
1975 if (lep
->le_lwpid
== lwpid
) {
1976 prlwpfree(p
, lep
); /* /proc deals with le_trace */
1977 *ldpp
= ldp
->ld_next
;
1978 ldp
->ld_entry
= NULL
;
1979 ldp
->ld_next
= p
->p_lwpfree
;
1981 kmem_free(lep
, sizeof (*lep
));
1985 mutex_exit(&thp
->th_lock
);
1989 * Lookup an lwp in the lwpid hash table by lwpid.
1992 lwp_hash_lookup(proc_t
*p
, id_t lwpid
)
1998 * The process may be exiting, after p_tidhash has been set to NULL in
1999 * proc_exit() but before prfee() has been called. Return failure in
2002 if (p
->p_tidhash
== NULL
)
2005 thp
= &p
->p_tidhash
[TIDHASH(lwpid
, p
->p_tidhash_sz
)];
2006 for (ldp
= thp
->th_list
; ldp
!= NULL
; ldp
= ldp
->ld_next
) {
2007 if (ldp
->ld_entry
->le_lwpid
== lwpid
)
2015 * Same as lwp_hash_lookup(), but acquire and return
2016 * the tid hash table entry lock on success.
2019 lwp_hash_lookup_and_lock(proc_t
*p
, id_t lwpid
, kmutex_t
**mpp
)
2027 tidhash_sz
= p
->p_tidhash_sz
;
2029 if ((tidhash
= p
->p_tidhash
) == NULL
)
2032 thp
= &tidhash
[TIDHASH(lwpid
, tidhash_sz
)];
2033 mutex_enter(&thp
->th_lock
);
2036 * Since we are not holding p->p_lock, the tid hash table
2037 * may have changed. If so, start over. If not, then
2038 * it cannot change until after we drop &thp->th_lock;
2040 if (tidhash
!= p
->p_tidhash
|| tidhash_sz
!= p
->p_tidhash_sz
) {
2041 mutex_exit(&thp
->th_lock
);
2045 for (ldp
= thp
->th_list
; ldp
!= NULL
; ldp
= ldp
->ld_next
) {
2046 if (ldp
->ld_entry
->le_lwpid
== lwpid
) {
2047 *mpp
= &thp
->th_lock
;
2052 mutex_exit(&thp
->th_lock
);
2057 * Update the indicated LWP usage statistic for the current LWP.
2060 lwp_stat_update(lwp_stat_id_t lwp_stat_id
, long inc
)
2062 klwp_t
*lwp
= ttolwp(curthread
);
2067 switch (lwp_stat_id
) {
2068 case LWP_STAT_INBLK
:
2069 lwp
->lwp_ru
.inblock
+= inc
;
2071 case LWP_STAT_OUBLK
:
2072 lwp
->lwp_ru
.oublock
+= inc
;
2074 case LWP_STAT_MSGRCV
:
2075 lwp
->lwp_ru
.msgrcv
+= inc
;
2077 case LWP_STAT_MSGSND
:
2078 lwp
->lwp_ru
.msgsnd
+= inc
;
2081 panic("lwp_stat_update: invalid lwp_stat_id 0x%x", lwp_stat_id
);