Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / sched.h @ 14

History | View | Annotate | Download (9.04 KB)

1
/*        $NetBSD: sched.h,v 1.75 2011/11/21 04:36:05 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

    
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

    
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

    
110
cpuset_t *_cpuset_create(void);
111
void        _cpuset_destroy(cpuset_t *);
112
void        _cpuset_zero(cpuset_t *);
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 *);
116
size_t        _cpuset_size(const cpuset_t *);
117

    
118
#endif
119

    
120
/*
121
 * Internal affinity and scheduling calls.
122
 */
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 *);
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 *);
127
__END_DECLS
128

    
129
/*
130
 * CPU states.
131
 * XXX Not really scheduler state, but no other good place to put
132
 * it right now, and it really is per-CPU.
133
 */
134
#define        CP_USER                0
135
#define        CP_NICE                1
136
#define        CP_SYS                2
137
#define        CP_INTR                3
138
#define        CP_IDLE                4
139
#define        CPUSTATES        5
140

    
141
#if defined(_KERNEL) || defined(_KMEMUSER)
142

    
143
#include <sys/mutex.h>
144
#include <sys/time.h>
145

    
146
/*
147
 * Per-CPU scheduler state.  Field markings and the corresponding locks: 
148
 *
149
 * s:        splsched, may only be safely accessed by the CPU itself
150
 * m:        spc_mutex
151
 * (:        unlocked, stable
152
 * c:        cpu_lock
153
 */
154
struct schedstate_percpu {
155
        /* First set of data is likely to be accessed by other CPUs. */
156
        kmutex_t        *spc_mutex;        /* (: lock on below, runnable LWPs */
157
        kmutex_t        *spc_lwplock;        /* (: general purpose lock for LWPs */
158
        struct lwp        *spc_migrating;        /* (: migrating LWP */
159
        pri_t                spc_curpriority;/* m: usrpri of curlwp */
160
        pri_t                spc_maxpriority;/* m: highest priority queued */
161
        psetid_t        spc_psid;        /* c: processor-set ID */
162
        time_t                spc_lastmod;        /* c: time of last cpu state change */
163

    
164
        /* For the most part, this set of data is CPU-private. */
165
        void                *spc_sched_info;/* (: scheduler-specific structure */
166
        volatile int        spc_flags;        /* s: flags; see below */
167
        u_int                spc_schedticks;        /* s: ticks for schedclock() */
168
        uint64_t        spc_cp_time[CPUSTATES];/* s: CPU state statistics */
169
        int                spc_ticks;        /* s: ticks until sched_tick() */
170
        int                spc_pscnt;        /* s: prof/stat counter */
171
        int                spc_psdiv;        /* s: prof/stat divisor */
172
};
173

    
174
/* spc_flags */
175
#define        SPCF_SEENRR                0x0001        /* process has seen roundrobin() */
176
#define        SPCF_SHOULDYIELD        0x0002        /* process should yield the CPU */
177
#define        SPCF_OFFLINE                0x0004        /* CPU marked offline */
178
#define        SPCF_RUNNING                0x0008        /* CPU is running */
179
#define        SPCF_NOINTR                0x0010        /* shielded from interrupts */
180

    
181
#define        SPCF_SWITCHCLEAR        (SPCF_SEENRR|SPCF_SHOULDYIELD)
182

    
183
#endif /* defined(_KERNEL) || defined(_KMEMUSER) */
184

    
185
/*
186
 * Flags passed to the Linux-compatible __clone(2) system call.
187
 */
188
#define        CLONE_CSIGNAL                0x000000ff        /* signal to be sent at exit */
189
#define        CLONE_VM                0x00000100        /* share address space */
190
#define        CLONE_FS                0x00000200        /* share "file system" info */
191
#define        CLONE_FILES                0x00000400        /* share file descriptors */
192
#define        CLONE_SIGHAND                0x00000800        /* share signal actions */
193
#define        CLONE_PID                0x00001000        /* share process ID */
194
#define        CLONE_PTRACE                0x00002000        /* ptrace(2) continues on
195
                                                   child */
196
#define        CLONE_VFORK                0x00004000        /* parent blocks until child
197
                                                   exits */
198

    
199
#endif /* _NETBSD_SOURCE */
200

    
201
#ifdef _KERNEL
202

    
203
extern int schedhz;                        /* ideally: 16 */
204

    
205
struct proc;
206
struct cpu_info;
207

    
208
/*
209
 * Common Scheduler Interface.
210
 */
211

    
212
/* Scheduler initialization */
213
void                runq_init(void);
214
void                synch_init(void);
215
void                sched_init(void);
216
void                sched_rqinit(void);
217
void                sched_cpuattach(struct cpu_info *);
218

    
219
/* Time-driven events */
220
void                sched_tick(struct cpu_info *);
221
void                schedclock(struct lwp *);
222
void                sched_schedclock(struct lwp *);
223
void                sched_pstats(void);
224
void                sched_lwp_stats(struct lwp *);
225
void                sched_pstats_hook(struct lwp *, int);
226

    
227
/* Runqueue-related functions */
228
bool                sched_curcpu_runnable_p(void);
229
void                sched_dequeue(struct lwp *);
230
void                sched_enqueue(struct lwp *, bool);
231
struct lwp *        sched_nextlwp(void);
232
void                sched_oncpu(struct lwp *);
233
void                sched_newts(struct lwp *);
234

    
235
/* Priority adjustment */
236
void                sched_nice(struct proc *, int);
237

    
238
/* Handlers of fork and exit */
239
void                sched_proc_fork(struct proc *, struct proc *);
240
void                sched_proc_exit(struct proc *, struct proc *);
241
void                sched_lwp_fork(struct lwp *, struct lwp *);
242
void                sched_lwp_collect(struct lwp *);
243

    
244
void                sched_slept(struct lwp *);
245
void                sched_wakeup(struct lwp *);
246

    
247
void                setrunnable(struct lwp *);
248
void                sched_setrunnable(struct lwp *);
249

    
250
struct cpu_info *sched_takecpu(struct lwp *);
251
void                sched_print_runqueue(void (*pr)(const char *, ...)
252
    __printflike(1, 2));
253

    
254
/* Dispatching */
255
bool                kpreempt(uintptr_t);
256
void                preempt(void);
257
void                yield(void);
258
int                mi_switch(struct lwp *);
259
void                updatertime(lwp_t *, const struct bintime *);
260
void                sched_idle(void);
261
void                suspendsched(void);
262

    
263
int                do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *);
264
int                do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *);
265

    
266
#endif        /* _KERNEL */
267
#endif        /* _SYS_SCHED_H_ */