Annotation of src/sys/sys/sched.h, Revision 1.75.8.1
1.75.8.1! jdolecek 1: /* $NetBSD$ */
1.1 ross 2:
3: /*-
1.51 ad 4: * Copyright (c) 1999, 2000, 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc.
1.1 ross 5: * All rights reserved.
6: *
7: * This code is derived from software contributed to The NetBSD Foundation
1.34 yamt 8: * by Ross Harvey, Jason R. Thorpe, Nathan J. Williams, Andrew Doran and
9: * Daniel Sieger.
1.1 ross 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.
1.19 agc 50: * 3. Neither the name of the University nor the names of its contributors
1.1 ross 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:
1.17 bjh21 72: #include <sys/featuretest.h>
1.45 rmind 73: #include <sys/types.h>
1.17 bjh21 74:
1.13 mrg 75: #if defined(_KERNEL_OPT)
1.6 thorpej 76: #include "opt_multiprocessor.h"
77: #include "opt_lockdebug.h"
78: #endif
79:
1.15 thorpej 80: struct sched_param {
81: int sched_priority;
82: };
83:
1.1 ross 84: /*
1.15 thorpej 85: * Scheduling policies required by IEEE Std 1003.1-2001
1.1 ross 86: */
1.45 rmind 87: #define SCHED_NONE -1
88: #define SCHED_OTHER 0
1.15 thorpej 89: #define SCHED_FIFO 1
90: #define SCHED_RR 2
91:
1.64 martin 92: #if defined(_NETBSD_SOURCE)
1.61 christos 93: __BEGIN_DECLS
1.64 martin 94:
1.60 rmind 95: /*
96: * Interface of CPU-sets.
97: */
1.59 christos 98: typedef struct _cpuset cpuset_t;
1.61 christos 99:
1.73 rmind 100: #ifndef _KERNEL
1.59 christos 101:
1.60 rmind 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)
1.61 christos 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)
1.59 christos 109:
110: cpuset_t *_cpuset_create(void);
111: void _cpuset_destroy(cpuset_t *);
112: void _cpuset_zero(cpuset_t *);
1.61 christos 113: int _cpuset_set(cpuid_t, cpuset_t *);
114: int _cpuset_clr(cpuid_t, cpuset_t *);
115: int _cpuset_isset(cpuid_t, const cpuset_t *);
1.59 christos 116: size_t _cpuset_size(const cpuset_t *);
1.65 rmind 117:
1.46 rmind 118: #endif
119:
1.60 rmind 120: /*
121: * Internal affinity and scheduling calls.
122: */
1.59 christos 123: int _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *);
124: int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *);
1.47 yamt 125: int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
126: int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
1.75.8.1! jdolecek 127: int _sched_protect(int);
1.61 christos 128: __END_DECLS
1.4 sommerfe 129:
1.33 yamt 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:
1.66 ad 142: #if defined(_KERNEL) || defined(_KMEMUSER)
1.33 yamt 143:
1.34 yamt 144: #include <sys/mutex.h>
1.4 sommerfe 145: #include <sys/time.h>
146:
1.3 thorpej 147: /*
1.34 yamt 148: * Per-CPU scheduler state. Field markings and the corresponding locks:
1.3 thorpej 149: *
1.34 yamt 150: * s: splsched, may only be safely accessed by the CPU itself
151: * m: spc_mutex
152: * (: unlocked, stable
1.36 ad 153: * c: cpu_lock
1.3 thorpej 154: */
155: struct schedstate_percpu {
1.38 ad 156: /* First set of data is likely to be accessed by other CPUs. */
1.34 yamt 157: kmutex_t *spc_mutex; /* (: lock on below, runnable LWPs */
1.48 ad 158: kmutex_t *spc_lwplock; /* (: general purpose lock for LWPs */
1.58 rmind 159: struct lwp *spc_migrating; /* (: migrating LWP */
1.38 ad 160: pri_t spc_curpriority;/* m: usrpri of curlwp */
1.51 ad 161: pri_t spc_maxpriority;/* m: highest priority queued */
1.62 ad 162: psetid_t spc_psid; /* c: processor-set ID */
1.38 ad 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 */
1.34 yamt 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 */
1.3 thorpej 173: };
174:
175: /* spc_flags */
176: #define SPCF_SEENRR 0x0001 /* process has seen roundrobin() */
177: #define SPCF_SHOULDYIELD 0x0002 /* process should yield the CPU */
1.36 ad 178: #define SPCF_OFFLINE 0x0004 /* CPU marked offline */
1.52 ad 179: #define SPCF_RUNNING 0x0008 /* CPU is running */
1.68 ad 180: #define SPCF_NOINTR 0x0010 /* shielded from interrupts */
1.3 thorpej 181:
182: #define SPCF_SWITCHCLEAR (SPCF_SEENRR|SPCF_SHOULDYIELD)
183:
1.66 ad 184: #endif /* defined(_KERNEL) || defined(_KMEMUSER) */
1.33 yamt 185:
1.14 thorpej 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 */
1.20 perry 195: #define CLONE_PTRACE 0x00002000 /* ptrace(2) continues on
1.14 thorpej 196: child */
197: #define CLONE_VFORK 0x00004000 /* parent blocks until child
198: exits */
199:
1.45 rmind 200: #endif /* _NETBSD_SOURCE */
1.3 thorpej 201:
1.14 thorpej 202: #ifdef _KERNEL
1.1 ross 203:
1.12 simonb 204: extern int schedhz; /* ideally: 16 */
1.34 yamt 205:
206: struct proc;
207: struct cpu_info;
1.1 ross 208:
1.3 thorpej 209: /*
1.37 rmind 210: * Common Scheduler Interface.
1.3 thorpej 211: */
212:
1.34 yamt 213: /* Scheduler initialization */
1.55 rmind 214: void runq_init(void);
1.71 elad 215: void synch_init(void);
1.37 rmind 216: void sched_init(void);
217: void sched_rqinit(void);
218: void sched_cpuattach(struct cpu_info *);
219:
1.39 rmind 220: /* Time-driven events */
1.37 rmind 221: void sched_tick(struct cpu_info *);
222: void schedclock(struct lwp *);
223: void sched_schedclock(struct lwp *);
1.72 rmind 224: void sched_pstats(void);
1.56 rmind 225: void sched_lwp_stats(struct lwp *);
226: void sched_pstats_hook(struct lwp *, int);
1.34 yamt 227:
228: /* Runqueue-related functions */
1.37 rmind 229: bool sched_curcpu_runnable_p(void);
230: void sched_dequeue(struct lwp *);
231: void sched_enqueue(struct lwp *, bool);
232: struct lwp * sched_nextlwp(void);
1.51 ad 233: void sched_oncpu(struct lwp *);
234: void sched_newts(struct lwp *);
1.34 yamt 235:
236: /* Priority adjustment */
1.37 rmind 237: void sched_nice(struct proc *, int);
1.34 yamt 238:
1.37 rmind 239: /* Handlers of fork and exit */
240: void sched_proc_fork(struct proc *, struct proc *);
241: void sched_proc_exit(struct proc *, struct proc *);
1.41 ad 242: void sched_lwp_fork(struct lwp *, struct lwp *);
243: void sched_lwp_collect(struct lwp *);
1.37 rmind 244:
1.39 rmind 245: void sched_slept(struct lwp *);
246: void sched_wakeup(struct lwp *);
247:
1.37 rmind 248: void setrunnable(struct lwp *);
249: void sched_setrunnable(struct lwp *);
1.39 rmind 250:
251: struct cpu_info *sched_takecpu(struct lwp *);
1.74 christos 252: void sched_print_runqueue(void (*pr)(const char *, ...)
1.75 christos 253: __printflike(1, 2));
1.37 rmind 254:
255: /* Dispatching */
1.53 ad 256: bool kpreempt(uintptr_t);
1.37 rmind 257: void preempt(void);
1.69 rmind 258: void yield(void);
1.37 rmind 259: int mi_switch(struct lwp *);
1.44 yamt 260: void updatertime(lwp_t *, const struct bintime *);
1.57 ad 261: void sched_idle(void);
1.69 rmind 262: void suspendsched(void);
1.6 thorpej 263:
1.49 elad 264: int do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
265: int do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
266:
1.1 ross 267: #endif /* _KERNEL */
268: #endif /* _SYS_SCHED_H_ */
CVSweb <webmaster@jp.NetBSD.org>