1*4b3129d5Sprlw1.\" $NetBSD: csf.9,v 1.9 2015/05/25 21:02:37 prlw1 Exp $ 24f02ad43Sdsieger.\" 34f02ad43Sdsieger.\" Copyright (c) 2002 The NetBSD Foundation, Inc. 44f02ad43Sdsieger.\" All rights reserved. 54f02ad43Sdsieger.\" 64f02ad43Sdsieger.\" This code is derived from software contributed to The NetBSD Foundation 74f02ad43Sdsieger.\" by Daniel Sieger. 84f02ad43Sdsieger.\" 94f02ad43Sdsieger.\" Redistribution and use in source and binary forms, with or without 104f02ad43Sdsieger.\" modification, are permitted provided that the following conditions 114f02ad43Sdsieger.\" are met: 124f02ad43Sdsieger.\" 1. Redistributions of source code must retain the above copyright 134f02ad43Sdsieger.\" notice, this list of conditions and the following disclaimer. 144f02ad43Sdsieger.\" 2. Redistributions in binary form must reproduce the above copyright 154f02ad43Sdsieger.\" notice, this list of conditions and the following disclaimer in the 164f02ad43Sdsieger.\" documentation and/or other materials provided with the distribution. 174f02ad43Sdsieger.\" 184f02ad43Sdsieger.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 194f02ad43Sdsieger.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 204f02ad43Sdsieger.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 214f02ad43Sdsieger.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 224f02ad43Sdsieger.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 234f02ad43Sdsieger.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 244f02ad43Sdsieger.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 254f02ad43Sdsieger.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 264f02ad43Sdsieger.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 274f02ad43Sdsieger.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 284f02ad43Sdsieger.\" POSSIBILITY OF SUCH DAMAGE. 294f02ad43Sdsieger.\" 3043a4fb99Schristos.Dd October 27, 2014 314f02ad43Sdsieger.Dt CSF 9 324f02ad43Sdsieger.Os 334f02ad43Sdsieger.Sh NAME 344f02ad43Sdsieger.Nm CSF 354f02ad43Sdsieger.Nd The 364f02ad43Sdsieger.Nx 374f02ad43Sdsiegercommon scheduler framework 384f02ad43Sdsieger.Sh SYNOPSIS 394f02ad43Sdsieger.In sys/sched.h 404f02ad43Sdsieger.Ft void 414f02ad43Sdsieger.Fn sched_rqinit "void" 424f02ad43Sdsieger.Ft void 434f02ad43Sdsieger.Fn sched_setup "void" 444f02ad43Sdsieger.Ft void 454f02ad43Sdsieger.Fn sched_cpuattach "struct cpu_info *" 464f02ad43Sdsieger.Ft void 474f02ad43Sdsieger.Fn sched_tick "struct cpu_info *" 484f02ad43Sdsieger.Ft void 494f02ad43Sdsieger.Fn sched_schedclock "lwp_t *" 504f02ad43Sdsieger.Ft bool 514f02ad43Sdsieger.Fn sched_curcpu_runnable_p "void" 524f02ad43Sdsieger.Ft lwp_t * 534f02ad43Sdsieger.Fn sched_nextlwp "void" 544f02ad43Sdsieger.Ft void 55c01b8826Swiz.Fn sched_enqueue "lwp_t *" "bool" 564f02ad43Sdsieger.Ft void 574f02ad43Sdsieger.Fn sched_dequeue "lwp_t *" 584f02ad43Sdsieger.Ft void 59c01b8826Swiz.Fn sched_nice "struct proc *" "int" 604f02ad43Sdsieger.Ft void 61c01b8826Swiz.Fn sched_proc_fork "struct proc *" "struct proc *" 624f02ad43Sdsieger.Ft void 63c01b8826Swiz.Fn sched_proc_exit "struct proc *" "struct proc *" 644f02ad43Sdsieger.Ft void 654f02ad43Sdsieger.Fn sched_lwp_fork "lwp_t *" 664f02ad43Sdsieger.Ft void 674f02ad43Sdsieger.Fn sched_lwp_exit "lwp_t *" 684f02ad43Sdsieger.Ft void 694f02ad43Sdsieger.Fn sched_setrunnable "lwp_t *" 704f02ad43Sdsieger.Ft void 714f02ad43Sdsieger.Fn sched_print_runqueue "void (*pr)(const char *, ...)" 724f02ad43Sdsieger.Ft void 73c01b8826Swiz.Fn sched_pstats_hook "struct proc *" "int" 744f02ad43Sdsieger.Ft void 754f02ad43Sdsieger.Fn sched_pstats "void *arg" 764f02ad43Sdsieger.Ft pri_t 774f02ad43Sdsieger.Fn sched_kpri "lwp_t *" 784f02ad43Sdsieger.Ft void 794f02ad43Sdsieger.Fn resched_cpu "lwp_t *" 804f02ad43Sdsieger.Ft void 814f02ad43Sdsieger.Fn setrunnable 824f02ad43Sdsieger.Ft void 834f02ad43Sdsieger.Fn schedclock "lwp_t *" 844f02ad43Sdsieger.Ft void 854f02ad43Sdsieger.Fn sched_init "void" 864f02ad43Sdsieger.Sh DESCRIPTION 87c01b8826Swiz.Nm 88c01b8826Swizprovides a modular and self-contained interface for 89c01b8826Swizimplementing different thread scheduling algorithms. 90c01b8826SwizThe different schedulers can be selected at compile-time. 91b9e73747SahokaCurrently, the schedulers available are 92eeeb9eddSdsieger.Xr sched_4bsd 9 , 93b9e73747Sahokathe traditional 4.4BSD thread scheduler, and 94b9e73747Sahoka.Xr sched_m2 9 95*4b3129d5Sprlw1which implements a SVR4/Solaris like approach. 964f02ad43Sdsieger.Pp 974f02ad43SdsiegerThe interface is divided into two parts: A set of functions each 984f02ad43Sdsiegerscheduler needs to implement and common functions used by all 994f02ad43Sdsiegerschedulers. 1004f02ad43Sdsieger.Sh Scheduler-specific functions 1014f02ad43SdsiegerThe following functions have to be implemented by the individual 1024f02ad43Sdsiegerscheduler. 1034f02ad43Sdsieger.Ss Scheduler initialization 1049c481508Sjoerg.Bl -tag -width compact 1054f02ad43Sdsieger.It Ft void Fn sched_cpuattach "struct cpu_info *" 1064f02ad43SdsiegerPer-CPU scheduler initialization routine. 1074f02ad43Sdsieger.It Ft void Fn sched_rqinit "void" 1084f02ad43SdsiegerInitialize the scheduler's runqueue data structures. 1094f02ad43Sdsieger.It Ft void Fn sched_setup "void" 1104f02ad43SdsiegerSetup initial scheduling parameters and kick off timeout driven 1114f02ad43Sdsiegerevents. 1124f02ad43Sdsieger.El 1134f02ad43Sdsieger.Ss Runqueue handling 114c01b8826SwizRunqueue handling is completely internal to the scheduler. 115c01b8826SwizOther parts of the kernel should access runqueues only through the 116c01b8826Swizfollowing functions: 1179c481508Sjoerg.Bl -tag -width compact 118c01b8826Swiz.It Ft void Fn sched_enqueue "lwp_t *" "bool" 1194f02ad43SdsiegerPlace an LWP within the scheduler's runqueue structures. 1204f02ad43Sdsieger.It Ft void Fn sched_dequeue "lwp_t *" 1214f02ad43SdsiegerRemove an LWP from the scheduler's runqueue structures. 1224f02ad43Sdsieger.It Ft lwp_t * Fn sched_nextlwp "void" 1234f02ad43SdsiegerReturn the LWP that should run the CPU next. 1244f02ad43Sdsieger.It Ft bool Fn sched_curcpu_runnable_p "void" 1254f02ad43SdsiegerIndicate if there is a runnable LWP for the current CPU. 1264f02ad43Sdsieger.It Ft void Fn sched_print_runqueue "void (*pr)(const char *, ...)" 1274f02ad43SdsiegerPrint runqueues in DDB. 1284f02ad43Sdsieger.El 1294f02ad43Sdsieger.Ss Core scheduler functions 1309c481508Sjoerg.Bl -tag -width compact 1314f02ad43Sdsieger.It Ft void Fn sched_tick "struct cpu_info *" 132c01b8826SwizPeriodically called from 133c01b8826Swiz.Xr hardclock 9 . 134c01b8826SwizDetermines if a reschedule is necessary, if the running LWP has 135c01b8826Swizused up its quantum. 1364f02ad43Sdsieger.It Ft void Fn sched_schedclock "lwp_t *" 1374f02ad43SdsiegerPeriodically called from 1384f02ad43Sdsieger.Fn schedclock 1394f02ad43Sdsiegerin order to handle priority adjustment. 1404f02ad43Sdsieger.El 1414f02ad43Sdsieger.Ss Priority adjustment 1429c481508Sjoerg.Bl -tag -width compact 14343a4fb99Schristos.It Ft void Fn sched_nice "struct proc *" "int" 1444f02ad43SdsiegerRecalculate the process priority according to its nice value. 1454f02ad43Sdsieger.El 1464f02ad43Sdsieger.Ss General helper functions 1479c481508Sjoerg.Bl -tag -width compact 148c01b8826Swiz.It Ft void Fn sched_proc_fork "struct proc *" "struct proc *" 1494f02ad43SdsiegerInherit the scheduling history of the parent process after 1504f02ad43Sdsieger.Fn fork . 151c01b8826Swiz.It Ft void Fn sched_proc_exit "struct proc *" "struct proc *" 1524f02ad43SdsiegerCharge back a processes parent for its resource usage. 1534f02ad43Sdsieger.It Ft void Fn sched_lwp_fork "lwp_t *" 1544f02ad43SdsiegerLWP-specific version of the above 1554f02ad43Sdsieger.It Ft void Fn sched_lwp_exit "lwp_t *" 1564f02ad43SdsiegerLWP-specific version of the above 1574f02ad43Sdsieger.It Ft void Fn sched_setrunnable "lwp_t *" 1584f02ad43SdsiegerScheduler-specific actions for 1594f02ad43Sdsieger.Fn setrunnable . 160c01b8826Swiz.It Ft void Fn sched_pstats_hook "struct proc *" "int" 1614f02ad43SdsiegerScheduler-specific actions for 1624f02ad43Sdsieger.Fn sched_pstats . 1634f02ad43Sdsieger.El 1644f02ad43Sdsieger.Sh Common scheduler functions 1659c481508Sjoerg.Bl -tag -width compact 1664f02ad43Sdsieger.It Ft pri_t Fn sched_kpri "lwp_t *" 1674f02ad43SdsiegerScale a priority level to a kernel priority level, usually for an LWP 1684f02ad43Sdsiegerthat is about to sleep. 1694f02ad43Sdsieger.It Ft void Fn sched_pstats "void *" 1704f02ad43SdsiegerUpdate process statistics and check CPU resource allocation. 1714f02ad43Sdsieger.It Ft inline void Fn resched_cpu "lwp_t *" 1724f02ad43SdsiegerArrange for a reschedule. 1734f02ad43Sdsieger.It Ft void Fn setrunnable "lwp_t *" 1744f02ad43SdsiegerChange process state to be runnable, placing it on a runqueue if it 1754f02ad43Sdsiegeris in memory, awakening the swapper otherwise. 1764f02ad43Sdsieger.It Ft void Fn schedclock "lwp_t *" 177c01b8826SwizScheduler clock. 178c01b8826SwizPeriodically called from 1794f02ad43Sdsieger.Fn statclock . 1804f02ad43Sdsieger.It Ft void Fn sched_init "void" 1814f02ad43SdsiegerInitialize callout for 1824f02ad43Sdsieger.Fn sched_pstats 1834f02ad43Sdsiegerand call 1844f02ad43Sdsieger.Fn sched_setup 1854f02ad43Sdsiegerto initialize any other scheduler-specific data. 1864f02ad43Sdsieger.El 1874f02ad43Sdsieger.Sh CODE REFERENCES 188c01b8826SwizThe 189c01b8826Swiz.Nm 190c01b8826Swizprogramming interface is defined within the file 1914f02ad43Sdsieger.Pa sys/sys/sched.h . 1924f02ad43Sdsieger.Pp 1934f02ad43SdsiegerFunctions common to all scheduler implementations are in 194c01b8826Swiz.Pa sys/kern/kern_synch.c . 1954f02ad43Sdsieger.Pp 1964f02ad43SdsiegerThe traditional 4.4BSD scheduler is implemented in 197c01b8826Swiz.Pa sys/kern/sched_4bsd.c . 198b9e73747Sahoka.Pp 199b9e73747SahokaThe M2 scheduler is implemented in 200b9e73747Sahoka.Pa sys/kern/sched_m2.c . 2014f02ad43Sdsieger.Sh SEE ALSO 202eeeb9eddSdsieger.Xr mi_switch 9 , 203c01b8826Swiz.Xr preempt 9 , 204b9e73747Sahoka.Xr sched_4bsd 9 , 205b9e73747Sahoka.Xr sched_m2 9 2064f02ad43Sdsieger.Sh HISTORY 2074f02ad43SdsiegerThe 2084f02ad43Sdsieger.Nm 2094f02ad43Sdsiegerappeared in 2104f02ad43Sdsieger.Nx 5.0 . 2114f02ad43Sdsieger.Sh AUTHORS 2124f02ad43SdsiegerThe 2134f02ad43Sdsieger.Nm 2144f02ad43Sdsiegerwas written by 2154f02ad43Sdsieger.An Daniel Sieger 2164f02ad43Sdsieger.Aq dsieger@NetBSD.org . 217