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