1 /* $NetBSD: sched.h,v 1.76 2016/07/03 14:24:59 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 1999, 2000, 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Ross Harvey, Jason R. Thorpe, Nathan J. Williams, Andrew Doran and 9 * Daniel Sieger. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /*- 34 * Copyright (c) 1982, 1986, 1991, 1993 35 * The Regents of the University of California. All rights reserved. 36 * (c) UNIX System Laboratories, Inc. 37 * All or some portions of this file are derived from material licensed 38 * to the University of California by American Telephone and Telegraph 39 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 40 * the permission of UNIX System Laboratories, Inc. 41 * 42 * Redistribution and use in source and binary forms, with or without 43 * modification, are permitted provided that the following conditions 44 * are met: 45 * 1. Redistributions of source code must retain the above copyright 46 * notice, this list of conditions and the following disclaimer. 47 * 2. Redistributions in binary form must reproduce the above copyright 48 * notice, this list of conditions and the following disclaimer in the 49 * documentation and/or other materials provided with the distribution. 50 * 3. Neither the name of the University nor the names of its contributors 51 * may be used to endorse or promote products derived from this software 52 * without specific prior written permission. 53 * 54 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 57 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 64 * SUCH DAMAGE. 65 * 66 * @(#)kern_clock.c 8.5 (Berkeley) 1/21/94 67 */ 68 69 #ifndef _SYS_SCHED_H_ 70 #define _SYS_SCHED_H_ 71 72 #include <sys/featuretest.h> 73 #include <sys/types.h> 74 75 #if defined(_KERNEL_OPT) 76 #include "opt_multiprocessor.h" 77 #include "opt_lockdebug.h" 78 #endif 79 80 struct sched_param { 81 int sched_priority; 82 }; 83 84 /* 85 * Scheduling policies required by IEEE Std 1003.1-2001 86 */ 87 #define SCHED_NONE -1 88 #define SCHED_OTHER 0 89 #define SCHED_FIFO 1 90 #define SCHED_RR 2 91 92 #if defined(_NETBSD_SOURCE) 93 __BEGIN_DECLS 94 95 /* 96 * Interface of CPU-sets. 97 */ 98 typedef struct _cpuset cpuset_t; 99 100 #ifndef _KERNEL 101 102 #define cpuset_create() _cpuset_create() 103 #define cpuset_destroy(c) _cpuset_destroy(c) 104 #define cpuset_size(c) _cpuset_size(c) 105 #define cpuset_zero(c) _cpuset_zero(c) 106 #define cpuset_isset(i, c) _cpuset_isset(i, c) 107 #define cpuset_set(i, c) _cpuset_set(i, c) 108 #define cpuset_clr(i, c) _cpuset_clr(i, c) 109 110 cpuset_t *_cpuset_create(void); 111 void _cpuset_destroy(cpuset_t *); 112 void _cpuset_zero(cpuset_t *); 113 int _cpuset_set(cpuid_t, cpuset_t *); 114 int _cpuset_clr(cpuid_t, cpuset_t *); 115 int _cpuset_isset(cpuid_t, const cpuset_t *); 116 size_t _cpuset_size(const cpuset_t *); 117 118 #endif 119 120 /* 121 * Internal affinity and scheduling calls. 122 */ 123 int _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *); 124 int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *); 125 int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); 126 int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); 127 int _sched_protect(int); 128 __END_DECLS 129 130 /* 131 * CPU states. 132 * XXX Not really scheduler state, but no other good place to put 133 * it right now, and it really is per-CPU. 134 */ 135 #define CP_USER 0 136 #define CP_NICE 1 137 #define CP_SYS 2 138 #define CP_INTR 3 139 #define CP_IDLE 4 140 #define CPUSTATES 5 141 142 #if defined(_KERNEL) || defined(_KMEMUSER) 143 144 #include <sys/mutex.h> 145 #include <sys/time.h> 146 147 /* 148 * Per-CPU scheduler state. Field markings and the corresponding locks: 149 * 150 * s: splsched, may only be safely accessed by the CPU itself 151 * m: spc_mutex 152 * (: unlocked, stable 153 * c: cpu_lock 154 */ 155 struct schedstate_percpu { 156 /* First set of data is likely to be accessed by other CPUs. */ 157 kmutex_t *spc_mutex; /* (: lock on below, runnable LWPs */ 158 kmutex_t *spc_lwplock; /* (: general purpose lock for LWPs */ 159 struct lwp *spc_migrating; /* (: migrating LWP */ 160 pri_t spc_curpriority;/* m: usrpri of curlwp */ 161 pri_t spc_maxpriority;/* m: highest priority queued */ 162 psetid_t spc_psid; /* c: processor-set ID */ 163 time_t spc_lastmod; /* c: time of last cpu state change */ 164 165 /* For the most part, this set of data is CPU-private. */ 166 void *spc_sched_info;/* (: scheduler-specific structure */ 167 volatile int spc_flags; /* s: flags; see below */ 168 u_int spc_schedticks; /* s: ticks for schedclock() */ 169 uint64_t spc_cp_time[CPUSTATES];/* s: CPU state statistics */ 170 int spc_ticks; /* s: ticks until sched_tick() */ 171 int spc_pscnt; /* s: prof/stat counter */ 172 int spc_psdiv; /* s: prof/stat divisor */ 173 }; 174 175 /* spc_flags */ 176 #define SPCF_SEENRR 0x0001 /* process has seen roundrobin() */ 177 #define SPCF_SHOULDYIELD 0x0002 /* process should yield the CPU */ 178 #define SPCF_OFFLINE 0x0004 /* CPU marked offline */ 179 #define SPCF_RUNNING 0x0008 /* CPU is running */ 180 #define SPCF_NOINTR 0x0010 /* shielded from interrupts */ 181 182 #define SPCF_SWITCHCLEAR (SPCF_SEENRR|SPCF_SHOULDYIELD) 183 184 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */ 185 186 /* 187 * Flags passed to the Linux-compatible __clone(2) system call. 188 */ 189 #define CLONE_CSIGNAL 0x000000ff /* signal to be sent at exit */ 190 #define CLONE_VM 0x00000100 /* share address space */ 191 #define CLONE_FS 0x00000200 /* share "file system" info */ 192 #define CLONE_FILES 0x00000400 /* share file descriptors */ 193 #define CLONE_SIGHAND 0x00000800 /* share signal actions */ 194 #define CLONE_PID 0x00001000 /* share process ID */ 195 #define CLONE_PTRACE 0x00002000 /* ptrace(2) continues on 196 child */ 197 #define CLONE_VFORK 0x00004000 /* parent blocks until child 198 exits */ 199 200 #endif /* _NETBSD_SOURCE */ 201 202 #ifdef _KERNEL 203 204 extern int schedhz; /* ideally: 16 */ 205 206 struct proc; 207 struct cpu_info; 208 209 /* 210 * Common Scheduler Interface. 211 */ 212 213 /* Scheduler initialization */ 214 void runq_init(void); 215 void synch_init(void); 216 void sched_init(void); 217 void sched_rqinit(void); 218 void sched_cpuattach(struct cpu_info *); 219 220 /* Time-driven events */ 221 void sched_tick(struct cpu_info *); 222 void schedclock(struct lwp *); 223 void sched_schedclock(struct lwp *); 224 void sched_pstats(void); 225 void sched_lwp_stats(struct lwp *); 226 void sched_pstats_hook(struct lwp *, int); 227 228 /* Runqueue-related functions */ 229 bool sched_curcpu_runnable_p(void); 230 void sched_dequeue(struct lwp *); 231 void sched_enqueue(struct lwp *, bool); 232 struct lwp * sched_nextlwp(void); 233 void sched_oncpu(struct lwp *); 234 void sched_newts(struct lwp *); 235 236 /* Priority adjustment */ 237 void sched_nice(struct proc *, int); 238 239 /* Handlers of fork and exit */ 240 void sched_proc_fork(struct proc *, struct proc *); 241 void sched_proc_exit(struct proc *, struct proc *); 242 void sched_lwp_fork(struct lwp *, struct lwp *); 243 void sched_lwp_collect(struct lwp *); 244 245 void sched_slept(struct lwp *); 246 void sched_wakeup(struct lwp *); 247 248 void setrunnable(struct lwp *); 249 void sched_setrunnable(struct lwp *); 250 251 struct cpu_info *sched_takecpu(struct lwp *); 252 void sched_print_runqueue(void (*pr)(const char *, ...) 253 __printflike(1, 2)); 254 255 /* Dispatching */ 256 bool kpreempt(uintptr_t); 257 void preempt(void); 258 void yield(void); 259 int mi_switch(struct lwp *); 260 void updatertime(lwp_t *, const struct bintime *); 261 void sched_idle(void); 262 void suspendsched(void); 263 264 int do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); 265 int do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); 266 267 #endif /* _KERNEL */ 268 #endif /* _SYS_SCHED_H_ */ 269