1 /*        $NetBSD: sched.h,v 1.94 2023/09/06 12:29:14 riastradh Exp $ */
2 
3 /*-
4  * Copyright (c) 1999, 2000, 2001, 2002, 2007, 2008, 2019, 2020
5  *    The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Ross Harvey, Jason R. Thorpe, Nathan J. Williams, Andrew Doran and
10  * Daniel Sieger.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /*-
35  * Copyright (c) 1982, 1986, 1991, 1993
36  *        The Regents of the University of California.  All rights reserved.
37  * (c) UNIX System Laboratories, Inc.
38  * All or some portions of this file are derived from material licensed
39  * to the University of California by American Telephone and Telegraph
40  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
41  * the permission of UNIX System Laboratories, Inc.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. Neither the name of the University nor the names of its contributors
52  *    may be used to endorse or promote products derived from this software
53  *    without specific prior written permission.
54  *
55  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
56  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
57  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
58  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
59  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
60  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
61  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
62  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
63  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
64  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65  * SUCH DAMAGE.
66  *
67  *        @(#)kern_clock.c    8.5 (Berkeley) 1/21/94
68  */
69 
70 #ifndef   _SYS_SCHED_H_
71 #define   _SYS_SCHED_H_
72 
73 #include <sys/featuretest.h>
74 #include <sys/types.h>
75 
76 #if defined(_KERNEL_OPT)
77 #include "opt_multiprocessor.h"
78 #include "opt_lockdebug.h"
79 #endif
80 
81 struct sched_param {
82           int       sched_priority;
83 };
84 
85 /*
86  * Scheduling policies required by IEEE Std 1003.1-2001
87  */
88 #define   SCHED_NONE          -1
89 #define   SCHED_OTHER         0
90 #define   SCHED_FIFO          1
91 #define   SCHED_RR  2
92 
93 #if defined(_NETBSD_SOURCE)
94 __BEGIN_DECLS
95 
96 /*
97  * Interface of CPU-sets.
98  */
99 typedef struct _cpuset cpuset_t;
100 
101 #ifndef _KERNEL
102 
103 #define   cpuset_create()               _cpuset_create()
104 #define   cpuset_destroy(c)   _cpuset_destroy(c)
105 #define   cpuset_size(c)                _cpuset_size(c)
106 #define   cpuset_zero(c)                _cpuset_zero(c)
107 #define   cpuset_isset(i, c)  _cpuset_isset(i, c)
108 #define   cpuset_set(i, c)    _cpuset_set(i, c)
109 #define   cpuset_clr(i, c)    _cpuset_clr(i, c)
110 
111 cpuset_t *_cpuset_create(void);
112 void      _cpuset_destroy(cpuset_t *);
113 void      _cpuset_zero(cpuset_t *);
114 int       _cpuset_set(cpuid_t, cpuset_t *);
115 int       _cpuset_clr(cpuid_t, cpuset_t *);
116 int       _cpuset_isset(cpuid_t, const cpuset_t *);
117 size_t    _cpuset_size(const cpuset_t *);
118 
119 #endif
120 
121 /*
122  * Internal affinity and scheduling calls.
123  */
124 int       _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *);
125 int       _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *);
126 int       _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
127 int       _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
128 int       _sched_protect(int);
129 __END_DECLS
130 
131 /*
132  * CPU states.
133  * XXX Not really scheduler state, but no other good place to put
134  * it right now, and it really is per-CPU.
135  */
136 #define   CP_USER             0
137 #define   CP_NICE             1
138 #define   CP_SYS              2
139 #define   CP_INTR             3
140 #define   CP_IDLE             4
141 #define   CPUSTATES 5
142 
143 #if defined(_KERNEL) || defined(_KMEMUSER)
144 
145 #include <sys/time.h>
146 #include <sys/queue.h>
147 
148 struct kmutex;
149 
150 /*
151  * Per-CPU scheduler state.  Field markings and the corresponding locks:
152  *
153  * s:     splsched, may only be safely accessed by the CPU itself
154  * m:     spc_mutex
155  * (:     unlocked, stable
156  * c:     cpu_lock
157  */
158 struct schedstate_percpu {
159           struct kmutex       *spc_mutex;         /* (: lock on below, runnable LWPs */
160           struct kmutex       *spc_lwplock;       /* (: general purpose lock for LWPs */
161           struct lwp          *spc_migrating;     /* (: migrating LWP */
162           struct cpu_info *spc_nextpkg; /* (: next package 1st for RR */
163           psetid_t  spc_psid; /* c: processor-set ID */
164           time_t              spc_lastmod;        /* c: time of last cpu state change */
165           volatile int        spc_flags;          /* s: flags; see below */
166           u_int               spc_schedticks;     /* s: ticks for schedclock() */
167           uint64_t  spc_cp_time[CPUSTATES];/* s: CPU state statistics */
168           int                 spc_ticks;          /* s: ticks until sched_tick() */
169           int                 spc_pscnt;          /* s: prof/stat counter */
170           int                 spc_psdiv;          /* s: prof/stat divisor */
171           int                 spc_nextskim;       /* s: next time to skim other queues */
172           /* Run queue */
173           volatile pri_t      spc_curpriority;/* s: usrpri of curlwp */
174           pri_t               spc_maxpriority;/* m: highest priority queued */
175           u_int               spc_count;          /* m: count of the threads */
176           u_int               spc_mcount;         /* m: count of migratable threads */
177           uint32_t  spc_bitmap[8];      /* m: bitmap of active queues */
178           TAILQ_HEAD(,lwp) *spc_queue;  /* m: queue for each priority */
179 };
180 
181 /* spc_flags */
182 #define   SPCF_SEENRR                   0x0001    /* process has seen roundrobin() */
183 #define   SPCF_SHOULDYIELD    0x0002    /* process should yield the CPU */
184 #define   SPCF_OFFLINE                  0x0004    /* CPU marked offline */
185 #define   SPCF_RUNNING                  0x0008    /* CPU is running */
186 #define   SPCF_NOINTR                   0x0010    /* shielded from interrupts */
187 #define   SPCF_IDLE           0x0020    /* CPU is currently idle */
188 #define   SPCF_1STCLASS                 0x0040    /* first class scheduling entity */
189 #define   SPCF_CORE1ST                  0x0100    /* first CPU in core */
190 #define   SPCF_PACKAGE1ST               0x0200    /* first CPU in package */
191 
192 #define   SPCF_SWITCHCLEAR    (SPCF_SEENRR|SPCF_SHOULDYIELD)
193 
194 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */
195 
196 /*
197  * Flags passed to the Linux-compatible __clone(2) system call.
198  */
199 #define   CLONE_CSIGNAL                 0x000000ff          /* signal to be sent at exit */
200 #define   CLONE_VM            0x00000100          /* share address space */
201 #define   CLONE_FS            0x00000200          /* share "file system" info */
202 #define   CLONE_FILES                   0x00000400          /* share file descriptors */
203 #define   CLONE_SIGHAND                 0x00000800          /* share signal actions */
204 #define   CLONE_PTRACE                  0x00002000          /* ptrace(2) continues on
205                                                                child */
206 #define   CLONE_VFORK                   0x00004000          /* parent blocks until child
207                                                                exits */
208 
209 #endif /* _NETBSD_SOURCE */
210 
211 #ifdef _KERNEL
212 
213 extern int schedhz;                     /* ideally: 16 */
214 extern u_int sched_rrticks;
215 extern u_int sched_pstats_ticks;
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                synch_init(void);
227 void                sched_init(void);
228 void                sched_rqinit(void);
229 void                sched_cpuattach(struct cpu_info *);
230 
231 /* Time-driven events */
232 void                sched_tick(struct cpu_info *);
233 void                schedclock(struct lwp *);
234 void                sched_schedclock(struct lwp *);
235 void                sched_pstats(void);
236 void                sched_lwp_stats(struct lwp *);
237 void                sched_pstats_hook(struct lwp *, int);
238 
239 /* Runqueue-related functions */
240 bool                sched_curcpu_runnable_p(void);
241 void                sched_dequeue(struct lwp *);
242 void                sched_enqueue(struct lwp *);
243 void                sched_preempted(struct lwp *);
244 void                sched_resched_cpu(struct cpu_info *, pri_t, bool);
245 void                sched_resched_lwp(struct lwp *, bool);
246 struct lwp *        sched_nextlwp(void);
247 void                sched_oncpu(struct lwp *);
248 void                sched_newts(struct lwp *);
249 void                sched_vforkexec(struct lwp *, bool);
250 
251 /* Priority adjustment */
252 void                sched_nice(struct proc *, int);
253 
254 /* Handlers of fork and exit */
255 void                sched_proc_fork(struct proc *, struct proc *);
256 void                sched_proc_exit(struct proc *, struct proc *);
257 void                sched_lwp_fork(struct lwp *, struct lwp *);
258 void                sched_lwp_collect(struct lwp *);
259 
260 void                sched_slept(struct lwp *);
261 void                sched_wakeup(struct lwp *);
262 
263 void                setrunnable(struct lwp *);
264 void                sched_setrunnable(struct lwp *);
265 
266 struct cpu_info *sched_takecpu(struct lwp *);
267 void                sched_print_runqueue(void (*pr)(const char *, ...)
268     __printflike(1, 2));
269 
270 /* Dispatching */
271 bool                kpreempt(uintptr_t);
272 void                preempt(void);
273 bool                preempt_needed(void);
274 void                preempt_point(void);
275 void                yield(void);
276 void                mi_switch(struct lwp *);
277 void                updatertime(lwp_t *, const struct bintime *);
278 void                sched_idle(void);
279 void                suspendsched(void);
280 
281 int                 do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
282 int                 do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
283 
284 #endif    /* _KERNEL */
285 #endif    /* _SYS_SCHED_H_ */
286