xref: /netbsd/sys/sys/sched.h (revision 6550d01e)
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