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
80struct 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 */
98typedef 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
110cpuset_t *_cpuset_create(void);
111void _cpuset_destroy(cpuset_t *);
112void _cpuset_zero(cpuset_t *);
113int _cpuset_set(cpuid_t, cpuset_t *);
114int _cpuset_clr(cpuid_t, cpuset_t *);
115int _cpuset_isset(cpuid_t, const cpuset_t *);
116size_t _cpuset_size(const cpuset_t *);
117
118#endif
119
120/*
121 * Internal affinity and scheduling calls.
122 */
123int _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *);
124int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *);
125int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
126int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
127int _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 */
155struct 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
204extern int schedhz; /* ideally: 16 */
205
206struct proc;
207struct cpu_info;
208
209/*
210 * Common Scheduler Interface.
211 */
212
213/* Scheduler initialization */
214void runq_init(void);
215void synch_init(void);
216void sched_init(void);
217void sched_rqinit(void);
218void sched_cpuattach(struct cpu_info *);
219
220/* Time-driven events */
221void sched_tick(struct cpu_info *);
222void schedclock(struct lwp *);
223void sched_schedclock(struct lwp *);
224void sched_pstats(void);
225void sched_lwp_stats(struct lwp *);
226void sched_pstats_hook(struct lwp *, int);
227
228/* Runqueue-related functions */
229bool sched_curcpu_runnable_p(void);
230void sched_dequeue(struct lwp *);
231void sched_enqueue(struct lwp *, bool);
232struct lwp * sched_nextlwp(void);
233void sched_oncpu(struct lwp *);
234void sched_newts(struct lwp *);
235
236/* Priority adjustment */
237void sched_nice(struct proc *, int);
238
239/* Handlers of fork and exit */
240void sched_proc_fork(struct proc *, struct proc *);
241void sched_proc_exit(struct proc *, struct proc *);
242void sched_lwp_fork(struct lwp *, struct lwp *);
243void sched_lwp_collect(struct lwp *);
244
245void sched_slept(struct lwp *);
246void sched_wakeup(struct lwp *);
247
248void setrunnable(struct lwp *);
249void sched_setrunnable(struct lwp *);
250
251struct cpu_info *sched_takecpu(struct lwp *);
252void sched_print_runqueue(void (*pr)(const char *, ...)
253 __printflike(1, 2));
254
255/* Dispatching */
256bool kpreempt(uintptr_t);
257void preempt(void);
258void yield(void);
259int mi_switch(struct lwp *);
260void updatertime(lwp_t *, const struct bintime *);
261void sched_idle(void);
262void suspendsched(void);
263
264int do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
265int do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
266
267#endif /* _KERNEL */
268#endif /* _SYS_SCHED_H_ */
269