xref: /f-stack/freebsd/sys/priority.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-4-Clause
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 1994, Henrik Vestergaard Draboel
5a9643ea8Slogwang  * All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
8a9643ea8Slogwang  * modification, are permitted provided that the following conditions
9a9643ea8Slogwang  * are met:
10a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
11a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
12a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
13a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
14a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
15a9643ea8Slogwang  * 3. All advertising materials mentioning features or use of this software
16a9643ea8Slogwang  *    must display the following acknowledgement:
17a9643ea8Slogwang  *	This product includes software developed by Henrik Vestergaard Draboel.
18a9643ea8Slogwang  * 4. The name of the author may not be used to endorse or promote products
19a9643ea8Slogwang  *    derived from this software without specific prior written permission.
20a9643ea8Slogwang  *
21a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31a9643ea8Slogwang  * SUCH DAMAGE.
32a9643ea8Slogwang  *
33a9643ea8Slogwang  * $FreeBSD$
34a9643ea8Slogwang  */
35a9643ea8Slogwang 
36a9643ea8Slogwang #ifndef _SYS_PRIORITY_H_
37a9643ea8Slogwang #define _SYS_PRIORITY_H_
38a9643ea8Slogwang 
39a9643ea8Slogwang /*
40a9643ea8Slogwang  * Process priority specifications.
41a9643ea8Slogwang  */
42a9643ea8Slogwang 
43a9643ea8Slogwang /*
44a9643ea8Slogwang  * Priority classes.
45a9643ea8Slogwang  */
46a9643ea8Slogwang 
47a9643ea8Slogwang #define	PRI_ITHD		1	/* Interrupt thread. */
48a9643ea8Slogwang #define	PRI_REALTIME		2	/* Real time process. */
49a9643ea8Slogwang #define	PRI_TIMESHARE		3	/* Time sharing process. */
50a9643ea8Slogwang #define	PRI_IDLE		4	/* Idle process. */
51a9643ea8Slogwang 
52a9643ea8Slogwang /*
53a9643ea8Slogwang  * PRI_FIFO is POSIX.1B SCHED_FIFO.
54a9643ea8Slogwang  */
55a9643ea8Slogwang 
56a9643ea8Slogwang #define	PRI_FIFO_BIT		8
57a9643ea8Slogwang #define	PRI_FIFO		(PRI_FIFO_BIT | PRI_REALTIME)
58a9643ea8Slogwang 
59a9643ea8Slogwang #define	PRI_BASE(P)		((P) & ~PRI_FIFO_BIT)
60a9643ea8Slogwang #define	PRI_IS_REALTIME(P)	(PRI_BASE(P) == PRI_REALTIME)
61a9643ea8Slogwang #define	PRI_NEED_RR(P)		((P) != PRI_FIFO)
62a9643ea8Slogwang 
63a9643ea8Slogwang /*
64a9643ea8Slogwang  * Priorities.  Note that with 64 run queues, differences less than 4 are
65a9643ea8Slogwang  * insignificant.
66a9643ea8Slogwang  */
67a9643ea8Slogwang 
68a9643ea8Slogwang /*
69a9643ea8Slogwang  * Priorities range from 0 to 255, but differences of less then 4 (RQ_PPQ)
70a9643ea8Slogwang  * are insignificant.  Ranges are as follows:
71a9643ea8Slogwang  *
72a9643ea8Slogwang  * Interrupt threads:		0 - 47
73a9643ea8Slogwang  * Realtime user threads:	48 - 79
74a9643ea8Slogwang  * Top half kernel threads:	80 - 119
75a9643ea8Slogwang  * Time sharing user threads:	120 - 223
76a9643ea8Slogwang  * Idle user threads:		224 - 255
77a9643ea8Slogwang  *
78a9643ea8Slogwang  * XXX If/When the specific interrupt thread and top half thread ranges
79a9643ea8Slogwang  * disappear, a larger range can be used for user processes.
80a9643ea8Slogwang  */
81a9643ea8Slogwang 
82a9643ea8Slogwang #define	PRI_MIN			(0)		/* Highest priority. */
83a9643ea8Slogwang #define	PRI_MAX			(255)		/* Lowest priority. */
84a9643ea8Slogwang 
85a9643ea8Slogwang #define	PRI_MIN_ITHD		(PRI_MIN)
86a9643ea8Slogwang #define	PRI_MAX_ITHD		(PRI_MIN_REALTIME - 1)
87a9643ea8Slogwang 
88a9643ea8Slogwang #define	PI_REALTIME		(PRI_MIN_ITHD + 0)
89a9643ea8Slogwang #define	PI_AV			(PRI_MIN_ITHD + 4)
90a9643ea8Slogwang #define	PI_NET			(PRI_MIN_ITHD + 8)
91a9643ea8Slogwang #define	PI_DISK			(PRI_MIN_ITHD + 12)
92a9643ea8Slogwang #define	PI_TTY			(PRI_MIN_ITHD + 16)
93a9643ea8Slogwang #define	PI_DULL			(PRI_MIN_ITHD + 20)
94a9643ea8Slogwang #define	PI_SOFT			(PRI_MIN_ITHD + 24)
95a9643ea8Slogwang #define	PI_SWI(x)		(PI_SOFT + (x) * RQ_PPQ)
96a9643ea8Slogwang 
97a9643ea8Slogwang #define	PRI_MIN_REALTIME	(48)
98a9643ea8Slogwang #define	PRI_MAX_REALTIME	(PRI_MIN_KERN - 1)
99a9643ea8Slogwang 
100a9643ea8Slogwang #define	PRI_MIN_KERN		(80)
101a9643ea8Slogwang #define	PRI_MAX_KERN		(PRI_MIN_TIMESHARE - 1)
102a9643ea8Slogwang 
103a9643ea8Slogwang #define	PSWP			(PRI_MIN_KERN + 0)
104a9643ea8Slogwang #define	PVM			(PRI_MIN_KERN + 4)
105a9643ea8Slogwang #define	PINOD			(PRI_MIN_KERN + 8)
106a9643ea8Slogwang #define	PRIBIO			(PRI_MIN_KERN + 12)
107a9643ea8Slogwang #define	PVFS			(PRI_MIN_KERN + 16)
108a9643ea8Slogwang #define	PZERO			(PRI_MIN_KERN + 20)
109a9643ea8Slogwang #define	PSOCK			(PRI_MIN_KERN + 24)
110a9643ea8Slogwang #define	PWAIT			(PRI_MIN_KERN + 28)
111a9643ea8Slogwang #define	PLOCK			(PRI_MIN_KERN + 32)
112a9643ea8Slogwang #define	PPAUSE			(PRI_MIN_KERN + 36)
113a9643ea8Slogwang 
114a9643ea8Slogwang #define	PRI_MIN_TIMESHARE	(120)
115a9643ea8Slogwang #define	PRI_MAX_TIMESHARE	(PRI_MIN_IDLE - 1)
116a9643ea8Slogwang 
117a9643ea8Slogwang #define	PUSER			(PRI_MIN_TIMESHARE)
118a9643ea8Slogwang 
119a9643ea8Slogwang #define	PRI_MIN_IDLE		(224)
120a9643ea8Slogwang #define	PRI_MAX_IDLE		(PRI_MAX)
121a9643ea8Slogwang 
122a9643ea8Slogwang #ifdef _KERNEL
123a9643ea8Slogwang /* Other arguments for kern_yield(9). */
124a9643ea8Slogwang #define	PRI_USER	-2	/* Change to current user priority. */
125a9643ea8Slogwang #define	PRI_UNCHANGED	-1	/* Do not change priority. */
126a9643ea8Slogwang #endif
127a9643ea8Slogwang 
128a9643ea8Slogwang struct priority {
129a9643ea8Slogwang 	u_char	pri_class;	/* Scheduling class. */
130a9643ea8Slogwang 	u_char	pri_level;	/* Normal priority level. */
131a9643ea8Slogwang 	u_char	pri_native;	/* Priority before propagation. */
132a9643ea8Slogwang 	u_char	pri_user;	/* User priority based on p_cpu and p_nice. */
133a9643ea8Slogwang };
134a9643ea8Slogwang 
135a9643ea8Slogwang #endif	/* !_SYS_PRIORITY_H_ */
136