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