master
  1/*	$NetBSD: sched.h,v 1.91.2.1 2023/08/09 17:42:01 martin 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
 81struct 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 */
 99typedef 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
111cpuset_t *_cpuset_create(void);
112void	_cpuset_destroy(cpuset_t *);
113void	_cpuset_zero(cpuset_t *);
114int	_cpuset_set(cpuid_t, cpuset_t *);
115int	_cpuset_clr(cpuid_t, cpuset_t *);
116int	_cpuset_isset(cpuid_t, const cpuset_t *);
117size_t	_cpuset_size(const cpuset_t *);
118
119#endif
120
121/*
122 * Internal affinity and scheduling calls.
123 */
124int	_sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *);
125int	_sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *);
126int	_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
127int	_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
128int	_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
148struct 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 */
158struct 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
213extern int schedhz;			/* ideally: 16 */
214extern u_int sched_rrticks;
215extern u_int sched_pstats_ticks;
216
217struct proc;
218struct cpu_info;
219
220/*
221 * Common Scheduler Interface.
222 */
223
224/* Scheduler initialization */
225void		runq_init(void);
226void		synch_init(void);
227void		sched_init(void);
228void		sched_rqinit(void);
229void		sched_cpuattach(struct cpu_info *);
230
231/* Time-driven events */
232void		sched_tick(struct cpu_info *);
233void		schedclock(struct lwp *);
234void		sched_schedclock(struct lwp *);
235void		sched_pstats(void);
236void		sched_lwp_stats(struct lwp *);
237void		sched_pstats_hook(struct lwp *, int);
238
239/* Runqueue-related functions */
240bool		sched_curcpu_runnable_p(void);
241void		sched_dequeue(struct lwp *);
242void		sched_enqueue(struct lwp *);
243void		sched_preempted(struct lwp *);
244void		sched_resched_cpu(struct cpu_info *, pri_t, bool);
245void		sched_resched_lwp(struct lwp *, bool);
246struct lwp *	sched_nextlwp(void);
247void		sched_oncpu(struct lwp *);
248void		sched_newts(struct lwp *);
249void		sched_vforkexec(struct lwp *, bool);
250
251/* Priority adjustment */
252void		sched_nice(struct proc *, int);
253
254/* Handlers of fork and exit */
255void		sched_proc_fork(struct proc *, struct proc *);
256void		sched_proc_exit(struct proc *, struct proc *);
257void		sched_lwp_fork(struct lwp *, struct lwp *);
258void		sched_lwp_collect(struct lwp *);
259
260void		sched_slept(struct lwp *);
261void		sched_wakeup(struct lwp *);
262
263void		setrunnable(struct lwp *);
264void		sched_setrunnable(struct lwp *);
265
266struct cpu_info *sched_takecpu(struct lwp *);
267void		sched_print_runqueue(void (*pr)(const char *, ...)
268    __printflike(1, 2));
269
270/* Dispatching */
271bool		kpreempt(uintptr_t);
272void		preempt(void);
273bool		preempt_needed(void);
274void		preempt_point(void);
275void		yield(void);
276void		mi_switch(struct lwp *);
277void		updatertime(lwp_t *, const struct bintime *);
278void		sched_idle(void);
279void		suspendsched(void);
280
281int		do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
282int		do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
283
284#endif	/* _KERNEL */
285#endif	/* _SYS_SCHED_H_ */