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