1 /* $NetBSD: sched.h,v 1.72 2010/04/16 03:21:49 rmind 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 typedef struct _kcpuset kcpuset_t; /* XXX: lwp.h included from userland */ 100 101 #ifdef _KERNEL 102 103 kcpuset_t *kcpuset_create(void); 104 void kcpuset_destroy(kcpuset_t *); 105 void kcpuset_copy(kcpuset_t *, const kcpuset_t *); 106 void kcpuset_use(kcpuset_t *); 107 void kcpuset_unuse(kcpuset_t *, kcpuset_t **); 108 int kcpuset_copyin(const cpuset_t *, kcpuset_t *, size_t); 109 int kcpuset_copyout(const kcpuset_t *, cpuset_t *, size_t); 110 void kcpuset_zero(kcpuset_t *); 111 void kcpuset_fill(kcpuset_t *); 112 void kcpuset_set(cpuid_t, kcpuset_t *); 113 int kcpuset_isset(cpuid_t, const kcpuset_t *); 114 bool kcpuset_iszero(const kcpuset_t *); 115 bool kcpuset_match(const kcpuset_t *, const kcpuset_t *); 116 117 #else 118 119 #define cpuset_create() _cpuset_create() 120 #define cpuset_destroy(c) _cpuset_destroy(c) 121 #define cpuset_size(c) _cpuset_size(c) 122 #define cpuset_zero(c) _cpuset_zero(c) 123 #define cpuset_isset(i, c) _cpuset_isset(i, c) 124 #define cpuset_set(i, c) _cpuset_set(i, c) 125 #define cpuset_clr(i, c) _cpuset_clr(i, c) 126 127 cpuset_t *_cpuset_create(void); 128 void _cpuset_destroy(cpuset_t *); 129 void _cpuset_zero(cpuset_t *); 130 int _cpuset_set(cpuid_t, cpuset_t *); 131 int _cpuset_clr(cpuid_t, cpuset_t *); 132 int _cpuset_isset(cpuid_t, const cpuset_t *); 133 size_t _cpuset_size(const cpuset_t *); 134 135 #endif 136 137 /* 138 * Internal affinity and scheduling calls. 139 */ 140 int _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *); 141 int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *); 142 int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); 143 int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); 144 __END_DECLS 145 146 /* 147 * CPU states. 148 * XXX Not really scheduler state, but no other good place to put 149 * it right now, and it really is per-CPU. 150 */ 151 #define CP_USER 0 152 #define CP_NICE 1 153 #define CP_SYS 2 154 #define CP_INTR 3 155 #define CP_IDLE 4 156 #define CPUSTATES 5 157 158 #if defined(_KERNEL) || defined(_KMEMUSER) 159 160 #include <sys/mutex.h> 161 #include <sys/time.h> 162 163 /* 164 * Per-CPU scheduler state. Field markings and the corresponding locks: 165 * 166 * s: splsched, may only be safely accessed by the CPU itself 167 * m: spc_mutex 168 * (: unlocked, stable 169 * c: cpu_lock 170 */ 171 struct schedstate_percpu { 172 /* First set of data is likely to be accessed by other CPUs. */ 173 kmutex_t *spc_mutex; /* (: lock on below, runnable LWPs */ 174 kmutex_t *spc_lwplock; /* (: general purpose lock for LWPs */ 175 struct lwp *spc_migrating; /* (: migrating LWP */ 176 pri_t spc_curpriority;/* m: usrpri of curlwp */ 177 pri_t spc_maxpriority;/* m: highest priority queued */ 178 psetid_t spc_psid; /* c: processor-set ID */ 179 time_t spc_lastmod; /* c: time of last cpu state change */ 180 181 /* For the most part, this set of data is CPU-private. */ 182 void *spc_sched_info;/* (: scheduler-specific structure */ 183 volatile int spc_flags; /* s: flags; see below */ 184 u_int spc_schedticks; /* s: ticks for schedclock() */ 185 uint64_t spc_cp_time[CPUSTATES];/* s: CPU state statistics */ 186 int spc_ticks; /* s: ticks until sched_tick() */ 187 int spc_pscnt; /* s: prof/stat counter */ 188 int spc_psdiv; /* s: prof/stat divisor */ 189 }; 190 191 /* spc_flags */ 192 #define SPCF_SEENRR 0x0001 /* process has seen roundrobin() */ 193 #define SPCF_SHOULDYIELD 0x0002 /* process should yield the CPU */ 194 #define SPCF_OFFLINE 0x0004 /* CPU marked offline */ 195 #define SPCF_RUNNING 0x0008 /* CPU is running */ 196 #define SPCF_NOINTR 0x0010 /* shielded from interrupts */ 197 198 #define SPCF_SWITCHCLEAR (SPCF_SEENRR|SPCF_SHOULDYIELD) 199 200 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */ 201 202 /* 203 * Flags passed to the Linux-compatible __clone(2) system call. 204 */ 205 #define CLONE_CSIGNAL 0x000000ff /* signal to be sent at exit */ 206 #define CLONE_VM 0x00000100 /* share address space */ 207 #define CLONE_FS 0x00000200 /* share "file system" info */ 208 #define CLONE_FILES 0x00000400 /* share file descriptors */ 209 #define CLONE_SIGHAND 0x00000800 /* share signal actions */ 210 #define CLONE_PID 0x00001000 /* share process ID */ 211 #define CLONE_PTRACE 0x00002000 /* ptrace(2) continues on 212 child */ 213 #define CLONE_VFORK 0x00004000 /* parent blocks until child 214 exits */ 215 216 #endif /* _NETBSD_SOURCE */ 217 218 #ifdef _KERNEL 219 220 extern int schedhz; /* ideally: 16 */ 221 222 struct proc; 223 struct cpu_info; 224 225 /* 226 * Common Scheduler Interface. 227 */ 228 229 /* Scheduler initialization */ 230 void runq_init(void); 231 void synch_init(void); 232 void sched_init(void); 233 void sched_rqinit(void); 234 void sched_cpuattach(struct cpu_info *); 235 236 /* Time-driven events */ 237 void sched_tick(struct cpu_info *); 238 void schedclock(struct lwp *); 239 void sched_schedclock(struct lwp *); 240 void sched_pstats(void); 241 void sched_lwp_stats(struct lwp *); 242 void sched_pstats_hook(struct lwp *, int); 243 244 /* Runqueue-related functions */ 245 bool sched_curcpu_runnable_p(void); 246 void sched_dequeue(struct lwp *); 247 void sched_enqueue(struct lwp *, bool); 248 struct lwp * sched_nextlwp(void); 249 void sched_oncpu(struct lwp *); 250 void sched_newts(struct lwp *); 251 252 /* Priority adjustment */ 253 void sched_nice(struct proc *, int); 254 255 /* Handlers of fork and exit */ 256 void sched_proc_fork(struct proc *, struct proc *); 257 void sched_proc_exit(struct proc *, struct proc *); 258 void sched_lwp_fork(struct lwp *, struct lwp *); 259 void sched_lwp_collect(struct lwp *); 260 261 void sched_slept(struct lwp *); 262 void sched_wakeup(struct lwp *); 263 264 void setrunnable(struct lwp *); 265 void sched_setrunnable(struct lwp *); 266 267 struct cpu_info *sched_takecpu(struct lwp *); 268 void sched_print_runqueue(void (*pr)(const char *, ...)); 269 270 /* Dispatching */ 271 bool kpreempt(uintptr_t); 272 void preempt(void); 273 void yield(void); 274 int mi_switch(struct lwp *); 275 void updatertime(lwp_t *, const struct bintime *); 276 void sched_idle(void); 277 void suspendsched(void); 278 279 int do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); 280 int do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); 281 282 #endif /* _KERNEL */ 283 #endif /* _SYS_SCHED_H_ */ 284