[BACK]Return to sched.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / sys

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>