xref: /titanic_44/usr/src/uts/common/disp/disp.c (revision 02e56f3f1bfc8d9977bafb8cb5202f576dcded27)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* from SVr4.0 1.30 */
32 
33 #include <sys/types.h>
34 #include <sys/param.h>
35 #include <sys/sysmacros.h>
36 #include <sys/signal.h>
37 #include <sys/user.h>
38 #include <sys/systm.h>
39 #include <sys/sysinfo.h>
40 #include <sys/var.h>
41 #include <sys/errno.h>
42 #include <sys/cmn_err.h>
43 #include <sys/debug.h>
44 #include <sys/inline.h>
45 #include <sys/disp.h>
46 #include <sys/class.h>
47 #include <sys/bitmap.h>
48 #include <sys/kmem.h>
49 #include <sys/cpuvar.h>
50 #include <sys/vtrace.h>
51 #include <sys/tnf.h>
52 #include <sys/cpupart.h>
53 #include <sys/lgrp.h>
54 #include <sys/chip.h>
55 #include <sys/schedctl.h>
56 #include <sys/atomic.h>
57 #include <sys/dtrace.h>
58 #include <sys/sdt.h>
59 
60 #include <vm/as.h>
61 
62 #define	BOUND_CPU	0x1
63 #define	BOUND_PARTITION	0x2
64 #define	BOUND_INTR	0x4
65 
66 /* Dispatch queue allocation structure and functions */
67 struct disp_queue_info {
68 	disp_t	*dp;
69 	dispq_t *olddispq;
70 	dispq_t *newdispq;
71 	ulong_t	*olddqactmap;
72 	ulong_t	*newdqactmap;
73 	int	oldnglobpris;
74 };
75 static void	disp_dq_alloc(struct disp_queue_info *dptr, int numpris,
76     disp_t *dp);
77 static void	disp_dq_assign(struct disp_queue_info *dptr, int numpris);
78 static void	disp_dq_free(struct disp_queue_info *dptr);
79 
80 /* platform-specific routine to call when processor is idle */
81 static void	generic_idle_cpu();
82 void		(*idle_cpu)() = generic_idle_cpu;
83 
84 /* routines invoked when a CPU enters/exits the idle loop */
85 static void	idle_enter();
86 static void	idle_exit();
87 
88 /* platform-specific routine to call when thread is enqueued */
89 static void	generic_enq_thread(cpu_t *, int);
90 void		(*disp_enq_thread)(cpu_t *, int) = generic_enq_thread;
91 
92 pri_t	kpreemptpri;	/* priority where kernel preemption applies */
93 pri_t	upreemptpri = 0; /* priority where normal preemption applies */
94 pri_t	intr_pri;	/* interrupt thread priority base level */
95 
96 #define	KPQPRI	-1 /* priority where cpu affinity is dropped for kp queue */
97 pri_t	kpqpri = KPQPRI; /* can be set in /etc/system */
98 disp_t	cpu0_disp;	/* boot CPU's dispatch queue */
99 disp_lock_t	swapped_lock;	/* lock swapped threads and swap queue */
100 int	nswapped;	/* total number of swapped threads */
101 void	disp_swapped_enq(kthread_t *tp);
102 static void	disp_swapped_setrun(kthread_t *tp);
103 static void	cpu_resched(cpu_t *cp, pri_t tpri);
104 
105 /*
106  * If this is set, only interrupt threads will cause kernel preemptions.
107  * This is done by changing the value of kpreemptpri.  kpreemptpri
108  * will either be the max sysclass pri + 1 or the min interrupt pri.
109  */
110 int	only_intr_kpreempt;
111 
112 extern void set_idle_cpu(int cpun);
113 extern void unset_idle_cpu(int cpun);
114 static void setkpdq(kthread_t *tp, int borf);
115 #define	SETKP_BACK	0
116 #define	SETKP_FRONT	1
117 /*
118  * Parameter that determines how recently a thread must have run
119  * on the CPU to be considered loosely-bound to that CPU to reduce
120  * cold cache effects.  The interval is in hertz.
121  *
122  * The platform may define a per physical processor adjustment of
123  * this parameter. For efficiency, the effective rechoose interval
124  * (rechoose_interval + per chip adjustment) is maintained in the
125  * cpu structures. See cpu_choose()
126  */
127 int	rechoose_interval = RECHOOSE_INTERVAL;
128 
129 static cpu_t	*cpu_choose(kthread_t *, pri_t);
130 
131 id_t	defaultcid;	/* system "default" class; see dispadmin(1M) */
132 
133 disp_lock_t	transition_lock;	/* lock on transitioning threads */
134 disp_lock_t	stop_lock;		/* lock on stopped threads */
135 
136 static void		cpu_dispqalloc(int numpris);
137 
138 static kthread_t	*disp_getwork(cpu_t *to);
139 static kthread_t	*disp_getbest(disp_t *from);
140 static kthread_t	*disp_ratify(kthread_t *tp, disp_t *kpq);
141 
142 void	swtch_to(kthread_t *);
143 
144 /*
145  * dispatcher and scheduler initialization
146  */
147 
148 /*
149  * disp_setup - Common code to calculate and allocate dispatcher
150  *		variables and structures based on the maximum priority.
151  */
152 static void
153 disp_setup(pri_t maxglobpri, pri_t oldnglobpris)
154 {
155 	pri_t	newnglobpris;
156 
157 	ASSERT(MUTEX_HELD(&cpu_lock));
158 
159 	newnglobpris = maxglobpri + 1 + LOCK_LEVEL;
160 
161 	if (newnglobpris > oldnglobpris) {
162 		/*
163 		 * Allocate new kp queues for each CPU partition.
164 		 */
165 		cpupart_kpqalloc(newnglobpris);
166 
167 		/*
168 		 * Allocate new dispatch queues for each CPU.
169 		 */
170 		cpu_dispqalloc(newnglobpris);
171 
172 		/*
173 		 * compute new interrupt thread base priority
174 		 */
175 		intr_pri = maxglobpri;
176 		if (only_intr_kpreempt) {
177 			kpreemptpri = intr_pri + 1;
178 			if (kpqpri == KPQPRI)
179 				kpqpri = kpreemptpri;
180 		}
181 		v.v_nglobpris = newnglobpris;
182 	}
183 }
184 
185 /*
186  * dispinit - Called to initialize all loaded classes and the
187  *	      dispatcher framework.
188  */
189 void
190 dispinit(void)
191 {
192 	id_t	cid;
193 	pri_t	maxglobpri;
194 	pri_t	cl_maxglobpri;
195 
196 	maxglobpri = -1;
197 
198 	/*
199 	 * Initialize transition lock, which will always be set.
200 	 */
201 	DISP_LOCK_INIT(&transition_lock);
202 	disp_lock_enter_high(&transition_lock);
203 	DISP_LOCK_INIT(&stop_lock);
204 
205 	mutex_enter(&cpu_lock);
206 	CPU->cpu_disp->disp_maxrunpri = -1;
207 	CPU->cpu_disp->disp_max_unbound_pri = -1;
208 	/*
209 	 * Initialize the default CPU partition.
210 	 */
211 	cpupart_initialize_default();
212 	/*
213 	 * Call the class specific initialization functions for
214 	 * all pre-installed schedulers.
215 	 *
216 	 * We pass the size of a class specific parameter
217 	 * buffer to each of the initialization functions
218 	 * to try to catch problems with backward compatibility
219 	 * of class modules.
220 	 *
221 	 * For example a new class module running on an old system
222 	 * which didn't provide sufficiently large parameter buffers
223 	 * would be bad news. Class initialization modules can check for
224 	 * this and take action if they detect a problem.
225 	 */
226 
227 	for (cid = 0; cid < nclass; cid++) {
228 		sclass_t	*sc;
229 
230 		sc = &sclass[cid];
231 		if (SCHED_INSTALLED(sc)) {
232 			cl_maxglobpri = sc->cl_init(cid, PC_CLPARMSZ,
233 			    &sc->cl_funcs);
234 			if (cl_maxglobpri > maxglobpri)
235 				maxglobpri = cl_maxglobpri;
236 		}
237 	}
238 	kpreemptpri = (pri_t)v.v_maxsyspri + 1;
239 	if (kpqpri == KPQPRI)
240 		kpqpri = kpreemptpri;
241 
242 	ASSERT(maxglobpri >= 0);
243 	disp_setup(maxglobpri, 0);
244 
245 	mutex_exit(&cpu_lock);
246 
247 	/*
248 	 * Get the default class ID; this may be later modified via
249 	 * dispadmin(1M).  This will load the class (normally TS) and that will
250 	 * call disp_add(), which is why we had to drop cpu_lock first.
251 	 */
252 	if (getcid(defaultclass, &defaultcid) != 0) {
253 		cmn_err(CE_PANIC, "Couldn't load default scheduling class '%s'",
254 		    defaultclass);
255 	}
256 }
257 
258 /*
259  * disp_add - Called with class pointer to initialize the dispatcher
260  *	      for a newly loaded class.
261  */
262 void
263 disp_add(sclass_t *clp)
264 {
265 	pri_t	maxglobpri;
266 	pri_t	cl_maxglobpri;
267 
268 	mutex_enter(&cpu_lock);
269 	/*
270 	 * Initialize the scheduler class.
271 	 */
272 	maxglobpri = (pri_t)(v.v_nglobpris - LOCK_LEVEL - 1);
273 	cl_maxglobpri = clp->cl_init(clp - sclass, PC_CLPARMSZ, &clp->cl_funcs);
274 	if (cl_maxglobpri > maxglobpri)
275 		maxglobpri = cl_maxglobpri;
276 
277 	/*
278 	 * Save old queue information.  Since we're initializing a
279 	 * new scheduling class which has just been loaded, then
280 	 * the size of the dispq may have changed.  We need to handle
281 	 * that here.
282 	 */
283 	disp_setup(maxglobpri, v.v_nglobpris);
284 
285 	mutex_exit(&cpu_lock);
286 }
287 
288 
289 /*
290  * For each CPU, allocate new dispatch queues
291  * with the stated number of priorities.
292  */
293 static void
294 cpu_dispqalloc(int numpris)
295 {
296 	cpu_t	*cpup;
297 	struct disp_queue_info	*disp_mem;
298 	int i, num;
299 
300 	ASSERT(MUTEX_HELD(&cpu_lock));
301 
302 	disp_mem = kmem_zalloc(NCPU *
303 	    sizeof (struct disp_queue_info), KM_SLEEP);
304 
305 	/*
306 	 * This routine must allocate all of the memory before stopping
307 	 * the cpus because it must not sleep in kmem_alloc while the
308 	 * CPUs are stopped.  Locks they hold will not be freed until they
309 	 * are restarted.
310 	 */
311 	i = 0;
312 	cpup = cpu_list;
313 	do {
314 		disp_dq_alloc(&disp_mem[i], numpris, cpup->cpu_disp);
315 		i++;
316 		cpup = cpup->cpu_next;
317 	} while (cpup != cpu_list);
318 	num = i;
319 
320 	pause_cpus(NULL);
321 	for (i = 0; i < num; i++)
322 		disp_dq_assign(&disp_mem[i], numpris);
323 	start_cpus();
324 
325 	/*
326 	 * I must free all of the memory after starting the cpus because
327 	 * I can not risk sleeping in kmem_free while the cpus are stopped.
328 	 */
329 	for (i = 0; i < num; i++)
330 		disp_dq_free(&disp_mem[i]);
331 
332 	kmem_free(disp_mem, NCPU * sizeof (struct disp_queue_info));
333 }
334 
335 static void
336 disp_dq_alloc(struct disp_queue_info *dptr, int numpris, disp_t	*dp)
337 {
338 	dptr->newdispq = kmem_zalloc(numpris * sizeof (dispq_t), KM_SLEEP);
339 	dptr->newdqactmap = kmem_zalloc(((numpris / BT_NBIPUL) + 1) *
340 	    sizeof (long), KM_SLEEP);
341 	dptr->dp = dp;
342 }
343 
344 static void
345 disp_dq_assign(struct disp_queue_info *dptr, int numpris)
346 {
347 	disp_t	*dp;
348 
349 	dp = dptr->dp;
350 	dptr->olddispq = dp->disp_q;
351 	dptr->olddqactmap = dp->disp_qactmap;
352 	dptr->oldnglobpris = dp->disp_npri;
353 
354 	ASSERT(dptr->oldnglobpris < numpris);
355 
356 	if (dptr->olddispq != NULL) {
357 		/*
358 		 * Use kcopy because bcopy is platform-specific
359 		 * and could block while we might have paused the cpus.
360 		 */
361 		(void) kcopy(dptr->olddispq, dptr->newdispq,
362 		    dptr->oldnglobpris * sizeof (dispq_t));
363 		(void) kcopy(dptr->olddqactmap, dptr->newdqactmap,
364 		    ((dptr->oldnglobpris / BT_NBIPUL) + 1) *
365 		    sizeof (long));
366 	}
367 	dp->disp_q = dptr->newdispq;
368 	dp->disp_qactmap = dptr->newdqactmap;
369 	dp->disp_q_limit = &dptr->newdispq[numpris];
370 	dp->disp_npri = numpris;
371 }
372 
373 static void
374 disp_dq_free(struct disp_queue_info *dptr)
375 {
376 	if (dptr->olddispq != NULL)
377 		kmem_free(dptr->olddispq,
378 		    dptr->oldnglobpris * sizeof (dispq_t));
379 	if (dptr->olddqactmap != NULL)
380 		kmem_free(dptr->olddqactmap,
381 		    ((dptr->oldnglobpris / BT_NBIPUL) + 1) * sizeof (long));
382 }
383 
384 /*
385  * For a newly created CPU, initialize the dispatch queue.
386  * This is called before the CPU is known through cpu[] or on any lists.
387  */
388 void
389 disp_cpu_init(cpu_t *cp)
390 {
391 	disp_t	*dp;
392 	dispq_t	*newdispq;
393 	ulong_t	*newdqactmap;
394 
395 	ASSERT(MUTEX_HELD(&cpu_lock));	/* protect dispatcher queue sizes */
396 
397 	if (cp == cpu0_disp.disp_cpu)
398 		dp = &cpu0_disp;
399 	else
400 		dp = kmem_alloc(sizeof (disp_t), KM_SLEEP);
401 	bzero(dp, sizeof (disp_t));
402 	cp->cpu_disp = dp;
403 	dp->disp_cpu = cp;
404 	dp->disp_maxrunpri = -1;
405 	dp->disp_max_unbound_pri = -1;
406 	DISP_LOCK_INIT(&cp->cpu_thread_lock);
407 	/*
408 	 * Allocate memory for the dispatcher queue headers
409 	 * and the active queue bitmap.
410 	 */
411 	newdispq = kmem_zalloc(v.v_nglobpris * sizeof (dispq_t), KM_SLEEP);
412 	newdqactmap = kmem_zalloc(((v.v_nglobpris / BT_NBIPUL) + 1) *
413 	    sizeof (long), KM_SLEEP);
414 	dp->disp_q = newdispq;
415 	dp->disp_qactmap = newdqactmap;
416 	dp->disp_q_limit = &newdispq[v.v_nglobpris];
417 	dp->disp_npri = v.v_nglobpris;
418 }
419 
420 void
421 disp_cpu_fini(cpu_t *cp)
422 {
423 	ASSERT(MUTEX_HELD(&cpu_lock));
424 
425 	disp_kp_free(cp->cpu_disp);
426 	if (cp->cpu_disp != &cpu0_disp)
427 		kmem_free(cp->cpu_disp, sizeof (disp_t));
428 }
429 
430 /*
431  * Allocate new, larger kpreempt dispatch queue to replace the old one.
432  */
433 void
434 disp_kp_alloc(disp_t *dq, pri_t npri)
435 {
436 	struct disp_queue_info	mem_info;
437 
438 	if (npri > dq->disp_npri) {
439 		/*
440 		 * Allocate memory for the new array.
441 		 */
442 		disp_dq_alloc(&mem_info, npri, dq);
443 
444 		/*
445 		 * We need to copy the old structures to the new
446 		 * and free the old.
447 		 */
448 		disp_dq_assign(&mem_info, npri);
449 		disp_dq_free(&mem_info);
450 	}
451 }
452 
453 /*
454  * Free dispatch queue.
455  * Used for the kpreempt queues for a removed CPU partition and
456  * for the per-CPU queues of deleted CPUs.
457  */
458 void
459 disp_kp_free(disp_t *dq)
460 {
461 	struct disp_queue_info	mem_info;
462 
463 	mem_info.olddispq = dq->disp_q;
464 	mem_info.olddqactmap = dq->disp_qactmap;
465 	mem_info.oldnglobpris = dq->disp_npri;
466 	disp_dq_free(&mem_info);
467 }
468 
469 /*
470  * End dispatcher and scheduler initialization.
471  */
472 
473 /*
474  * See if there's anything to do other than remain idle.
475  * Return non-zero if there is.
476  *
477  * This function must be called with high spl, or with
478  * kernel preemption disabled to prevent the partition's
479  * active cpu list from changing while being traversed.
480  *
481  */
482 int
483 disp_anywork(void)
484 {
485 	cpu_t   *cp = CPU;
486 	cpu_t   *ocp;
487 
488 	if (cp->cpu_disp->disp_nrunnable != 0)
489 		return (1);
490 
491 	if (!(cp->cpu_flags & CPU_OFFLINE)) {
492 		if (CP_MAXRUNPRI(cp->cpu_part) >= 0)
493 			return (1);
494 
495 		/*
496 		 * Work can be taken from another CPU if:
497 		 *	- There is unbound work on the run queue
498 		 *	- That work isn't a thread undergoing a
499 		 *	- context switch on an otherwise empty queue.
500 		 *	- The CPU isn't running the idle loop.
501 		 */
502 		for (ocp = cp->cpu_next_part; ocp != cp;
503 		    ocp = ocp->cpu_next_part) {
504 			ASSERT(CPU_ACTIVE(ocp));
505 
506 			if (ocp->cpu_disp->disp_max_unbound_pri != -1 &&
507 			    !((ocp->cpu_disp_flags & CPU_DISP_DONTSTEAL) &&
508 			    ocp->cpu_disp->disp_nrunnable == 1) &&
509 			    ocp->cpu_dispatch_pri != -1)
510 				return (1);
511 		}
512 	}
513 	return (0);
514 }
515 
516 /*
517  * Called when CPU enters the idle loop
518  */
519 static void
520 idle_enter()
521 {
522 	cpu_t		*cp = CPU;
523 
524 	new_cpu_mstate(cp, CMS_IDLE);
525 	CPU_STATS_ADDQ(cp, sys, idlethread, 1);
526 	set_idle_cpu(cp->cpu_id);	/* arch-dependent hook */
527 }
528 
529 /*
530  * Called when CPU exits the idle loop
531  */
532 static void
533 idle_exit()
534 {
535 	cpu_t		*cp = CPU;
536 
537 	new_cpu_mstate(cp, CMS_SYSTEM);
538 	unset_idle_cpu(cp->cpu_id);	/* arch-dependent hook */
539 }
540 
541 /*
542  * Idle loop.
543  */
544 void
545 idle()
546 {
547 	struct cpu	*cp = CPU;		/* pointer to this CPU */
548 	kthread_t	*t;			/* taken thread */
549 
550 	idle_enter();
551 
552 	/*
553 	 * Uniprocessor version of idle loop.
554 	 * Do this until notified that we're on an actual multiprocessor.
555 	 */
556 	while (ncpus == 1) {
557 		if (cp->cpu_disp->disp_nrunnable == 0) {
558 			(*idle_cpu)();
559 			continue;
560 		}
561 		idle_exit();
562 		swtch();
563 
564 		idle_enter(); /* returned from swtch */
565 	}
566 
567 	/*
568 	 * Multiprocessor idle loop.
569 	 */
570 	for (;;) {
571 		/*
572 		 * If CPU is completely quiesced by p_online(2), just wait
573 		 * here with minimal bus traffic until put online.
574 		 */
575 		while (cp->cpu_flags & CPU_QUIESCED)
576 			(*idle_cpu)();
577 
578 		if (cp->cpu_disp->disp_nrunnable != 0) {
579 			idle_exit();
580 			swtch();
581 		} else {
582 			if (cp->cpu_flags & CPU_OFFLINE)
583 				continue;
584 			if ((t = disp_getwork(cp)) == NULL) {
585 				if (cp->cpu_chosen_level != -1) {
586 					disp_t *dp = cp->cpu_disp;
587 					disp_t *kpq;
588 
589 					disp_lock_enter(&dp->disp_lock);
590 					/*
591 					 * Set kpq under lock to prevent
592 					 * migration between partitions.
593 					 */
594 					kpq = &cp->cpu_part->cp_kp_queue;
595 					if (kpq->disp_maxrunpri == -1)
596 						cp->cpu_chosen_level = -1;
597 					disp_lock_exit(&dp->disp_lock);
598 				}
599 				(*idle_cpu)();
600 				continue;
601 			}
602 			idle_exit();
603 			restore_mstate(t);
604 			swtch_to(t);
605 		}
606 		idle_enter(); /* returned from swtch/swtch_to */
607 	}
608 }
609 
610 
611 /*
612  * Preempt the currently running thread in favor of the highest
613  * priority thread.  The class of the current thread controls
614  * where it goes on the dispatcher queues. If panicking, turn
615  * preemption off.
616  */
617 void
618 preempt()
619 {
620 	kthread_t 	*t = curthread;
621 	klwp_t 		*lwp = ttolwp(curthread);
622 
623 	if (panicstr)
624 		return;
625 
626 	TRACE_0(TR_FAC_DISP, TR_PREEMPT_START, "preempt_start");
627 
628 	thread_lock(t);
629 
630 	if (t->t_state != TS_ONPROC || t->t_disp_queue != CPU->cpu_disp) {
631 		/*
632 		 * this thread has already been chosen to be run on
633 		 * another CPU. Clear kprunrun on this CPU since we're
634 		 * already headed for swtch().
635 		 */
636 		CPU->cpu_kprunrun = 0;
637 		thread_unlock_nopreempt(t);
638 		TRACE_0(TR_FAC_DISP, TR_PREEMPT_END, "preempt_end");
639 	} else {
640 		if (lwp != NULL)
641 			lwp->lwp_ru.nivcsw++;
642 		CPU_STATS_ADDQ(CPU, sys, inv_swtch, 1);
643 		THREAD_TRANSITION(t);
644 		CL_PREEMPT(t);
645 		DTRACE_SCHED(preempt);
646 		thread_unlock_nopreempt(t);
647 
648 		TRACE_0(TR_FAC_DISP, TR_PREEMPT_END, "preempt_end");
649 
650 		swtch();		/* clears CPU->cpu_runrun via disp() */
651 	}
652 }
653 
654 extern kthread_t *thread_unpin();
655 
656 /*
657  * disp() - find the highest priority thread for this processor to run, and
658  * set it in TS_ONPROC state so that resume() can be called to run it.
659  */
660 static kthread_t *
661 disp()
662 {
663 	cpu_t		*cpup;
664 	disp_t		*dp;
665 	kthread_t	*tp;
666 	dispq_t		*dq;
667 	int		maxrunword;
668 	pri_t		pri;
669 	disp_t		*kpq;
670 
671 	TRACE_0(TR_FAC_DISP, TR_DISP_START, "disp_start");
672 
673 	cpup = CPU;
674 	/*
675 	 * Find the highest priority loaded, runnable thread.
676 	 */
677 	dp = cpup->cpu_disp;
678 
679 reschedule:
680 	/*
681 	 * If there is more important work on the global queue with a better
682 	 * priority than the maximum on this CPU, take it now.
683 	 */
684 	kpq = &cpup->cpu_part->cp_kp_queue;
685 	while ((pri = kpq->disp_maxrunpri) >= 0 &&
686 	    pri >= dp->disp_maxrunpri &&
687 	    (cpup->cpu_flags & CPU_OFFLINE) == 0 &&
688 	    (tp = disp_getbest(kpq)) != NULL) {
689 		if (disp_ratify(tp, kpq) != NULL) {
690 			TRACE_1(TR_FAC_DISP, TR_DISP_END,
691 			    "disp_end:tid %p", tp);
692 			restore_mstate(tp);
693 			return (tp);
694 		}
695 	}
696 
697 	disp_lock_enter(&dp->disp_lock);
698 	pri = dp->disp_maxrunpri;
699 
700 	/*
701 	 * If there is nothing to run, look at what's runnable on other queues.
702 	 * Choose the idle thread if the CPU is quiesced.
703 	 * Note that CPUs that have the CPU_OFFLINE flag set can still run
704 	 * interrupt threads, which will be the only threads on the CPU's own
705 	 * queue, but cannot run threads from other queues.
706 	 */
707 	if (pri == -1) {
708 		if (!(cpup->cpu_flags & CPU_OFFLINE)) {
709 			disp_lock_exit(&dp->disp_lock);
710 			if ((tp = disp_getwork(cpup)) == NULL) {
711 				tp = cpup->cpu_idle_thread;
712 				(void) splhigh();
713 				THREAD_ONPROC(tp, cpup);
714 				cpup->cpu_dispthread = tp;
715 				cpup->cpu_dispatch_pri = -1;
716 				cpup->cpu_runrun = cpup->cpu_kprunrun = 0;
717 				cpup->cpu_chosen_level = -1;
718 			}
719 		} else {
720 			disp_lock_exit_high(&dp->disp_lock);
721 			tp = cpup->cpu_idle_thread;
722 			THREAD_ONPROC(tp, cpup);
723 			cpup->cpu_dispthread = tp;
724 			cpup->cpu_dispatch_pri = -1;
725 			cpup->cpu_runrun = cpup->cpu_kprunrun = 0;
726 			cpup->cpu_chosen_level = -1;
727 		}
728 		TRACE_1(TR_FAC_DISP, TR_DISP_END,
729 			"disp_end:tid %p", tp);
730 		restore_mstate(tp);
731 		return (tp);
732 	}
733 
734 	dq = &dp->disp_q[pri];
735 	tp = dq->dq_first;
736 
737 	ASSERT(tp != NULL);
738 	ASSERT(tp->t_schedflag & TS_LOAD);	/* thread must be swapped in */
739 
740 	DTRACE_SCHED2(dequeue, kthread_t *, tp, disp_t *, dp);
741 
742 	/*
743 	 * Found it so remove it from queue.
744 	 */
745 	dp->disp_nrunnable--;
746 	dq->dq_sruncnt--;
747 	if ((dq->dq_first = tp->t_link) == NULL) {
748 		ulong_t	*dqactmap = dp->disp_qactmap;
749 
750 		ASSERT(dq->dq_sruncnt == 0);
751 		dq->dq_last = NULL;
752 
753 		/*
754 		 * The queue is empty, so the corresponding bit needs to be
755 		 * turned off in dqactmap.   If nrunnable != 0 just took the
756 		 * last runnable thread off the
757 		 * highest queue, so recompute disp_maxrunpri.
758 		 */
759 		maxrunword = pri >> BT_ULSHIFT;
760 		dqactmap[maxrunword] &= ~BT_BIW(pri);
761 
762 		if (dp->disp_nrunnable == 0) {
763 			dp->disp_max_unbound_pri = -1;
764 			dp->disp_maxrunpri = -1;
765 		} else {
766 			int ipri;
767 
768 			ipri = bt_gethighbit(dqactmap, maxrunword);
769 			dp->disp_maxrunpri = ipri;
770 			if (ipri < dp->disp_max_unbound_pri)
771 				dp->disp_max_unbound_pri = ipri;
772 		}
773 	} else {
774 		tp->t_link = NULL;
775 	}
776 
777 	/*
778 	 * Set TS_DONT_SWAP flag to prevent another processor from swapping
779 	 * out this thread before we have a chance to run it.
780 	 * While running, it is protected against swapping by t_lock.
781 	 */
782 	tp->t_schedflag |= TS_DONT_SWAP;
783 	cpup->cpu_dispthread = tp;		/* protected by spl only */
784 	cpup->cpu_dispatch_pri = pri;
785 	ASSERT(pri == DISP_PRIO(tp));
786 	thread_onproc(tp, cpup);  		/* set t_state to TS_ONPROC */
787 	disp_lock_exit_high(&dp->disp_lock);	/* drop run queue lock */
788 
789 	ASSERT(tp != NULL);
790 	TRACE_1(TR_FAC_DISP, TR_DISP_END,
791 		"disp_end:tid %p", tp);
792 
793 	if (disp_ratify(tp, kpq) == NULL)
794 		goto reschedule;
795 
796 	restore_mstate(tp);
797 	return (tp);
798 }
799 
800 /*
801  * swtch()
802  *	Find best runnable thread and run it.
803  *	Called with the current thread already switched to a new state,
804  *	on a sleep queue, run queue, stopped, and not zombied.
805  *	May be called at any spl level less than or equal to LOCK_LEVEL.
806  *	Always drops spl to the base level (spl0()).
807  */
808 void
809 swtch()
810 {
811 	kthread_t	*t = curthread;
812 	kthread_t	*next;
813 	cpu_t		*cp;
814 
815 	TRACE_0(TR_FAC_DISP, TR_SWTCH_START, "swtch_start");
816 
817 	if (t->t_flag & T_INTR_THREAD)
818 		cpu_intr_swtch_enter(t);
819 
820 	if (t->t_intr != NULL) {
821 		/*
822 		 * We are an interrupt thread.  Setup and return
823 		 * the interrupted thread to be resumed.
824 		 */
825 		(void) splhigh();	/* block other scheduler action */
826 		cp = CPU;		/* now protected against migration */
827 		ASSERT(CPU_ON_INTR(cp) == 0);	/* not called with PIL > 10 */
828 		CPU_STATS_ADDQ(cp, sys, pswitch, 1);
829 		CPU_STATS_ADDQ(cp, sys, intrblk, 1);
830 		next = thread_unpin();
831 		TRACE_0(TR_FAC_DISP, TR_RESUME_START, "resume_start");
832 		resume_from_intr(next);
833 	} else {
834 #ifdef	DEBUG
835 		if (t->t_state == TS_ONPROC &&
836 		    t->t_disp_queue->disp_cpu == CPU &&
837 		    t->t_preempt == 0) {
838 			thread_lock(t);
839 			ASSERT(t->t_state != TS_ONPROC ||
840 			    t->t_disp_queue->disp_cpu != CPU ||
841 			    t->t_preempt != 0);	/* cannot migrate */
842 			thread_unlock_nopreempt(t);
843 		}
844 #endif	/* DEBUG */
845 		cp = CPU;
846 		next = disp();		/* returns with spl high */
847 		ASSERT(CPU_ON_INTR(cp) == 0);	/* not called with PIL > 10 */
848 
849 		/* OK to steal anything left on run queue */
850 		cp->cpu_disp_flags &= ~CPU_DISP_DONTSTEAL;
851 
852 		if (next != t) {
853 			if (t == cp->cpu_idle_thread) {
854 				CHIP_NRUNNING(cp->cpu_chip, 1);
855 			} else if (next == cp->cpu_idle_thread) {
856 				CHIP_NRUNNING(cp->cpu_chip, -1);
857 			}
858 
859 			CPU_STATS_ADDQ(cp, sys, pswitch, 1);
860 			cp->cpu_last_swtch = t->t_disp_time = lbolt;
861 			TRACE_0(TR_FAC_DISP, TR_RESUME_START, "resume_start");
862 
863 			if (dtrace_vtime_active)
864 				dtrace_vtime_switch(next);
865 
866 			resume(next);
867 			/*
868 			 * The TR_RESUME_END and TR_SWTCH_END trace points
869 			 * appear at the end of resume(), because we may not
870 			 * return here
871 			 */
872 		} else {
873 			if (t->t_flag & T_INTR_THREAD)
874 				cpu_intr_swtch_exit(t);
875 
876 			DTRACE_SCHED(remain__cpu);
877 			TRACE_0(TR_FAC_DISP, TR_SWTCH_END, "swtch_end");
878 			(void) spl0();
879 		}
880 	}
881 }
882 
883 /*
884  * swtch_from_zombie()
885  *	Special case of swtch(), which allows checks for TS_ZOMB to be
886  *	eliminated from normal resume.
887  *	Find best runnable thread and run it.
888  *	Called with the current thread zombied.
889  *	Zombies cannot migrate, so CPU references are safe.
890  */
891 void
892 swtch_from_zombie()
893 {
894 	kthread_t	*next;
895 	cpu_t		*cpu = CPU;
896 
897 	TRACE_0(TR_FAC_DISP, TR_SWTCH_START, "swtch_start");
898 
899 	ASSERT(curthread->t_state == TS_ZOMB);
900 
901 	next = disp();			/* returns with spl high */
902 	ASSERT(CPU_ON_INTR(CPU) == 0);	/* not called with PIL > 10 */
903 	CPU_STATS_ADDQ(CPU, sys, pswitch, 1);
904 	ASSERT(next != curthread);
905 	TRACE_0(TR_FAC_DISP, TR_RESUME_START, "resume_start");
906 
907 	if (next == cpu->cpu_idle_thread)
908 		CHIP_NRUNNING(cpu->cpu_chip, -1);
909 
910 	if (dtrace_vtime_active)
911 		dtrace_vtime_switch(next);
912 
913 	resume_from_zombie(next);
914 	/*
915 	 * The TR_RESUME_END and TR_SWTCH_END trace points
916 	 * appear at the end of resume(), because we certainly will not
917 	 * return here
918 	 */
919 }
920 
921 #if defined(DEBUG) && (defined(DISP_DEBUG) || defined(lint))
922 static int
923 thread_on_queue(kthread_t *tp)
924 {
925 	cpu_t	*cp;
926 	cpu_t	*self;
927 	disp_t	*dp;
928 
929 	self = CPU;
930 	cp = self->cpu_next_onln;
931 	dp = cp->cpu_disp;
932 	for (;;) {
933 		dispq_t		*dq;
934 		dispq_t		*eq;
935 
936 		disp_lock_enter_high(&dp->disp_lock);
937 		for (dq = dp->disp_q, eq = dp->disp_q_limit; dq < eq; ++dq) {
938 			kthread_t	*rp;
939 
940 			ASSERT(dq->dq_last == NULL ||
941 				dq->dq_last->t_link == NULL);
942 			for (rp = dq->dq_first; rp; rp = rp->t_link)
943 				if (tp == rp) {
944 					disp_lock_exit_high(&dp->disp_lock);
945 					return (1);
946 				}
947 		}
948 		disp_lock_exit_high(&dp->disp_lock);
949 		if (cp == NULL)
950 			break;
951 		if (cp == self) {
952 			cp = NULL;
953 			dp = &cp->cpu_part->cp_kp_queue;
954 		} else {
955 			cp = cp->cpu_next_onln;
956 			dp = cp->cpu_disp;
957 		}
958 	}
959 	return (0);
960 }	/* end of thread_on_queue */
961 #else
962 
963 #define	thread_on_queue(tp)	0	/* ASSERT must be !thread_on_queue */
964 
965 #endif  /* DEBUG */
966 
967 /*
968  * like swtch(), but switch to a specified thread taken from another CPU.
969  *	called with spl high..
970  */
971 void
972 swtch_to(kthread_t *next)
973 {
974 	cpu_t			*cp = CPU;
975 
976 	TRACE_0(TR_FAC_DISP, TR_SWTCH_START, "swtch_start");
977 
978 	/*
979 	 * Update context switch statistics.
980 	 */
981 	CPU_STATS_ADDQ(cp, sys, pswitch, 1);
982 
983 	TRACE_0(TR_FAC_DISP, TR_RESUME_START, "resume_start");
984 
985 	if (curthread == cp->cpu_idle_thread)
986 		CHIP_NRUNNING(cp->cpu_chip, 1);
987 
988 	/* OK to steal anything left on run queue */
989 	cp->cpu_disp_flags &= ~CPU_DISP_DONTSTEAL;
990 
991 	/* record last execution time */
992 	cp->cpu_last_swtch = curthread->t_disp_time = lbolt;
993 
994 	if (dtrace_vtime_active)
995 		dtrace_vtime_switch(next);
996 
997 	resume(next);
998 	/*
999 	 * The TR_RESUME_END and TR_SWTCH_END trace points
1000 	 * appear at the end of resume(), because we may not
1001 	 * return here
1002 	 */
1003 }
1004 
1005 
1006 
1007 #define	CPU_IDLING(pri)	((pri) == -1)
1008 
1009 static void
1010 cpu_resched(cpu_t *cp, pri_t tpri)
1011 {
1012 	int	call_poke_cpu = 0;
1013 	pri_t   cpupri = cp->cpu_dispatch_pri;
1014 
1015 	if (!CPU_IDLING(cpupri) && (cpupri < tpri)) {
1016 		TRACE_2(TR_FAC_DISP, TR_CPU_RESCHED,
1017 		    "CPU_RESCHED:Tpri %d Cpupri %d", tpri, cpupri);
1018 		if (tpri >= upreemptpri && cp->cpu_runrun == 0) {
1019 			cp->cpu_runrun = 1;
1020 			aston(cp->cpu_dispthread);
1021 			if (tpri < kpreemptpri && cp != CPU)
1022 				call_poke_cpu = 1;
1023 		}
1024 		if (tpri >= kpreemptpri && cp->cpu_kprunrun == 0) {
1025 			cp->cpu_kprunrun = 1;
1026 			if (cp != CPU)
1027 				call_poke_cpu = 1;
1028 		}
1029 	}
1030 
1031 	/*
1032 	 * Propagate cpu_runrun, and cpu_kprunrun to global visibility.
1033 	 */
1034 	membar_enter();
1035 
1036 	if (call_poke_cpu)
1037 		poke_cpu(cp->cpu_id);
1038 }
1039 
1040 /*
1041  * Routine used by setbackdq() to balance load across the physical
1042  * processors. Returns a CPU of a lesser loaded chip in the lgroup
1043  * if balancing is necessary, or the "hint" CPU if it's not.
1044  *
1045  * - tp is the thread being enqueued
1046  * - cp is a hint CPU (chosen by cpu_choose()).
1047  * - curchip (if not NULL) is the chip on which the current thread
1048  *   is running.
1049  *
1050  * The thread lock for "tp" must be held while calling this routine.
1051  */
1052 static cpu_t *
1053 chip_balance(kthread_t *tp, cpu_t *cp, chip_t *curchip)
1054 {
1055 	int	chp_nrun, ochp_nrun;
1056 	chip_t	*chp, *nchp;
1057 
1058 	chp = cp->cpu_chip;
1059 	chp_nrun = chp->chip_nrunning;
1060 
1061 	if (chp == curchip)
1062 		chp_nrun--;	/* Ignore curthread */
1063 
1064 	/*
1065 	 * If this chip isn't at all idle, then let
1066 	 * run queue balancing do the work.
1067 	 */
1068 	if (chp_nrun == chp->chip_ncpu)
1069 		return (cp);
1070 
1071 	nchp = chp->chip_balance;
1072 	do {
1073 		if (nchp == chp ||
1074 		    !CHIP_IN_CPUPART(nchp, tp->t_cpupart))
1075 			continue;
1076 
1077 		ochp_nrun = nchp->chip_nrunning;
1078 
1079 		/*
1080 		 * If the other chip is running less threads,
1081 		 * or if it's running the same number of threads, but
1082 		 * has more online logical CPUs, then choose to balance.
1083 		 */
1084 		if (chp_nrun > ochp_nrun ||
1085 		    (chp_nrun == ochp_nrun &&
1086 		    nchp->chip_ncpu > chp->chip_ncpu)) {
1087 			cp = nchp->chip_cpus;
1088 			nchp->chip_cpus = cp->cpu_next_chip;
1089 
1090 			/*
1091 			 * Find a CPU on the chip in the correct
1092 			 * partition. We know at least one exists
1093 			 * because of the CHIP_IN_CPUPART() check above.
1094 			 */
1095 			while (cp->cpu_part != tp->t_cpupart)
1096 				cp = cp->cpu_next_chip;
1097 		}
1098 		chp->chip_balance = nchp->chip_next_lgrp;
1099 		break;
1100 	} while ((nchp = nchp->chip_next_lgrp) != chp->chip_balance);
1101 
1102 	ASSERT(CHIP_IN_CPUPART(cp->cpu_chip, tp->t_cpupart));
1103 	return (cp);
1104 }
1105 
1106 /*
1107  * setbackdq() keeps runqs balanced such that the difference in length
1108  * between the chosen runq and the next one is no more than RUNQ_MAX_DIFF.
1109  * For threads with priorities below RUNQ_MATCH_PRI levels, the runq's lengths
1110  * must match.  When per-thread TS_RUNQMATCH flag is set, setbackdq() will
1111  * try to keep runqs perfectly balanced regardless of the thread priority.
1112  */
1113 #define	RUNQ_MATCH_PRI	16	/* pri below which queue lengths must match */
1114 #define	RUNQ_MAX_DIFF	2	/* maximum runq length difference */
1115 #define	RUNQ_LEN(cp, pri)	((cp)->cpu_disp->disp_q[pri].dq_sruncnt)
1116 
1117 /*
1118  * Put the specified thread on the back of the dispatcher
1119  * queue corresponding to its current priority.
1120  *
1121  * Called with the thread in transition, onproc or stopped state
1122  * and locked (transition implies locked) and at high spl.
1123  * Returns with the thread in TS_RUN state and still locked.
1124  */
1125 void
1126 setbackdq(kthread_t *tp)
1127 {
1128 	dispq_t	*dq;
1129 	disp_t		*dp;
1130 	chip_t		*curchip = NULL;
1131 	cpu_t		*cp;
1132 	pri_t		tpri;
1133 	int		bound;
1134 
1135 	ASSERT(THREAD_LOCK_HELD(tp));
1136 	ASSERT((tp->t_schedflag & TS_ALLSTART) == 0);
1137 
1138 	if (tp->t_waitrq == 0) {
1139 		hrtime_t curtime;
1140 
1141 		curtime = gethrtime_unscaled();
1142 		(void) cpu_update_pct(tp, curtime);
1143 		tp->t_waitrq = curtime;
1144 	} else {
1145 		(void) cpu_update_pct(tp, gethrtime_unscaled());
1146 	}
1147 
1148 	ASSERT(!thread_on_queue(tp));	/* make sure tp isn't on a runq */
1149 
1150 	/*
1151 	 * If thread is "swapped" or on the swap queue don't
1152 	 * queue it, but wake sched.
1153 	 */
1154 	if ((tp->t_schedflag & (TS_LOAD | TS_ON_SWAPQ)) != TS_LOAD) {
1155 		disp_swapped_setrun(tp);
1156 		return;
1157 	}
1158 
1159 	tpri = DISP_PRIO(tp);
1160 	if (tp == curthread) {
1161 		curchip = CPU->cpu_chip;
1162 	}
1163 
1164 	if (ncpus == 1)
1165 		cp = tp->t_cpu;
1166 	else if (!tp->t_bound_cpu && !tp->t_weakbound_cpu) {
1167 		if (tpri >= kpqpri) {
1168 			setkpdq(tp, SETKP_BACK);
1169 			return;
1170 		}
1171 		/*
1172 		 * Let cpu_choose suggest a CPU.
1173 		 */
1174 		cp = cpu_choose(tp, tpri);
1175 
1176 		if (tp->t_cpupart == cp->cpu_part) {
1177 			int	qlen;
1178 
1179 			/*
1180 			 * Select another CPU if we need
1181 			 * to do some load balancing across the
1182 			 * physical processors.
1183 			 */
1184 			if (CHIP_SHOULD_BALANCE(cp->cpu_chip))
1185 				cp = chip_balance(tp, cp, curchip);
1186 
1187 			/*
1188 			 * Balance across the run queues
1189 			 */
1190 			qlen = RUNQ_LEN(cp, tpri);
1191 			if (tpri >= RUNQ_MATCH_PRI &&
1192 			    !(tp->t_schedflag & TS_RUNQMATCH))
1193 				qlen -= RUNQ_MAX_DIFF;
1194 			if (qlen > 0) {
1195 				cpu_t	*np;
1196 
1197 				if (tp->t_lpl->lpl_lgrpid == LGRP_ROOTID)
1198 					np = cp->cpu_next_part;
1199 				else {
1200 					if ((np = cp->cpu_next_lpl) == cp)
1201 						np = cp->cpu_next_part;
1202 				}
1203 				if (RUNQ_LEN(np, tpri) < qlen)
1204 					cp = np;
1205 			}
1206 		} else {
1207 			/*
1208 			 * Migrate to a cpu in the new partition.
1209 			 */
1210 			cp = disp_lowpri_cpu(tp->t_cpupart->cp_cpulist,
1211 			    tp->t_lpl, tp->t_pri, NULL);
1212 		}
1213 		bound = 0;
1214 		ASSERT((cp->cpu_flags & CPU_QUIESCED) == 0);
1215 	} else {
1216 		/*
1217 		 * It is possible that t_weakbound_cpu != t_bound_cpu (for
1218 		 * a short time until weak binding that existed when the
1219 		 * strong binding was established has dropped) so we must
1220 		 * favour weak binding over strong.
1221 		 */
1222 		cp = tp->t_weakbound_cpu ?
1223 		    tp->t_weakbound_cpu : tp->t_bound_cpu;
1224 		bound = 1;
1225 	}
1226 	dp = cp->cpu_disp;
1227 	disp_lock_enter_high(&dp->disp_lock);
1228 
1229 	DTRACE_SCHED3(enqueue, kthread_t *, tp, disp_t *, dp, int, 0);
1230 	TRACE_3(TR_FAC_DISP, TR_BACKQ, "setbackdq:pri %d cpu %p tid %p",
1231 		tpri, cp, tp);
1232 
1233 #ifndef NPROBE
1234 	/* Kernel probe */
1235 	if (tnf_tracing_active)
1236 		tnf_thread_queue(tp, cp, tpri);
1237 #endif /* NPROBE */
1238 
1239 	ASSERT(tpri >= 0 && tpri < dp->disp_npri);
1240 
1241 	THREAD_RUN(tp, &dp->disp_lock);		/* set t_state to TS_RUN */
1242 	tp->t_disp_queue = dp;
1243 	tp->t_link = NULL;
1244 
1245 	dq = &dp->disp_q[tpri];
1246 	dp->disp_nrunnable++;
1247 	membar_enter();
1248 
1249 	if (dq->dq_sruncnt++ != 0) {
1250 		ASSERT(dq->dq_first != NULL);
1251 		dq->dq_last->t_link = tp;
1252 		dq->dq_last = tp;
1253 	} else {
1254 		ASSERT(dq->dq_first == NULL);
1255 		ASSERT(dq->dq_last == NULL);
1256 		dq->dq_first = dq->dq_last = tp;
1257 		BT_SET(dp->disp_qactmap, tpri);
1258 		if (tpri > dp->disp_maxrunpri) {
1259 			dp->disp_maxrunpri = tpri;
1260 			membar_enter();
1261 			cpu_resched(cp, tpri);
1262 		}
1263 	}
1264 
1265 	if (!bound && tpri > dp->disp_max_unbound_pri) {
1266 		if (tp == curthread && dp->disp_max_unbound_pri == -1 &&
1267 		    cp == CPU) {
1268 			/*
1269 			 * If there are no other unbound threads on the
1270 			 * run queue, don't allow other CPUs to steal
1271 			 * this thread while we are in the middle of a
1272 			 * context switch. We may just switch to it
1273 			 * again right away. CPU_DISP_DONTSTEAL is cleared
1274 			 * in swtch and swtch_to.
1275 			 */
1276 			cp->cpu_disp_flags |= CPU_DISP_DONTSTEAL;
1277 		}
1278 		dp->disp_max_unbound_pri = tpri;
1279 	}
1280 	(*disp_enq_thread)(cp, bound);
1281 }
1282 
1283 /*
1284  * Put the specified thread on the front of the dispatcher
1285  * queue corresponding to its current priority.
1286  *
1287  * Called with the thread in transition, onproc or stopped state
1288  * and locked (transition implies locked) and at high spl.
1289  * Returns with the thread in TS_RUN state and still locked.
1290  */
1291 void
1292 setfrontdq(kthread_t *tp)
1293 {
1294 	disp_t		*dp;
1295 	dispq_t		*dq;
1296 	cpu_t		*cp;
1297 	pri_t		tpri;
1298 	int		bound;
1299 
1300 	ASSERT(THREAD_LOCK_HELD(tp));
1301 	ASSERT((tp->t_schedflag & TS_ALLSTART) == 0);
1302 
1303 	if (tp->t_waitrq == 0) {
1304 		hrtime_t curtime;
1305 
1306 		curtime = gethrtime_unscaled();
1307 		(void) cpu_update_pct(tp, curtime);
1308 		tp->t_waitrq = curtime;
1309 	} else {
1310 		(void) cpu_update_pct(tp, gethrtime_unscaled());
1311 	}
1312 
1313 	ASSERT(!thread_on_queue(tp));	/* make sure tp isn't on a runq */
1314 
1315 	/*
1316 	 * If thread is "swapped" or on the swap queue don't
1317 	 * queue it, but wake sched.
1318 	 */
1319 	if ((tp->t_schedflag & (TS_LOAD | TS_ON_SWAPQ)) != TS_LOAD) {
1320 		disp_swapped_setrun(tp);
1321 		return;
1322 	}
1323 
1324 	tpri = DISP_PRIO(tp);
1325 	if (ncpus == 1)
1326 		cp = tp->t_cpu;
1327 	else if (!tp->t_bound_cpu && !tp->t_weakbound_cpu) {
1328 		if (tpri >= kpqpri) {
1329 			setkpdq(tp, SETKP_FRONT);
1330 			return;
1331 		}
1332 		cp = tp->t_cpu;
1333 		if (tp->t_cpupart == cp->cpu_part) {
1334 			/*
1335 			 * If we are of higher or equal priority than
1336 			 * the highest priority runnable thread of
1337 			 * the current CPU, just pick this CPU.  Otherwise
1338 			 * Let cpu_choose() select the CPU.  If this cpu
1339 			 * is the target of an offline request then do not
1340 			 * pick it - a thread_nomigrate() on the in motion
1341 			 * cpu relies on this when it forces a preempt.
1342 			 */
1343 			if (tpri < cp->cpu_disp->disp_maxrunpri ||
1344 			    cp == cpu_inmotion)
1345 				cp = cpu_choose(tp, tpri);
1346 		} else {
1347 			/*
1348 			 * Migrate to a cpu in the new partition.
1349 			 */
1350 			cp = disp_lowpri_cpu(tp->t_cpupart->cp_cpulist,
1351 			    tp->t_lpl, tp->t_pri, NULL);
1352 		}
1353 		bound = 0;
1354 		ASSERT((cp->cpu_flags & CPU_QUIESCED) == 0);
1355 	} else {
1356 		/*
1357 		 * It is possible that t_weakbound_cpu != t_bound_cpu (for
1358 		 * a short time until weak binding that existed when the
1359 		 * strong binding was established has dropped) so we must
1360 		 * favour weak binding over strong.
1361 		 */
1362 		cp = tp->t_weakbound_cpu ?
1363 		    tp->t_weakbound_cpu : tp->t_bound_cpu;
1364 		bound = 1;
1365 	}
1366 	dp = cp->cpu_disp;
1367 	disp_lock_enter_high(&dp->disp_lock);
1368 
1369 	TRACE_2(TR_FAC_DISP, TR_FRONTQ, "frontq:pri %d tid %p", tpri, tp);
1370 	DTRACE_SCHED3(enqueue, kthread_t *, tp, disp_t *, dp, int, 1);
1371 
1372 #ifndef NPROBE
1373 	/* Kernel probe */
1374 	if (tnf_tracing_active)
1375 		tnf_thread_queue(tp, cp, tpri);
1376 #endif /* NPROBE */
1377 
1378 	ASSERT(tpri >= 0 && tpri < dp->disp_npri);
1379 
1380 	THREAD_RUN(tp, &dp->disp_lock);		/* set TS_RUN state and lock */
1381 	tp->t_disp_queue = dp;
1382 
1383 	dq = &dp->disp_q[tpri];
1384 	dp->disp_nrunnable++;
1385 	membar_enter();
1386 
1387 	if (dq->dq_sruncnt++ != 0) {
1388 		ASSERT(dq->dq_last != NULL);
1389 		tp->t_link = dq->dq_first;
1390 		dq->dq_first = tp;
1391 	} else {
1392 		ASSERT(dq->dq_last == NULL);
1393 		ASSERT(dq->dq_first == NULL);
1394 		tp->t_link = NULL;
1395 		dq->dq_first = dq->dq_last = tp;
1396 		BT_SET(dp->disp_qactmap, tpri);
1397 		if (tpri > dp->disp_maxrunpri) {
1398 			dp->disp_maxrunpri = tpri;
1399 			membar_enter();
1400 			cpu_resched(cp, tpri);
1401 		}
1402 	}
1403 
1404 	if (!bound && tpri > dp->disp_max_unbound_pri) {
1405 		if (tp == curthread && dp->disp_max_unbound_pri == -1 &&
1406 		    cp == CPU) {
1407 			/*
1408 			 * If there are no other unbound threads on the
1409 			 * run queue, don't allow other CPUs to steal
1410 			 * this thread while we are in the middle of a
1411 			 * context switch. We may just switch to it
1412 			 * again right away. CPU_DISP_DONTSTEAL is cleared
1413 			 * in swtch and swtch_to.
1414 			 */
1415 			cp->cpu_disp_flags |= CPU_DISP_DONTSTEAL;
1416 		}
1417 		dp->disp_max_unbound_pri = tpri;
1418 	}
1419 	(*disp_enq_thread)(cp, bound);
1420 }
1421 
1422 /*
1423  * Put a high-priority unbound thread on the kp queue
1424  */
1425 static void
1426 setkpdq(kthread_t *tp, int borf)
1427 {
1428 	dispq_t	*dq;
1429 	disp_t	*dp;
1430 	cpu_t	*cp;
1431 	pri_t	tpri;
1432 
1433 	tpri = DISP_PRIO(tp);
1434 
1435 	dp = &tp->t_cpupart->cp_kp_queue;
1436 	disp_lock_enter_high(&dp->disp_lock);
1437 
1438 	TRACE_2(TR_FAC_DISP, TR_FRONTQ, "frontq:pri %d tid %p", tpri, tp);
1439 
1440 	ASSERT(tpri >= 0 && tpri < dp->disp_npri);
1441 	DTRACE_SCHED3(enqueue, kthread_t *, tp, disp_t *, dp, int, borf);
1442 	THREAD_RUN(tp, &dp->disp_lock);		/* set t_state to TS_RUN */
1443 	tp->t_disp_queue = dp;
1444 	dp->disp_nrunnable++;
1445 	dq = &dp->disp_q[tpri];
1446 
1447 	if (dq->dq_sruncnt++ != 0) {
1448 		if (borf == SETKP_BACK) {
1449 			ASSERT(dq->dq_first != NULL);
1450 			tp->t_link = NULL;
1451 			dq->dq_last->t_link = tp;
1452 			dq->dq_last = tp;
1453 		} else {
1454 			ASSERT(dq->dq_last != NULL);
1455 			tp->t_link = dq->dq_first;
1456 			dq->dq_first = tp;
1457 		}
1458 	} else {
1459 		if (borf == SETKP_BACK) {
1460 			ASSERT(dq->dq_first == NULL);
1461 			ASSERT(dq->dq_last == NULL);
1462 			dq->dq_first = dq->dq_last = tp;
1463 		} else {
1464 			ASSERT(dq->dq_last == NULL);
1465 			ASSERT(dq->dq_first == NULL);
1466 			tp->t_link = NULL;
1467 			dq->dq_first = dq->dq_last = tp;
1468 		}
1469 		BT_SET(dp->disp_qactmap, tpri);
1470 		if (tpri > dp->disp_max_unbound_pri)
1471 			dp->disp_max_unbound_pri = tpri;
1472 		if (tpri > dp->disp_maxrunpri) {
1473 			dp->disp_maxrunpri = tpri;
1474 			membar_enter();
1475 		}
1476 	}
1477 
1478 	cp = tp->t_cpu;
1479 	if (tp->t_cpupart != cp->cpu_part) {
1480 		/* migrate to a cpu in the new partition */
1481 		cp = tp->t_cpupart->cp_cpulist;
1482 	}
1483 	cp = disp_lowpri_cpu(cp, tp->t_lpl, tp->t_pri, NULL);
1484 	disp_lock_enter_high(&cp->cpu_disp->disp_lock);
1485 	ASSERT((cp->cpu_flags & CPU_QUIESCED) == 0);
1486 
1487 #ifndef NPROBE
1488 	/* Kernel probe */
1489 	if (tnf_tracing_active)
1490 		tnf_thread_queue(tp, cp, tpri);
1491 #endif /* NPROBE */
1492 
1493 	if (cp->cpu_chosen_level < tpri)
1494 		cp->cpu_chosen_level = tpri;
1495 	cpu_resched(cp, tpri);
1496 	disp_lock_exit_high(&cp->cpu_disp->disp_lock);
1497 	(*disp_enq_thread)(cp, 0);
1498 }
1499 
1500 /*
1501  * Remove a thread from the dispatcher queue if it is on it.
1502  * It is not an error if it is not found but we return whether
1503  * or not it was found in case the caller wants to check.
1504  */
1505 int
1506 dispdeq(kthread_t *tp)
1507 {
1508 	disp_t		*dp;
1509 	dispq_t		*dq;
1510 	kthread_t	*rp;
1511 	kthread_t	*trp;
1512 	kthread_t	**ptp;
1513 	int		tpri;
1514 
1515 	ASSERT(THREAD_LOCK_HELD(tp));
1516 
1517 	if (tp->t_state != TS_RUN)
1518 		return (0);
1519 
1520 	/*
1521 	 * The thread is "swapped" or is on the swap queue and
1522 	 * hence no longer on the run queue, so return true.
1523 	 */
1524 	if ((tp->t_schedflag & (TS_LOAD | TS_ON_SWAPQ)) != TS_LOAD)
1525 		return (1);
1526 
1527 	tpri = DISP_PRIO(tp);
1528 	dp = tp->t_disp_queue;
1529 	ASSERT(tpri < dp->disp_npri);
1530 	dq = &dp->disp_q[tpri];
1531 	ptp = &dq->dq_first;
1532 	rp = *ptp;
1533 	trp = NULL;
1534 
1535 	ASSERT(dq->dq_last == NULL || dq->dq_last->t_link == NULL);
1536 
1537 	/*
1538 	 * Search for thread in queue.
1539 	 * Double links would simplify this at the expense of disp/setrun.
1540 	 */
1541 	while (rp != tp && rp != NULL) {
1542 		trp = rp;
1543 		ptp = &trp->t_link;
1544 		rp = trp->t_link;
1545 	}
1546 
1547 	if (rp == NULL) {
1548 		panic("dispdeq: thread not on queue");
1549 	}
1550 
1551 	DTRACE_SCHED2(dequeue, kthread_t *, tp, disp_t *, dp);
1552 
1553 	/*
1554 	 * Found it so remove it from queue.
1555 	 */
1556 	if ((*ptp = rp->t_link) == NULL)
1557 		dq->dq_last = trp;
1558 
1559 	dp->disp_nrunnable--;
1560 	if (--dq->dq_sruncnt == 0) {
1561 		dp->disp_qactmap[tpri >> BT_ULSHIFT] &= ~BT_BIW(tpri);
1562 		if (dp->disp_nrunnable == 0) {
1563 			dp->disp_max_unbound_pri = -1;
1564 			dp->disp_maxrunpri = -1;
1565 		} else if (tpri == dp->disp_maxrunpri) {
1566 			int ipri;
1567 
1568 			ipri = bt_gethighbit(dp->disp_qactmap,
1569 			    dp->disp_maxrunpri >> BT_ULSHIFT);
1570 			if (ipri < dp->disp_max_unbound_pri)
1571 				dp->disp_max_unbound_pri = ipri;
1572 			dp->disp_maxrunpri = ipri;
1573 		}
1574 	}
1575 	tp->t_link = NULL;
1576 	THREAD_TRANSITION(tp);		/* put in intermediate state */
1577 	return (1);
1578 }
1579 
1580 
1581 /*
1582  * dq_sruninc and dq_srundec are public functions for
1583  * incrementing/decrementing the sruncnts when a thread on
1584  * a dispatcher queue is made schedulable/unschedulable by
1585  * resetting the TS_LOAD flag.
1586  *
1587  * The caller MUST have the thread lock and therefore the dispatcher
1588  * queue lock so that the operation which changes
1589  * the flag, the operation that checks the status of the thread to
1590  * determine if it's on a disp queue AND the call to this function
1591  * are one atomic operation with respect to interrupts.
1592  */
1593 
1594 /*
1595  * Called by sched AFTER TS_LOAD flag is set on a swapped, runnable thread.
1596  */
1597 void
1598 dq_sruninc(kthread_t *t)
1599 {
1600 	ASSERT(t->t_state == TS_RUN);
1601 	ASSERT(t->t_schedflag & TS_LOAD);
1602 
1603 	THREAD_TRANSITION(t);
1604 	setfrontdq(t);
1605 }
1606 
1607 /*
1608  * See comment on calling conventions above.
1609  * Called by sched BEFORE TS_LOAD flag is cleared on a runnable thread.
1610  */
1611 void
1612 dq_srundec(kthread_t *t)
1613 {
1614 	ASSERT(t->t_schedflag & TS_LOAD);
1615 
1616 	(void) dispdeq(t);
1617 	disp_swapped_enq(t);
1618 }
1619 
1620 /*
1621  * Change the dispatcher lock of thread to the "swapped_lock"
1622  * and return with thread lock still held.
1623  *
1624  * Called with thread_lock held, in transition state, and at high spl.
1625  */
1626 void
1627 disp_swapped_enq(kthread_t *tp)
1628 {
1629 	ASSERT(THREAD_LOCK_HELD(tp));
1630 	ASSERT(tp->t_schedflag & TS_LOAD);
1631 
1632 	switch (tp->t_state) {
1633 	case TS_RUN:
1634 		disp_lock_enter_high(&swapped_lock);
1635 		THREAD_SWAP(tp, &swapped_lock);	/* set TS_RUN state and lock */
1636 		break;
1637 	case TS_ONPROC:
1638 		disp_lock_enter_high(&swapped_lock);
1639 		THREAD_TRANSITION(tp);
1640 		wake_sched_sec = 1;		/* tell clock to wake sched */
1641 		THREAD_SWAP(tp, &swapped_lock);	/* set TS_RUN state and lock */
1642 		break;
1643 	default:
1644 		panic("disp_swapped: tp: %p bad t_state", (void *)tp);
1645 	}
1646 }
1647 
1648 /*
1649  * This routine is called by setbackdq/setfrontdq if the thread is
1650  * not loaded or loaded and on the swap queue.
1651  *
1652  * Thread state TS_SLEEP implies that a swapped thread
1653  * has been woken up and needs to be swapped in by the swapper.
1654  *
1655  * Thread state TS_RUN, it implies that the priority of a swapped
1656  * thread is being increased by scheduling class (e.g. ts_update).
1657  */
1658 static void
1659 disp_swapped_setrun(kthread_t *tp)
1660 {
1661 	ASSERT(THREAD_LOCK_HELD(tp));
1662 	ASSERT((tp->t_schedflag & (TS_LOAD | TS_ON_SWAPQ)) != TS_LOAD);
1663 
1664 	switch (tp->t_state) {
1665 	case TS_SLEEP:
1666 		disp_lock_enter_high(&swapped_lock);
1667 		/*
1668 		 * Wakeup sched immediately (i.e., next tick) if the
1669 		 * thread priority is above maxclsyspri.
1670 		 */
1671 		if (DISP_PRIO(tp) > maxclsyspri)
1672 			wake_sched = 1;
1673 		else
1674 			wake_sched_sec = 1;
1675 		THREAD_RUN(tp, &swapped_lock); /* set TS_RUN state and lock */
1676 		break;
1677 	case TS_RUN:				/* called from ts_update */
1678 		break;
1679 	default:
1680 		panic("disp_swapped_setrun: tp: %p bad t_state", tp);
1681 	}
1682 }
1683 
1684 
1685 /*
1686  *	Make a thread give up its processor.  Find the processor on
1687  *	which this thread is executing, and have that processor
1688  *	preempt.
1689  */
1690 void
1691 cpu_surrender(kthread_t *tp)
1692 {
1693 	cpu_t	*cpup;
1694 	int	max_pri;
1695 	int	max_run_pri;
1696 	klwp_t	*lwp;
1697 
1698 	ASSERT(THREAD_LOCK_HELD(tp));
1699 
1700 	if (tp->t_state != TS_ONPROC)
1701 		return;
1702 	cpup = tp->t_disp_queue->disp_cpu;	/* CPU thread dispatched to */
1703 	max_pri = cpup->cpu_disp->disp_maxrunpri; /* best pri of that CPU */
1704 	max_run_pri = CP_MAXRUNPRI(cpup->cpu_part);
1705 	if (max_pri < max_run_pri)
1706 		max_pri = max_run_pri;
1707 
1708 	cpup->cpu_runrun = 1;
1709 	if (max_pri >= kpreemptpri && cpup->cpu_kprunrun == 0) {
1710 		cpup->cpu_kprunrun = 1;
1711 	}
1712 
1713 	/*
1714 	 * Propagate cpu_runrun, and cpu_kprunrun to global visibility.
1715 	 */
1716 	membar_enter();
1717 
1718 	DTRACE_SCHED1(surrender, kthread_t *, tp);
1719 
1720 	/*
1721 	 * Make the target thread take an excursion through trap()
1722 	 * to do preempt() (unless we're already in trap or post_syscall,
1723 	 * calling cpu_surrender via CL_TRAPRET).
1724 	 */
1725 	if (tp != curthread || (lwp = tp->t_lwp) == NULL ||
1726 	    lwp->lwp_state != LWP_USER) {
1727 		aston(tp);
1728 		if (cpup != CPU)
1729 			poke_cpu(cpup->cpu_id);
1730 	}
1731 	TRACE_2(TR_FAC_DISP, TR_CPU_SURRENDER,
1732 	    "cpu_surrender:tid %p cpu %p", tp, cpup);
1733 }
1734 
1735 
1736 /*
1737  * Commit to and ratify a scheduling decision
1738  */
1739 /*ARGSUSED*/
1740 static kthread_t *
1741 disp_ratify(kthread_t *tp, disp_t *kpq)
1742 {
1743 	pri_t	tpri, maxpri;
1744 	pri_t	maxkpri;
1745 	cpu_t	*cpup;
1746 
1747 	ASSERT(tp != NULL);
1748 	/*
1749 	 * Commit to, then ratify scheduling decision
1750 	 */
1751 	cpup = CPU;
1752 	if (cpup->cpu_runrun != 0)
1753 		cpup->cpu_runrun = 0;
1754 	if (cpup->cpu_kprunrun != 0)
1755 		cpup->cpu_kprunrun = 0;
1756 	if (cpup->cpu_chosen_level != -1)
1757 		cpup->cpu_chosen_level = -1;
1758 	membar_enter();
1759 	tpri = DISP_PRIO(tp);
1760 	maxpri = cpup->cpu_disp->disp_maxrunpri;
1761 	maxkpri = kpq->disp_maxrunpri;
1762 	if (maxpri < maxkpri)
1763 		maxpri = maxkpri;
1764 	if (tpri < maxpri) {
1765 		/*
1766 		 * should have done better
1767 		 * put this one back and indicate to try again
1768 		 */
1769 		cpup->cpu_dispthread = curthread;	/* fixup dispthread */
1770 		cpup->cpu_dispatch_pri = DISP_PRIO(curthread);
1771 		thread_lock_high(tp);
1772 		THREAD_TRANSITION(tp);
1773 		setfrontdq(tp);
1774 		thread_unlock_nopreempt(tp);
1775 
1776 		tp = NULL;
1777 	}
1778 	return (tp);
1779 }
1780 
1781 /*
1782  * See if there is any work on the dispatcher queue for other CPUs.
1783  * If there is, dequeue the best thread and return.
1784  */
1785 static kthread_t *
1786 disp_getwork(cpu_t *cp)
1787 {
1788 	cpu_t		*ocp;		/* other CPU */
1789 	cpu_t		*ocp_start;
1790 	cpu_t		*tcp;		/* target local CPU */
1791 	kthread_t	*tp;
1792 	pri_t		maxpri;
1793 	int		s;
1794 	disp_t		*kpq;		/* kp queue for this partition */
1795 	lpl_t		*lpl, *lpl_leaf;
1796 	int		hint, leafidx;
1797 
1798 	maxpri = -1;
1799 	tcp = NULL;
1800 
1801 	kpq = &cp->cpu_part->cp_kp_queue;
1802 	while (kpq->disp_maxrunpri >= 0) {
1803 		/*
1804 		 * Try to take a thread from the kp_queue.
1805 		 */
1806 		tp = (disp_getbest(kpq));
1807 		if (tp)
1808 			return (disp_ratify(tp, kpq));
1809 	}
1810 
1811 	s = splhigh();		/* protect the cpu_active list */
1812 
1813 	/*
1814 	 * Try to find something to do on another CPU's run queue.
1815 	 * Loop through all other CPUs looking for the one with the highest
1816 	 * priority unbound thread.
1817 	 *
1818 	 * On NUMA machines, the partition's CPUs are consulted in order of
1819 	 * distance from the current CPU. This way, the first available
1820 	 * work found is also the closest, and will suffer the least
1821 	 * from being migrated.
1822 	 */
1823 	lpl = lpl_leaf = cp->cpu_lpl;
1824 	hint = leafidx = 0;
1825 
1826 	/*
1827 	 * This loop traverses the lpl hierarchy. Higher level lpls represent
1828 	 * broader levels of locality
1829 	 */
1830 	do {
1831 		/* This loop iterates over the lpl's leaves */
1832 		do {
1833 			if (lpl_leaf != cp->cpu_lpl)
1834 				ocp = lpl_leaf->lpl_cpus;
1835 			else
1836 				ocp = cp->cpu_next_lpl;
1837 
1838 			/* This loop iterates over the CPUs in the leaf */
1839 			ocp_start = ocp;
1840 			do {
1841 				pri_t pri;
1842 
1843 				ASSERT(CPU_ACTIVE(ocp));
1844 
1845 				/*
1846 				 * End our stroll around the partition if:
1847 				 *
1848 				 * - Something became runnable on the local
1849 				 *	queue
1850 				 *
1851 				 * - We're at the broadest level of locality and
1852 				 *   we happen across another idle CPU. At the
1853 				 *   highest level of locality, all CPUs will
1854 				 *   walk the partition's CPUs in the same
1855 				 *   order, so we can end our stroll taking
1856 				 *   comfort in knowing the other idle CPU is
1857 				 *   already covering the next portion of the
1858 				 *   list.
1859 				 */
1860 				if (cp->cpu_disp->disp_nrunnable != 0)
1861 					break;
1862 				if (ocp->cpu_dispatch_pri == -1) {
1863 					if (ocp->cpu_disp_flags &
1864 					    CPU_DISP_HALTED)
1865 						continue;
1866 					else if (lpl->lpl_parent == NULL)
1867 						break;
1868 				}
1869 
1870 				/*
1871 				 * If there's only one thread and the CPU
1872 				 * is in the middle of a context switch,
1873 				 * or it's currently running the idle thread,
1874 				 * don't steal it.
1875 				 */
1876 				if ((ocp->cpu_disp_flags &
1877 					CPU_DISP_DONTSTEAL) &&
1878 				    ocp->cpu_disp->disp_nrunnable == 1)
1879 					continue;
1880 
1881 				pri = ocp->cpu_disp->disp_max_unbound_pri;
1882 				if (pri > maxpri) {
1883 					maxpri = pri;
1884 					tcp = ocp;
1885 				}
1886 			} while ((ocp = ocp->cpu_next_lpl) != ocp_start);
1887 
1888 			if ((lpl_leaf = lpl->lpl_rset[++leafidx]) == NULL) {
1889 				leafidx = 0;
1890 				lpl_leaf = lpl->lpl_rset[leafidx];
1891 			}
1892 		} while (leafidx != hint);
1893 
1894 		hint = leafidx = lpl->lpl_hint;
1895 		if ((lpl = lpl->lpl_parent) != NULL)
1896 			lpl_leaf = lpl->lpl_rset[hint];
1897 	} while (!tcp && lpl);
1898 
1899 	splx(s);
1900 
1901 	/*
1902 	 * If another queue looks good, and there is still nothing on
1903 	 * the local queue, try to transfer one or more threads
1904 	 * from it to our queue.
1905 	 */
1906 	if (tcp && cp->cpu_disp->disp_nrunnable == 0) {
1907 		tp = (disp_getbest(tcp->cpu_disp));
1908 		if (tp)
1909 			return (disp_ratify(tp, kpq));
1910 	}
1911 	return (NULL);
1912 }
1913 
1914 
1915 /*
1916  * disp_fix_unbound_pri()
1917  *	Determines the maximum priority of unbound threads on the queue.
1918  *	The priority is kept for the queue, but is only increased, never
1919  *	reduced unless some CPU is looking for something on that queue.
1920  *
1921  *	The priority argument is the known upper limit.
1922  *
1923  *	Perhaps this should be kept accurately, but that probably means
1924  *	separate bitmaps for bound and unbound threads.  Since only idled
1925  *	CPUs will have to do this recalculation, it seems better this way.
1926  */
1927 static void
1928 disp_fix_unbound_pri(disp_t *dp, pri_t pri)
1929 {
1930 	kthread_t	*tp;
1931 	dispq_t		*dq;
1932 	ulong_t		*dqactmap = dp->disp_qactmap;
1933 	ulong_t		mapword;
1934 	int		wx;
1935 
1936 	ASSERT(DISP_LOCK_HELD(&dp->disp_lock));
1937 
1938 	ASSERT(pri >= 0);			/* checked by caller */
1939 
1940 	/*
1941 	 * Start the search at the next lowest priority below the supplied
1942 	 * priority.  This depends on the bitmap implementation.
1943 	 */
1944 	do {
1945 		wx = pri >> BT_ULSHIFT;		/* index of word in map */
1946 
1947 		/*
1948 		 * Form mask for all lower priorities in the word.
1949 		 */
1950 		mapword = dqactmap[wx] & (BT_BIW(pri) - 1);
1951 
1952 		/*
1953 		 * Get next lower active priority.
1954 		 */
1955 		if (mapword != 0) {
1956 			pri = (wx << BT_ULSHIFT) + highbit(mapword) - 1;
1957 		} else if (wx > 0) {
1958 			pri = bt_gethighbit(dqactmap, wx - 1); /* sign extend */
1959 			if (pri < 0)
1960 				break;
1961 		} else {
1962 			pri = -1;
1963 			break;
1964 		}
1965 
1966 		/*
1967 		 * Search the queue for unbound, runnable threads.
1968 		 */
1969 		dq = &dp->disp_q[pri];
1970 		tp = dq->dq_first;
1971 
1972 		while (tp && (tp->t_bound_cpu || tp->t_weakbound_cpu)) {
1973 			tp = tp->t_link;
1974 		}
1975 
1976 		/*
1977 		 * If a thread was found, set the priority and return.
1978 		 */
1979 	} while (tp == NULL);
1980 
1981 	/*
1982 	 * pri holds the maximum unbound thread priority or -1.
1983 	 */
1984 	if (dp->disp_max_unbound_pri != pri)
1985 		dp->disp_max_unbound_pri = pri;
1986 }
1987 
1988 /*
1989  * disp_adjust_unbound_pri() - thread is becoming unbound, so we should
1990  * 	check if the CPU to which is was previously bound should have
1991  * 	its disp_max_unbound_pri increased.
1992  */
1993 void
1994 disp_adjust_unbound_pri(kthread_t *tp)
1995 {
1996 	disp_t *dp;
1997 	pri_t tpri;
1998 
1999 	ASSERT(THREAD_LOCK_HELD(tp));
2000 
2001 	/*
2002 	 * Don't do anything if the thread is not bound, or
2003 	 * currently not runnable or swapped out.
2004 	 */
2005 	if (tp->t_bound_cpu == NULL ||
2006 	    tp->t_state != TS_RUN ||
2007 	    tp->t_schedflag & TS_ON_SWAPQ)
2008 		return;
2009 
2010 	tpri = DISP_PRIO(tp);
2011 	dp = tp->t_bound_cpu->cpu_disp;
2012 	ASSERT(tpri >= 0 && tpri < dp->disp_npri);
2013 	if (tpri > dp->disp_max_unbound_pri)
2014 		dp->disp_max_unbound_pri = tpri;
2015 }
2016 
2017 /*
2018  * disp_getbest() - de-queue the highest priority unbound runnable thread.
2019  *	returns with the thread unlocked and onproc
2020  *	but at splhigh (like disp()).
2021  *	returns NULL if nothing found.
2022  *
2023  *	Passed a pointer to a dispatch queue not associated with this CPU.
2024  */
2025 static kthread_t *
2026 disp_getbest(disp_t *dp)
2027 {
2028 	kthread_t	*tp;
2029 	dispq_t		*dq;
2030 	pri_t		pri;
2031 	cpu_t		*cp;
2032 
2033 	disp_lock_enter(&dp->disp_lock);
2034 
2035 	/*
2036 	 * If there is nothing to run, or the CPU is in the middle of a
2037 	 * context switch of the only thread, return NULL.
2038 	 */
2039 	pri = dp->disp_max_unbound_pri;
2040 	if (pri == -1 ||
2041 		(dp->disp_cpu != NULL &&
2042 		    (dp->disp_cpu->cpu_disp_flags & CPU_DISP_DONTSTEAL) &&
2043 		dp->disp_cpu->cpu_disp->disp_nrunnable == 1)) {
2044 		disp_lock_exit_nopreempt(&dp->disp_lock);
2045 		return (NULL);
2046 	}
2047 
2048 	dq = &dp->disp_q[pri];
2049 	tp = dq->dq_first;
2050 
2051 	/*
2052 	 * Skip over bound threads.
2053 	 * Bound threads can be here even though disp_max_unbound_pri
2054 	 * indicated this level.  Besides, it not always accurate because it
2055 	 * isn't reduced until another CPU looks for work.
2056 	 * Note that tp could be NULL right away due to this.
2057 	 */
2058 	while (tp && (tp->t_bound_cpu || tp->t_weakbound_cpu)) {
2059 		tp = tp->t_link;
2060 	}
2061 
2062 	/*
2063 	 * If there were no unbound threads on this queue, find the queue
2064 	 * where they are and then return NULL so that other CPUs will be
2065 	 * considered.
2066 	 */
2067 	if (tp == NULL) {
2068 		disp_fix_unbound_pri(dp, pri);
2069 		disp_lock_exit_nopreempt(&dp->disp_lock);
2070 		return (NULL);
2071 	}
2072 
2073 	/*
2074 	 * Found a runnable, unbound thread, so remove it from queue.
2075 	 * dispdeq() requires that we have the thread locked, and we do,
2076 	 * by virtue of holding the dispatch queue lock.  dispdeq() will
2077 	 * put the thread in transition state, thereby dropping the dispq
2078 	 * lock.
2079 	 */
2080 #ifdef DEBUG
2081 	{
2082 		int	thread_was_on_queue;
2083 
2084 		thread_was_on_queue = dispdeq(tp);	/* drops disp_lock */
2085 		ASSERT(thread_was_on_queue);
2086 	}
2087 #else /* DEBUG */
2088 	(void) dispdeq(tp);			/* drops disp_lock */
2089 #endif /* DEBUG */
2090 
2091 	tp->t_schedflag |= TS_DONT_SWAP;
2092 
2093 	/*
2094 	 * Setup thread to run on the current CPU.
2095 	 */
2096 	cp = CPU;
2097 
2098 	tp->t_disp_queue = cp->cpu_disp;
2099 
2100 	cp->cpu_dispthread = tp;		/* protected by spl only */
2101 	cp->cpu_dispatch_pri = pri;
2102 	ASSERT(pri == DISP_PRIO(tp));
2103 
2104 	thread_onproc(tp, cp);			/* set t_state to TS_ONPROC */
2105 
2106 	/*
2107 	 * Return with spl high so that swtch() won't need to raise it.
2108 	 * The disp_lock was dropped by dispdeq().
2109 	 */
2110 
2111 	return (tp);
2112 }
2113 
2114 /*
2115  * disp_bound_common() - common routine for higher level functions
2116  *	that check for bound threads under certain conditions.
2117  *	If 'threadlistsafe' is set then there is no need to acquire
2118  *	pidlock to stop the thread list from changing (eg, if
2119  *	disp_bound_* is called with cpus paused).
2120  */
2121 static int
2122 disp_bound_common(cpu_t *cp, int threadlistsafe, int flag)
2123 {
2124 	int		found = 0;
2125 	kthread_t	*tp;
2126 
2127 	ASSERT(flag);
2128 
2129 	if (!threadlistsafe)
2130 		mutex_enter(&pidlock);
2131 	tp = curthread;		/* faster than allthreads */
2132 	do {
2133 		if (tp->t_state != TS_FREE) {
2134 			/*
2135 			 * If an interrupt thread is busy, but the
2136 			 * caller doesn't care (i.e. BOUND_INTR is off),
2137 			 * then just ignore it and continue through.
2138 			 */
2139 			if ((tp->t_flag & T_INTR_THREAD) &&
2140 			    !(flag & BOUND_INTR))
2141 				continue;
2142 
2143 			/*
2144 			 * Skip the idle thread for the CPU
2145 			 * we're about to set offline.
2146 			 */
2147 			if (tp == cp->cpu_idle_thread)
2148 				continue;
2149 
2150 			/*
2151 			 * Skip the pause thread for the CPU
2152 			 * we're about to set offline.
2153 			 */
2154 			if (tp == cp->cpu_pause_thread)
2155 				continue;
2156 
2157 			if ((flag & BOUND_CPU) &&
2158 			    (tp->t_bound_cpu == cp ||
2159 			    tp->t_bind_cpu == cp->cpu_id ||
2160 			    tp->t_weakbound_cpu == cp)) {
2161 				found = 1;
2162 				break;
2163 			}
2164 
2165 			if ((flag & BOUND_PARTITION) &&
2166 			    (tp->t_cpupart == cp->cpu_part)) {
2167 				found = 1;
2168 				break;
2169 			}
2170 		}
2171 	} while ((tp = tp->t_next) != curthread && found == 0);
2172 	if (!threadlistsafe)
2173 		mutex_exit(&pidlock);
2174 	return (found);
2175 }
2176 
2177 /*
2178  * disp_bound_threads - return nonzero if threads are bound to the processor.
2179  *	Called infrequently.  Keep this simple.
2180  *	Includes threads that are asleep or stopped but not onproc.
2181  */
2182 int
2183 disp_bound_threads(cpu_t *cp, int threadlistsafe)
2184 {
2185 	return (disp_bound_common(cp, threadlistsafe, BOUND_CPU));
2186 }
2187 
2188 /*
2189  * disp_bound_anythreads - return nonzero if _any_ threads are bound
2190  * to the given processor, including interrupt threads.
2191  */
2192 int
2193 disp_bound_anythreads(cpu_t *cp, int threadlistsafe)
2194 {
2195 	return (disp_bound_common(cp, threadlistsafe, BOUND_CPU | BOUND_INTR));
2196 }
2197 
2198 /*
2199  * disp_bound_partition - return nonzero if threads are bound to the same
2200  * partition as the processor.
2201  *	Called infrequently.  Keep this simple.
2202  *	Includes threads that are asleep or stopped but not onproc.
2203  */
2204 int
2205 disp_bound_partition(cpu_t *cp, int threadlistsafe)
2206 {
2207 	return (disp_bound_common(cp, threadlistsafe, BOUND_PARTITION));
2208 }
2209 
2210 /*
2211  * disp_cpu_inactive - make a CPU inactive by moving all of its unbound
2212  * threads to other CPUs.
2213  */
2214 void
2215 disp_cpu_inactive(cpu_t *cp)
2216 {
2217 	kthread_t	*tp;
2218 	disp_t		*dp = cp->cpu_disp;
2219 	dispq_t		*dq;
2220 	pri_t		pri;
2221 	int		wasonq;
2222 
2223 	disp_lock_enter(&dp->disp_lock);
2224 	while ((pri = dp->disp_max_unbound_pri) != -1) {
2225 		dq = &dp->disp_q[pri];
2226 		tp = dq->dq_first;
2227 
2228 		/*
2229 		 * Skip over bound threads.
2230 		 */
2231 		while (tp != NULL && tp->t_bound_cpu != NULL) {
2232 			tp = tp->t_link;
2233 		}
2234 
2235 		if (tp == NULL) {
2236 			/* disp_max_unbound_pri must be inaccurate, so fix it */
2237 			disp_fix_unbound_pri(dp, pri);
2238 			continue;
2239 		}
2240 
2241 		wasonq = dispdeq(tp);		/* drops disp_lock */
2242 		ASSERT(wasonq);
2243 		ASSERT(tp->t_weakbound_cpu == NULL);
2244 
2245 		setbackdq(tp);
2246 		/*
2247 		 * Called from cpu_offline:
2248 		 *
2249 		 * cp has already been removed from the list of active cpus
2250 		 * and tp->t_cpu has been changed so there is no risk of
2251 		 * tp ending up back on cp.
2252 		 *
2253 		 * Called from cpupart_move_cpu:
2254 		 *
2255 		 * The cpu has moved to a new cpupart.  Any threads that
2256 		 * were on it's dispatch queues before the move remain
2257 		 * in the old partition and can't run in the new partition.
2258 		 */
2259 		ASSERT(tp->t_cpu != cp);
2260 		thread_unlock(tp);
2261 
2262 		disp_lock_enter(&dp->disp_lock);
2263 	}
2264 	disp_lock_exit(&dp->disp_lock);
2265 }
2266 
2267 /*
2268  * disp_lowpri_cpu - find CPU running the lowest priority thread.
2269  *	The hint passed in is used as a starting point so we don't favor
2270  *	CPU 0 or any other CPU.  The caller should pass in the most recently
2271  *	used CPU for the thread.
2272  *
2273  *	The lgroup and priority are used to determine the best CPU to run on
2274  *	in a NUMA machine.  The lgroup specifies which CPUs are closest while
2275  *	the thread priority will indicate whether the thread will actually run
2276  *	there.  To pick the best CPU, the CPUs inside and outside of the given
2277  *	lgroup which are running the lowest priority threads are found.  The
2278  *	remote CPU is chosen only if the thread will not run locally on a CPU
2279  *	within the lgroup, but will run on the remote CPU. If the thread
2280  *	cannot immediately run on any CPU, the best local CPU will be chosen.
2281  *
2282  *	The lpl specified also identifies the cpu partition from which
2283  *	disp_lowpri_cpu should select a CPU.
2284  *
2285  *	curcpu is used to indicate that disp_lowpri_cpu is being called on
2286  *      behalf of the current thread. (curthread is looking for a new cpu)
2287  *      In this case, cpu_dispatch_pri for this thread's cpu should be
2288  *      ignored.
2289  *
2290  *      If a cpu is the target of an offline request then try to avoid it.
2291  *
2292  *	This function must be called at either high SPL, or with preemption
2293  *	disabled, so that the "hint" CPU cannot be removed from the online
2294  *	CPU list while we are traversing it.
2295  */
2296 cpu_t *
2297 disp_lowpri_cpu(cpu_t *hint, lpl_t *lpl, pri_t tpri, cpu_t *curcpu)
2298 {
2299 	cpu_t	*bestcpu;
2300 	cpu_t	*besthomecpu;
2301 	cpu_t   *cp, *cpstart;
2302 
2303 	pri_t   bestpri;
2304 	pri_t   cpupri;
2305 
2306 	klgrpset_t	done;
2307 	klgrpset_t	cur_set;
2308 
2309 	lpl_t		*lpl_iter, *lpl_leaf;
2310 	int		i;
2311 
2312 	/*
2313 	 * Scan for a CPU currently running the lowest priority thread.
2314 	 * Cannot get cpu_lock here because it is adaptive.
2315 	 * We do not require lock on CPU list.
2316 	 */
2317 	ASSERT(hint != NULL);
2318 	ASSERT(lpl != NULL);
2319 	ASSERT(lpl->lpl_ncpu > 0);
2320 
2321 	/*
2322 	 * First examine local CPUs. Note that it's possible the hint CPU
2323 	 * passed in in remote to the specified home lgroup. If our priority
2324 	 * isn't sufficient enough such that we can run immediately at home,
2325 	 * then examine CPUs remote to our home lgroup.
2326 	 * We would like to give preference to CPUs closest to "home".
2327 	 * If we can't find a CPU where we'll run at a given level
2328 	 * of locality, we expand our search to include the next level.
2329 	 */
2330 	bestcpu = besthomecpu = NULL;
2331 	klgrpset_clear(done);
2332 	/* start with lpl we were passed */
2333 
2334 	lpl_iter = lpl;
2335 
2336 	do {
2337 
2338 		bestpri = SHRT_MAX;
2339 		klgrpset_clear(cur_set);
2340 
2341 		for (i = 0; i < lpl_iter->lpl_nrset; i++) {
2342 			lpl_leaf = lpl_iter->lpl_rset[i];
2343 			if (klgrpset_ismember(done, lpl_leaf->lpl_lgrpid))
2344 				continue;
2345 
2346 			klgrpset_add(cur_set, lpl_leaf->lpl_lgrpid);
2347 
2348 			if (hint->cpu_lpl == lpl_leaf)
2349 				cp = cpstart = hint;
2350 			else
2351 				cp = cpstart = lpl_leaf->lpl_cpus;
2352 
2353 			do {
2354 
2355 				if (cp == curcpu)
2356 					cpupri = -1;
2357 				else if (cp == cpu_inmotion)
2358 					cpupri = SHRT_MAX;
2359 				else
2360 					cpupri = cp->cpu_dispatch_pri;
2361 
2362 				if (cp->cpu_disp->disp_maxrunpri > cpupri)
2363 					cpupri = cp->cpu_disp->disp_maxrunpri;
2364 				if (cp->cpu_chosen_level > cpupri)
2365 					cpupri = cp->cpu_chosen_level;
2366 				if (cpupri < bestpri) {
2367 					if (CPU_IDLING(cpupri)) {
2368 						ASSERT((cp->cpu_flags &
2369 						    CPU_QUIESCED) == 0);
2370 						return (cp);
2371 					}
2372 					bestcpu = cp;
2373 					bestpri = cpupri;
2374 				}
2375 			} while ((cp = cp->cpu_next_lpl) != cpstart);
2376 		}
2377 
2378 		if (bestcpu && (tpri > bestpri)) {
2379 			ASSERT((bestcpu->cpu_flags & CPU_QUIESCED) == 0);
2380 			return (bestcpu);
2381 		}
2382 		if (besthomecpu == NULL)
2383 			besthomecpu = bestcpu;
2384 		/*
2385 		 * Add the lgrps we just considered to the "done" set
2386 		 */
2387 		klgrpset_or(done, cur_set);
2388 
2389 	} while ((lpl_iter = lpl_iter->lpl_parent) != NULL);
2390 
2391 	/*
2392 	 * The specified priority isn't high enough to run immediately
2393 	 * anywhere, so just return the best CPU from the home lgroup.
2394 	 */
2395 	ASSERT((besthomecpu->cpu_flags & CPU_QUIESCED) == 0);
2396 	return (besthomecpu);
2397 }
2398 
2399 /*
2400  * This routine provides the generic idle cpu function for all processors.
2401  * If a processor has some specific code to execute when idle (say, to stop
2402  * the pipeline and save power) then that routine should be defined in the
2403  * processors specific code (module_xx.c) and the global variable idle_cpu
2404  * set to that function.
2405  */
2406 static void
2407 generic_idle_cpu(void)
2408 {
2409 }
2410 
2411 /*ARGSUSED*/
2412 static void
2413 generic_enq_thread(cpu_t *cpu, int bound)
2414 {
2415 }
2416 
2417 /*
2418  * Select a CPU for this thread to run on.  Choose t->t_cpu unless:
2419  *	- t->t_cpu is not in this thread's assigned lgrp
2420  *	- the time since the thread last came off t->t_cpu exceeds the
2421  *	  rechoose time for this cpu (ignore this if t is curthread in
2422  *	  which case it's on CPU and t->t_disp_time is inaccurate)
2423  *	- t->t_cpu is presently the target of an offline or partition move
2424  *	  request
2425  */
2426 static cpu_t *
2427 cpu_choose(kthread_t *t, pri_t tpri)
2428 {
2429 	ASSERT(tpri < kpqpri);
2430 
2431 	if ((((lbolt - t->t_disp_time) > t->t_cpu->cpu_rechoose) &&
2432 	    t != curthread) || t->t_cpu == cpu_inmotion) {
2433 		return (disp_lowpri_cpu(t->t_cpu, t->t_lpl, tpri, NULL));
2434 	}
2435 
2436 	/*
2437 	 * Take a trip through disp_lowpri_cpu() if the thread was
2438 	 * running outside it's home lgroup
2439 	 */
2440 	if (!klgrpset_ismember(t->t_lpl->lpl_lgrp->lgrp_set[LGRP_RSRC_CPU],
2441 	    t->t_cpu->cpu_lpl->lpl_lgrpid)) {
2442 		return (disp_lowpri_cpu(t->t_cpu, t->t_lpl, tpri,
2443 		    (t == curthread) ? t->t_cpu : NULL));
2444 	}
2445 	return (t->t_cpu);
2446 }
2447