xref: /freebsd/sys/kern/kern_synch.c (revision 17d6c636720d00f77e5d098daf4c278f89d84f7b)
1 /*-
2  * Copyright (c) 1982, 1986, 1990, 1991, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the University of
21  *	California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)kern_synch.c	8.9 (Berkeley) 5/19/95
39  * $FreeBSD$
40  */
41 
42 #include "opt_ddb.h"
43 #include "opt_ktrace.h"
44 
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/condvar.h>
48 #include <sys/kernel.h>
49 #include <sys/ktr.h>
50 #include <sys/lock.h>
51 #include <sys/mutex.h>
52 #include <sys/proc.h>
53 #include <sys/resourcevar.h>
54 #include <sys/signalvar.h>
55 #include <sys/smp.h>
56 #include <sys/sx.h>
57 #include <sys/sysctl.h>
58 #include <sys/sysproto.h>
59 #include <sys/vmmeter.h>
60 #ifdef DDB
61 #include <ddb/ddb.h>
62 #endif
63 #ifdef KTRACE
64 #include <sys/uio.h>
65 #include <sys/ktrace.h>
66 #endif
67 
68 #include <machine/cpu.h>
69 
70 static void sched_setup __P((void *dummy));
71 SYSINIT(sched_setup, SI_SUB_KICK_SCHEDULER, SI_ORDER_FIRST, sched_setup, NULL)
72 
73 int	hogticks;
74 int	lbolt;
75 int	sched_quantum;		/* Roundrobin scheduling quantum in ticks. */
76 
77 static struct callout loadav_callout;
78 static struct callout schedcpu_callout;
79 static struct callout roundrobin_callout;
80 
81 struct loadavg averunnable =
82 	{ {0, 0, 0}, FSCALE };	/* load average, of runnable procs */
83 /*
84  * Constants for averages over 1, 5, and 15 minutes
85  * when sampling at 5 second intervals.
86  */
87 static fixpt_t cexp[3] = {
88 	0.9200444146293232 * FSCALE,	/* exp(-1/12) */
89 	0.9834714538216174 * FSCALE,	/* exp(-1/60) */
90 	0.9944598480048967 * FSCALE,	/* exp(-1/180) */
91 };
92 
93 static void	endtsleep __P((void *));
94 static void	loadav __P((void *arg));
95 static void	roundrobin __P((void *arg));
96 static void	schedcpu __P((void *arg));
97 
98 static int
99 sysctl_kern_quantum(SYSCTL_HANDLER_ARGS)
100 {
101 	int error, new_val;
102 
103 	new_val = sched_quantum * tick;
104 	error = sysctl_handle_int(oidp, &new_val, 0, req);
105         if (error != 0 || req->newptr == NULL)
106 		return (error);
107 	if (new_val < tick)
108 		return (EINVAL);
109 	sched_quantum = new_val / tick;
110 	hogticks = 2 * sched_quantum;
111 	return (0);
112 }
113 
114 SYSCTL_PROC(_kern, OID_AUTO, quantum, CTLTYPE_INT|CTLFLAG_RW,
115 	0, sizeof sched_quantum, sysctl_kern_quantum, "I",
116 	"Roundrobin scheduling quantum in microseconds");
117 
118 /*
119  * Arrange to reschedule if necessary, taking the priorities and
120  * schedulers into account.
121  */
122 void
123 maybe_resched(kg)
124 	struct ksegrp *kg;
125 {
126 
127 	mtx_assert(&sched_lock, MA_OWNED);
128 	if (kg->kg_pri.pri_level < curthread->td_ksegrp->kg_pri.pri_level)
129 		curthread->td_kse->ke_flags |= KEF_NEEDRESCHED;
130 }
131 
132 int
133 roundrobin_interval(void)
134 {
135 	return (sched_quantum);
136 }
137 
138 /*
139  * Force switch among equal priority processes every 100ms.
140  * We don't actually need to force a context switch of the current process.
141  * The act of firing the event triggers a context switch to softclock() and
142  * then switching back out again which is equivalent to a preemption, thus
143  * no further work is needed on the local CPU.
144  */
145 /* ARGSUSED */
146 static void
147 roundrobin(arg)
148 	void *arg;
149 {
150 
151 #ifdef SMP
152 	mtx_lock_spin(&sched_lock);
153 	forward_roundrobin();
154 	mtx_unlock_spin(&sched_lock);
155 #endif
156 
157 	callout_reset(&roundrobin_callout, sched_quantum, roundrobin, NULL);
158 }
159 
160 /*
161  * Constants for digital decay and forget:
162  *	90% of (p_estcpu) usage in 5 * loadav time
163  *	95% of (p_pctcpu) usage in 60 seconds (load insensitive)
164  *          Note that, as ps(1) mentions, this can let percentages
165  *          total over 100% (I've seen 137.9% for 3 processes).
166  *
167  * Note that schedclock() updates p_estcpu and p_cpticks asynchronously.
168  *
169  * We wish to decay away 90% of p_estcpu in (5 * loadavg) seconds.
170  * That is, the system wants to compute a value of decay such
171  * that the following for loop:
172  * 	for (i = 0; i < (5 * loadavg); i++)
173  * 		p_estcpu *= decay;
174  * will compute
175  * 	p_estcpu *= 0.1;
176  * for all values of loadavg:
177  *
178  * Mathematically this loop can be expressed by saying:
179  * 	decay ** (5 * loadavg) ~= .1
180  *
181  * The system computes decay as:
182  * 	decay = (2 * loadavg) / (2 * loadavg + 1)
183  *
184  * We wish to prove that the system's computation of decay
185  * will always fulfill the equation:
186  * 	decay ** (5 * loadavg) ~= .1
187  *
188  * If we compute b as:
189  * 	b = 2 * loadavg
190  * then
191  * 	decay = b / (b + 1)
192  *
193  * We now need to prove two things:
194  *	1) Given factor ** (5 * loadavg) ~= .1, prove factor == b/(b+1)
195  *	2) Given b/(b+1) ** power ~= .1, prove power == (5 * loadavg)
196  *
197  * Facts:
198  *         For x close to zero, exp(x) =~ 1 + x, since
199  *              exp(x) = 0! + x**1/1! + x**2/2! + ... .
200  *              therefore exp(-1/b) =~ 1 - (1/b) = (b-1)/b.
201  *         For x close to zero, ln(1+x) =~ x, since
202  *              ln(1+x) = x - x**2/2 + x**3/3 - ...     -1 < x < 1
203  *              therefore ln(b/(b+1)) = ln(1 - 1/(b+1)) =~ -1/(b+1).
204  *         ln(.1) =~ -2.30
205  *
206  * Proof of (1):
207  *    Solve (factor)**(power) =~ .1 given power (5*loadav):
208  *	solving for factor,
209  *      ln(factor) =~ (-2.30/5*loadav), or
210  *      factor =~ exp(-1/((5/2.30)*loadav)) =~ exp(-1/(2*loadav)) =
211  *          exp(-1/b) =~ (b-1)/b =~ b/(b+1).                    QED
212  *
213  * Proof of (2):
214  *    Solve (factor)**(power) =~ .1 given factor == (b/(b+1)):
215  *	solving for power,
216  *      power*ln(b/(b+1)) =~ -2.30, or
217  *      power =~ 2.3 * (b + 1) = 4.6*loadav + 2.3 =~ 5*loadav.  QED
218  *
219  * Actual power values for the implemented algorithm are as follows:
220  *      loadav: 1       2       3       4
221  *      power:  5.68    10.32   14.94   19.55
222  */
223 
224 /* calculations for digital decay to forget 90% of usage in 5*loadav sec */
225 #define	loadfactor(loadav)	(2 * (loadav))
226 #define	decay_cpu(loadfac, cpu)	(((loadfac) * (cpu)) / ((loadfac) + FSCALE))
227 
228 /* decay 95% of `p_pctcpu' in 60 seconds; see CCPU_SHIFT before changing */
229 static fixpt_t	ccpu = 0.95122942450071400909 * FSCALE;	/* exp(-1/20) */
230 SYSCTL_INT(_kern, OID_AUTO, ccpu, CTLFLAG_RD, &ccpu, 0, "");
231 
232 /* kernel uses `FSCALE', userland (SHOULD) use kern.fscale */
233 static int	fscale __unused = FSCALE;
234 SYSCTL_INT(_kern, OID_AUTO, fscale, CTLFLAG_RD, 0, FSCALE, "");
235 
236 /*
237  * If `ccpu' is not equal to `exp(-1/20)' and you still want to use the
238  * faster/more-accurate formula, you'll have to estimate CCPU_SHIFT below
239  * and possibly adjust FSHIFT in "param.h" so that (FSHIFT >= CCPU_SHIFT).
240  *
241  * To estimate CCPU_SHIFT for exp(-1/20), the following formula was used:
242  *	1 - exp(-1/20) ~= 0.0487 ~= 0.0488 == 1 (fixed pt, *11* bits).
243  *
244  * If you don't want to bother with the faster/more-accurate formula, you
245  * can set CCPU_SHIFT to (FSHIFT + 1) which will use a slower/less-accurate
246  * (more general) method of calculating the %age of CPU used by a process.
247  */
248 #define	CCPU_SHIFT	11
249 
250 /*
251  * Recompute process priorities, every hz ticks.
252  * MP-safe, called without the Giant mutex.
253  */
254 /* ARGSUSED */
255 static void
256 schedcpu(arg)
257 	void *arg;
258 {
259 	register fixpt_t loadfac = loadfactor(averunnable.ldavg[0]);
260 	register struct proc *p;
261 	register struct kse *ke;
262 	register struct ksegrp *kg;
263 	register int realstathz;
264 	int awake;
265 
266 	realstathz = stathz ? stathz : hz;
267 	sx_slock(&allproc_lock);
268 	FOREACH_PROC_IN_SYSTEM(p) {
269 		mtx_lock_spin(&sched_lock);
270 		p->p_swtime++;
271 		FOREACH_KSEGRP_IN_PROC(p, kg) {
272 			awake = 0;
273 			FOREACH_KSE_IN_GROUP(kg, ke) {
274 				/*
275 				 * Increment time in/out of memory and sleep
276 				 * time (if sleeping).  We ignore overflow;
277 				 * with 16-bit int's (remember them?)
278 				 * overflow takes 45 days.
279 				 */
280 				/* XXXKSE */
281 			/*	if ((ke->ke_flags & KEF_ONRUNQ) == 0) */
282 				if (p->p_stat == SSLEEP || p->p_stat == SSTOP) {
283 					ke->ke_slptime++;
284 				} else {
285 					ke->ke_slptime = 0;
286 					awake = 1;
287 				}
288 
289 				/*
290 				 * pctcpu is only for ps?
291 				 * Do it per kse.. and add them up at the end?
292 				 * XXXKSE
293 				 */
294 				ke->ke_pctcpu = (ke->ke_pctcpu * ccpu) >> FSHIFT;
295 				/*
296 				 * If the kse has been idle the entire second,
297 				 * stop recalculating its priority until
298 				 * it wakes up.
299 				 */
300 				if (ke->ke_slptime > 1) {
301 					continue;
302 				}
303 
304 #if	(FSHIFT >= CCPU_SHIFT)
305 				ke->ke_pctcpu += (realstathz == 100) ?
306 				    ((fixpt_t) ke->ke_cpticks) <<
307 				    (FSHIFT - CCPU_SHIFT) :
308 				    100 * (((fixpt_t) ke->ke_cpticks) <<
309 				    (FSHIFT - CCPU_SHIFT)) / realstathz;
310 #else
311 				ke->ke_pctcpu += ((FSCALE - ccpu) *
312 				    (ke->ke_cpticks * FSCALE / realstathz)) >>
313 				    FSHIFT;
314 #endif
315 				ke->ke_cpticks = 0;
316 			} /* end of kse loop */
317 			if (awake == 0) {
318 				kg->kg_slptime++;
319 			} else {
320 				kg->kg_slptime = 0;
321 			}
322 			kg->kg_estcpu = decay_cpu(loadfac, kg->kg_estcpu);
323 		      	resetpriority(kg);
324 		      	if (kg->kg_pri.pri_level >= PUSER &&
325 			    (p->p_sflag & PS_INMEM)) {
326 				int changedqueue =
327 				    ((kg->kg_pri.pri_level / RQ_PPQ) !=
328 				     (kg->kg_pri.pri_user / RQ_PPQ));
329 
330 				kg->kg_pri.pri_level = kg->kg_pri.pri_user;
331 				FOREACH_KSE_IN_GROUP(kg, ke) {
332 					if ((ke->ke_oncpu == NOCPU) && 	/* idle */
333 					    (p->p_stat == SRUN) && /* XXXKSE */
334 					    changedqueue) {
335 						remrunqueue(ke->ke_thread);
336 						setrunqueue(ke->ke_thread);
337 					}
338 				}
339 			}
340 		} /* end of ksegrp loop */
341 		mtx_unlock_spin(&sched_lock);
342 	} /* end of process loop */
343 	sx_sunlock(&allproc_lock);
344 	wakeup((caddr_t)&lbolt);
345 	callout_reset(&schedcpu_callout, hz, schedcpu, NULL);
346 }
347 
348 /*
349  * Recalculate the priority of a process after it has slept for a while.
350  * For all load averages >= 1 and max p_estcpu of 255, sleeping for at
351  * least six times the loadfactor will decay p_estcpu to zero.
352  */
353 void
354 updatepri(td)
355 	register struct thread *td;
356 {
357 	register struct ksegrp *kg;
358 	register unsigned int newcpu;
359 	register fixpt_t loadfac = loadfactor(averunnable.ldavg[0]);
360 
361 	if (td == NULL)
362 		return;
363 	kg = td->td_ksegrp;
364 	newcpu = kg->kg_estcpu;
365 	if (kg->kg_slptime > 5 * loadfac)
366 		kg->kg_estcpu = 0;
367 	else {
368 		kg->kg_slptime--;	/* the first time was done in schedcpu */
369 		while (newcpu && --kg->kg_slptime)
370 			newcpu = decay_cpu(loadfac, newcpu);
371 		kg->kg_estcpu = newcpu;
372 	}
373 	resetpriority(td->td_ksegrp);
374 }
375 
376 /*
377  * We're only looking at 7 bits of the address; everything is
378  * aligned to 4, lots of things are aligned to greater powers
379  * of 2.  Shift right by 8, i.e. drop the bottom 256 worth.
380  */
381 #define TABLESIZE	128
382 static TAILQ_HEAD(slpquehead, thread) slpque[TABLESIZE];
383 #define LOOKUP(x)	(((intptr_t)(x) >> 8) & (TABLESIZE - 1))
384 
385 void
386 sleepinit(void)
387 {
388 	int i;
389 
390 	sched_quantum = hz/10;
391 	hogticks = 2 * sched_quantum;
392 	for (i = 0; i < TABLESIZE; i++)
393 		TAILQ_INIT(&slpque[i]);
394 }
395 
396 /*
397  * General sleep call.  Suspends the current process until a wakeup is
398  * performed on the specified identifier.  The process will then be made
399  * runnable with the specified priority.  Sleeps at most timo/hz seconds
400  * (0 means no timeout).  If pri includes PCATCH flag, signals are checked
401  * before and after sleeping, else signals are not checked.  Returns 0 if
402  * awakened, EWOULDBLOCK if the timeout expires.  If PCATCH is set and a
403  * signal needs to be delivered, ERESTART is returned if the current system
404  * call should be restarted if possible, and EINTR is returned if the system
405  * call should be interrupted by the signal (return EINTR).
406  *
407  * The mutex argument is exited before the caller is suspended, and
408  * entered before msleep returns.  If priority includes the PDROP
409  * flag the mutex is not entered before returning.
410  */
411 int
412 msleep(ident, mtx, priority, wmesg, timo)
413 	void *ident;
414 	struct mtx *mtx;
415 	int priority, timo;
416 	const char *wmesg;
417 {
418 	struct proc *p = curproc;
419 	struct thread *td = curthread;
420 	int sig, catch = priority & PCATCH;
421 	int rval = 0;
422 	WITNESS_SAVE_DECL(mtx);
423 
424 #ifdef KTRACE
425 	if (p && KTRPOINT(p, KTR_CSW))
426 		ktrcsw(p->p_tracep, 1, 0);
427 #endif
428 	WITNESS_SLEEP(0, &mtx->mtx_object);
429 	KASSERT(timo != 0 || mtx_owned(&Giant) || mtx != NULL,
430 	    ("sleeping without a mutex"));
431 	mtx_lock_spin(&sched_lock);
432 	if (cold || panicstr) {
433 		/*
434 		 * After a panic, or during autoconfiguration,
435 		 * just give interrupts a chance, then just return;
436 		 * don't run any other procs or panic below,
437 		 * in case this is the idle process and already asleep.
438 		 */
439 		if (mtx != NULL && priority & PDROP)
440 			mtx_unlock(mtx);
441 		mtx_unlock_spin(&sched_lock);
442 		return (0);
443 	}
444 
445 	DROP_GIANT();
446 
447 	if (mtx != NULL) {
448 		mtx_assert(mtx, MA_OWNED | MA_NOTRECURSED);
449 		WITNESS_SAVE(&mtx->mtx_object, mtx);
450 		mtx_unlock(mtx);
451 		if (priority & PDROP)
452 			mtx = NULL;
453 	}
454 
455 	KASSERT(p != NULL, ("msleep1"));
456 	KASSERT(ident != NULL && td->td_proc->p_stat == SRUN, ("msleep"));
457 
458 	td->td_wchan = ident;
459 	td->td_wmesg = wmesg;
460 	td->td_kse->ke_slptime = 0;	/* XXXKSE */
461 	td->td_ksegrp->kg_slptime = 0;
462 	td->td_ksegrp->kg_pri.pri_level = priority & PRIMASK;
463 	CTR5(KTR_PROC, "msleep: thread %p (pid %d, %s) on %s (%p)",
464 	    td, p->p_pid, p->p_comm, wmesg, ident);
465 	TAILQ_INSERT_TAIL(&slpque[LOOKUP(ident)], td, td_slpq);
466 	if (timo)
467 		callout_reset(&td->td_slpcallout, timo, endtsleep, td);
468 	/*
469 	 * We put ourselves on the sleep queue and start our timeout
470 	 * before calling CURSIG, as we could stop there, and a wakeup
471 	 * or a SIGCONT (or both) could occur while we were stopped.
472 	 * A SIGCONT would cause us to be marked as SSLEEP
473 	 * without resuming us, thus we must be ready for sleep
474 	 * when CURSIG is called.  If the wakeup happens while we're
475 	 * stopped, td->td_wchan will be 0 upon return from CURSIG.
476 	 */
477 	if (catch) {
478 		CTR3(KTR_PROC, "msleep caught: proc %p (pid %d, %s)", p,
479 		    p->p_pid, p->p_comm);
480 		td->td_flags |= TDF_SINTR;
481 		mtx_unlock_spin(&sched_lock);
482 		PROC_LOCK(p);
483 		sig = CURSIG(p);
484 		mtx_lock_spin(&sched_lock);
485 		PROC_UNLOCK(p);
486 		if (sig != 0) {
487 			if (td->td_wchan != NULL)
488 				unsleep(td);
489 		} else if (td->td_wchan == NULL)
490 			catch = 0;
491 	} else
492 		sig = 0;
493 	if (td->td_wchan != NULL) {
494 		td->td_proc->p_stat = SSLEEP;
495 		p->p_stats->p_ru.ru_nvcsw++;
496 		mi_switch();
497 	}
498 	CTR3(KTR_PROC, "msleep resume: proc %p (pid %d, %s)", td, p->p_pid,
499 	    p->p_comm);
500 	KASSERT(td->td_proc->p_stat == SRUN, ("running but not SRUN"));
501 	td->td_flags &= ~TDF_SINTR;
502 	if (td->td_flags & TDF_TIMEOUT) {
503 		td->td_flags &= ~TDF_TIMEOUT;
504 		if (sig == 0)
505 			rval = EWOULDBLOCK;
506 	} else if (td->td_flags & TDF_TIMOFAIL)
507 		td->td_flags &= ~TDF_TIMOFAIL;
508 	else if (timo && callout_stop(&td->td_slpcallout) == 0) {
509 		/*
510 		 * This isn't supposed to be pretty.  If we are here, then
511 		 * the endtsleep() callout is currently executing on another
512 		 * CPU and is either spinning on the sched_lock or will be
513 		 * soon.  If we don't synchronize here, there is a chance
514 		 * that this process may msleep() again before the callout
515 		 * has a chance to run and the callout may end up waking up
516 		 * the wrong msleep().  Yuck.
517 		 */
518 		td->td_flags |= TDF_TIMEOUT;
519 		p->p_stats->p_ru.ru_nivcsw++;
520 		mi_switch();
521 	}
522 	mtx_unlock_spin(&sched_lock);
523 
524 	if (rval == 0 && catch) {
525 		PROC_LOCK(p);
526 		/* XXX: shouldn't we always be calling CURSIG() */
527 		if (sig != 0 || (sig = CURSIG(p))) {
528 			if (SIGISMEMBER(p->p_sigacts->ps_sigintr, sig))
529 				rval = EINTR;
530 			else
531 				rval = ERESTART;
532 		}
533 		PROC_UNLOCK(p);
534 	}
535 	PICKUP_GIANT();
536 #ifdef KTRACE
537 	mtx_lock(&Giant);
538 	if (KTRPOINT(p, KTR_CSW))
539 		ktrcsw(p->p_tracep, 0, 0);
540 	mtx_unlock(&Giant);
541 #endif
542 	if (mtx != NULL) {
543 		mtx_lock(mtx);
544 		WITNESS_RESTORE(&mtx->mtx_object, mtx);
545 	}
546 	return (rval);
547 }
548 
549 /*
550  * Implement timeout for msleep()
551  *
552  * If process hasn't been awakened (wchan non-zero),
553  * set timeout flag and undo the sleep.  If proc
554  * is stopped, just unsleep so it will remain stopped.
555  * MP-safe, called without the Giant mutex.
556  */
557 static void
558 endtsleep(arg)
559 	void *arg;
560 {
561 	register struct thread *td = arg;
562 
563 	CTR3(KTR_PROC, "endtsleep: thread %p (pid %d, %s)", td, td->td_proc->p_pid,
564 	    td->td_proc->p_comm);
565 	mtx_lock_spin(&sched_lock);
566 	/*
567 	 * This is the other half of the synchronization with msleep()
568 	 * described above.  If the PS_TIMEOUT flag is set, we lost the
569 	 * race and just need to put the process back on the runqueue.
570 	 */
571 	if ((td->td_flags & TDF_TIMEOUT) != 0) {
572 		td->td_flags &= ~TDF_TIMEOUT;
573 		setrunqueue(td);
574 	} else if (td->td_wchan != NULL) {
575 		if (td->td_proc->p_stat == SSLEEP)  /* XXXKSE */
576 			setrunnable(td);
577 		else
578 			unsleep(td);
579 		td->td_flags |= TDF_TIMEOUT;
580 	} else {
581 		td->td_flags |= TDF_TIMOFAIL;
582 	}
583 	mtx_unlock_spin(&sched_lock);
584 }
585 
586 /*
587  * Remove a process from its wait queue
588  */
589 void
590 unsleep(struct thread *td)
591 {
592 
593 	mtx_lock_spin(&sched_lock);
594 	if (td->td_wchan != NULL) {
595 		TAILQ_REMOVE(&slpque[LOOKUP(td->td_wchan)], td, td_slpq);
596 		td->td_wchan = NULL;
597 	}
598 	mtx_unlock_spin(&sched_lock);
599 }
600 
601 /*
602  * Make all processes sleeping on the specified identifier runnable.
603  */
604 void
605 wakeup(ident)
606 	register void *ident;
607 {
608 	register struct slpquehead *qp;
609 	register struct thread *td;
610 	struct proc *p;
611 
612 	mtx_lock_spin(&sched_lock);
613 	qp = &slpque[LOOKUP(ident)];
614 restart:
615 	TAILQ_FOREACH(td, qp, td_slpq) {
616 		p = td->td_proc;
617 		if (td->td_wchan == ident) {
618 			TAILQ_REMOVE(qp, td, td_slpq);
619 			td->td_wchan = NULL;
620 			if (td->td_proc->p_stat == SSLEEP) {
621 				/* OPTIMIZED EXPANSION OF setrunnable(p); */
622 				CTR3(KTR_PROC, "wakeup: thread %p (pid %d, %s)",
623 				    td, p->p_pid, p->p_comm);
624 				if (td->td_ksegrp->kg_slptime > 1)
625 					updatepri(td);
626 				td->td_ksegrp->kg_slptime = 0;
627 				td->td_kse->ke_slptime = 0;
628 				td->td_proc->p_stat = SRUN;
629 				if (p->p_sflag & PS_INMEM) {
630 					setrunqueue(td);
631 					maybe_resched(td->td_ksegrp);
632 				} else {
633 					p->p_sflag |= PS_SWAPINREQ;
634 					wakeup((caddr_t)&proc0);
635 				}
636 				/* END INLINE EXPANSION */
637 				goto restart;
638 			}
639 		}
640 	}
641 	mtx_unlock_spin(&sched_lock);
642 }
643 
644 /*
645  * Make a process sleeping on the specified identifier runnable.
646  * May wake more than one process if a target process is currently
647  * swapped out.
648  */
649 void
650 wakeup_one(ident)
651 	register void *ident;
652 {
653 	register struct slpquehead *qp;
654 	register struct thread *td;
655 	register struct proc *p;
656 
657 	mtx_lock_spin(&sched_lock);
658 	qp = &slpque[LOOKUP(ident)];
659 
660 	TAILQ_FOREACH(td, qp, td_slpq) {
661 		p = td->td_proc;
662 		if (td->td_wchan == ident) {
663 			TAILQ_REMOVE(qp, td, td_slpq);
664 			td->td_wchan = NULL;
665 			if (td->td_proc->p_stat == SSLEEP) {
666 				/* OPTIMIZED EXPANSION OF setrunnable(p); */
667 				CTR3(KTR_PROC, "wakeup1: proc %p (pid %d, %s)",
668 				    p, p->p_pid, p->p_comm);
669 				if (td->td_ksegrp->kg_slptime > 1)
670 					updatepri(td);
671 				td->td_ksegrp->kg_slptime = 0;
672 				td->td_kse->ke_slptime = 0;
673 				td->td_proc->p_stat = SRUN;
674 				if (p->p_sflag & PS_INMEM) {
675 					setrunqueue(td);
676 					maybe_resched(td->td_ksegrp);
677 					break;
678 				} else {
679 					p->p_sflag |= PS_SWAPINREQ;
680 					wakeup((caddr_t)&proc0);
681 				}
682 				/* END INLINE EXPANSION */
683 			}
684 		}
685 	}
686 	mtx_unlock_spin(&sched_lock);
687 }
688 
689 /*
690  * The machine independent parts of mi_switch().
691  */
692 void
693 mi_switch()
694 {
695 	struct timeval new_switchtime;
696 	struct thread *td = curthread;	/* XXX */
697 	register struct proc *p = td->td_proc;	/* XXX */
698 #if 0
699 	register struct rlimit *rlim;
700 #endif
701 	u_int sched_nest;
702 
703 	mtx_assert(&sched_lock, MA_OWNED | MA_NOTRECURSED);
704 #ifdef INVARIANTS
705 	if (p->p_stat != SMTX && p->p_stat != SRUN)
706 		mtx_assert(&Giant, MA_NOTOWNED);
707 #endif
708 
709 	/*
710 	 * Compute the amount of time during which the current
711 	 * process was running, and add that to its total so far.
712 	 */
713 	microuptime(&new_switchtime);
714 	if (timevalcmp(&new_switchtime, PCPU_PTR(switchtime), <)) {
715 #if 0
716 		/* XXX: This doesn't play well with sched_lock right now. */
717 		printf("microuptime() went backwards (%ld.%06ld -> %ld.%06ld)\n",
718 		    PCPU_GET(switchtime.tv_sec), PCPU_GET(switchtime.tv_usec),
719 		    new_switchtime.tv_sec, new_switchtime.tv_usec);
720 #endif
721 		new_switchtime = PCPU_GET(switchtime);
722 	} else {
723 		p->p_runtime += (new_switchtime.tv_usec - PCPU_GET(switchtime.tv_usec)) +
724 		    (new_switchtime.tv_sec - PCPU_GET(switchtime.tv_sec)) *
725 		    (int64_t)1000000;
726 	}
727 
728 #ifdef DDB
729 	/*
730 	 * Don't perform context switches from the debugger.
731 	 */
732 	if (db_active) {
733 		mtx_unlock_spin(&sched_lock);
734 		db_error("Context switches not allowed in the debugger.");
735 	}
736 #endif
737 
738 #if 0
739 	/*
740 	 * Check if the process exceeds its cpu resource allocation.
741 	 * If over max, kill it.
742 	 *
743 	 * XXX drop sched_lock, pickup Giant
744 	 */
745 	if (p->p_stat != SZOMB && p->p_limit->p_cpulimit != RLIM_INFINITY &&
746 	    p->p_runtime > p->p_limit->p_cpulimit) {
747 		rlim = &p->p_rlimit[RLIMIT_CPU];
748 		if (p->p_runtime / (rlim_t)1000000 >= rlim->rlim_max) {
749 			mtx_unlock_spin(&sched_lock);
750 			PROC_LOCK(p);
751 			killproc(p, "exceeded maximum CPU limit");
752 			mtx_lock_spin(&sched_lock);
753 			PROC_UNLOCK(p);
754 		} else {
755 			mtx_unlock_spin(&sched_lock);
756 			PROC_LOCK(p);
757 			psignal(p, SIGXCPU);
758 			mtx_lock_spin(&sched_lock);
759 			PROC_UNLOCK(p);
760 			if (rlim->rlim_cur < rlim->rlim_max) {
761 				/* XXX: we should make a private copy */
762 				rlim->rlim_cur += 5;
763 			}
764 		}
765 	}
766 #endif
767 
768 	/*
769 	 * Pick a new current process and record its start time.
770 	 */
771 	cnt.v_swtch++;
772 	PCPU_SET(switchtime, new_switchtime);
773 	CTR3(KTR_PROC, "mi_switch: old proc %p (pid %d, %s)", p, p->p_pid,
774 	    p->p_comm);
775 	sched_nest = sched_lock.mtx_recurse;
776 	td->td_lastcpu = td->td_kse->ke_oncpu;
777 	td->td_kse->ke_oncpu = NOCPU;
778 	td->td_kse->ke_flags &= ~KEF_NEEDRESCHED;
779 	cpu_switch();
780 	td->td_kse->ke_oncpu = PCPU_GET(cpuid);
781 	sched_lock.mtx_recurse = sched_nest;
782 	sched_lock.mtx_lock = (uintptr_t)td;
783 	CTR3(KTR_PROC, "mi_switch: new proc %p (pid %d, %s)", p, p->p_pid,
784 	    p->p_comm);
785 	if (PCPU_GET(switchtime.tv_sec) == 0)
786 		microuptime(PCPU_PTR(switchtime));
787 	PCPU_SET(switchticks, ticks);
788 }
789 
790 /*
791  * Change process state to be runnable,
792  * placing it on the run queue if it is in memory,
793  * and awakening the swapper if it isn't in memory.
794  */
795 void
796 setrunnable(struct thread *td)
797 {
798 	struct proc *p = td->td_proc;
799 
800 	mtx_lock_spin(&sched_lock);
801 	switch (p->p_stat) {
802 	case SZOMB: /* not a thread flag XXXKSE */
803 		panic("setrunnable(1)");
804 	}
805 	switch (td->td_proc->p_stat) {
806 	case 0:
807 	case SRUN:
808 	case SWAIT:
809 	default:
810 		panic("setrunnable(2)");
811 	case SSTOP:
812 	case SSLEEP:			/* e.g. when sending signals */
813 		if (td->td_flags & TDF_CVWAITQ)
814 			cv_waitq_remove(td);
815 		else
816 			unsleep(td);
817 		break;
818 
819 	case SIDL:
820 		break;
821 	}
822 	td->td_proc->p_stat = SRUN;
823 	if (td->td_ksegrp->kg_slptime > 1)
824 		updatepri(td);
825 	td->td_ksegrp->kg_slptime = 0;
826 	td->td_kse->ke_slptime = 0;
827 	if ((p->p_sflag & PS_INMEM) == 0) {
828 		p->p_sflag |= PS_SWAPINREQ;
829 		wakeup((caddr_t)&proc0);
830 	} else {
831 		setrunqueue(td);
832 		maybe_resched(td->td_ksegrp);
833 	}
834 	mtx_unlock_spin(&sched_lock);
835 }
836 
837 /*
838  * Compute the priority of a process when running in user mode.
839  * Arrange to reschedule if the resulting priority is better
840  * than that of the current process.
841  */
842 void
843 resetpriority(kg)
844 	register struct ksegrp *kg;
845 {
846 	register unsigned int newpriority;
847 
848 	mtx_lock_spin(&sched_lock);
849 	if (kg->kg_pri.pri_class == PRI_TIMESHARE) {
850 		newpriority = PUSER + kg->kg_estcpu / INVERSE_ESTCPU_WEIGHT +
851 		    NICE_WEIGHT * (kg->kg_nice - PRIO_MIN);
852 		newpriority = min(max(newpriority, PRI_MIN_TIMESHARE),
853 		    PRI_MAX_TIMESHARE);
854 		kg->kg_pri.pri_user = newpriority;
855 	}
856 	maybe_resched(kg);
857 	mtx_unlock_spin(&sched_lock);
858 }
859 
860 /*
861  * Compute a tenex style load average of a quantity on
862  * 1, 5 and 15 minute intervals.
863  * XXXKSE   Needs complete rewrite when correct info is available.
864  * Completely Bogus.. only works with 1:1 (but compiles ok now :-)
865  */
866 static void
867 loadav(void *arg)
868 {
869 	int i, nrun;
870 	struct loadavg *avg;
871 	struct proc *p;
872 	struct ksegrp *kg;
873 
874 	avg = &averunnable;
875 	sx_slock(&allproc_lock);
876 	nrun = 0;
877 	FOREACH_PROC_IN_SYSTEM(p) {
878 		FOREACH_KSEGRP_IN_PROC(p, kg) {
879 			switch (p->p_stat) {
880 			case SRUN:
881 				if ((p->p_flag & P_NOLOAD) != 0)
882 					goto nextproc;
883 				/* FALLTHROUGH */
884 			case SIDL:
885 				nrun++;
886 			}
887 nextproc:
888 		}
889 	}
890 	sx_sunlock(&allproc_lock);
891 	for (i = 0; i < 3; i++)
892 		avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
893 		    nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
894 
895 	/*
896 	 * Schedule the next update to occur after 5 seconds, but add a
897 	 * random variation to avoid synchronisation with processes that
898 	 * run at regular intervals.
899 	 */
900 	callout_reset(&loadav_callout, hz * 4 + (int)(random() % (hz * 2 + 1)),
901 	    loadav, NULL);
902 }
903 
904 /* ARGSUSED */
905 static void
906 sched_setup(dummy)
907 	void *dummy;
908 {
909 
910 	callout_init(&schedcpu_callout, 1);
911 	callout_init(&roundrobin_callout, 0);
912 	callout_init(&loadav_callout, 0);
913 
914 	/* Kick off timeout driven events by calling first time. */
915 	roundrobin(NULL);
916 	schedcpu(NULL);
917 	loadav(NULL);
918 }
919 
920 /*
921  * We adjust the priority of the current process.  The priority of
922  * a process gets worse as it accumulates CPU time.  The cpu usage
923  * estimator (p_estcpu) is increased here.  resetpriority() will
924  * compute a different priority each time p_estcpu increases by
925  * INVERSE_ESTCPU_WEIGHT
926  * (until MAXPRI is reached).  The cpu usage estimator ramps up
927  * quite quickly when the process is running (linearly), and decays
928  * away exponentially, at a rate which is proportionally slower when
929  * the system is busy.  The basic principle is that the system will
930  * 90% forget that the process used a lot of CPU time in 5 * loadav
931  * seconds.  This causes the system to favor processes which haven't
932  * run much recently, and to round-robin among other processes.
933  */
934 void
935 schedclock(td)
936 	struct thread *td;
937 {
938 	struct kse *ke = td->td_kse;
939 	struct ksegrp *kg = td->td_ksegrp;
940 
941 	if (td) {
942 		ke->ke_cpticks++;
943 		kg->kg_estcpu = ESTCPULIM(kg->kg_estcpu + 1);
944 		if ((kg->kg_estcpu % INVERSE_ESTCPU_WEIGHT) == 0) {
945 			resetpriority(td->td_ksegrp);
946 			if (kg->kg_pri.pri_level >= PUSER)
947 				kg->kg_pri.pri_level = kg->kg_pri.pri_user;
948 		}
949 	} else {
950 		panic("schedclock");
951 	}
952 }
953 
954 /*
955  * General purpose yield system call
956  */
957 int
958 yield(struct thread *td, struct yield_args *uap)
959 {
960 	struct ksegrp *kg = td->td_ksegrp;
961 
962 	mtx_assert(&Giant, MA_NOTOWNED);
963 	mtx_lock_spin(&sched_lock);
964 	kg->kg_pri.pri_level = PRI_MAX_TIMESHARE;
965 	setrunqueue(td);
966 	kg->kg_proc->p_stats->p_ru.ru_nvcsw++;
967 	mi_switch();
968 	mtx_unlock_spin(&sched_lock);
969 	td->td_retval[0] = 0;
970 
971 	return (0);
972 }
973 
974