xref: /xnu-12377.61.12/osfmk/mach/thread_policy.h (revision 4d495c6e23c53686cf65f45067f79024cf5dcee8)
1*4d495c6eSApple OSS Distributions /*
2*4d495c6eSApple OSS Distributions  * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
3*4d495c6eSApple OSS Distributions  *
4*4d495c6eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*4d495c6eSApple OSS Distributions  *
6*4d495c6eSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*4d495c6eSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*4d495c6eSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*4d495c6eSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*4d495c6eSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*4d495c6eSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*4d495c6eSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*4d495c6eSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*4d495c6eSApple OSS Distributions  *
15*4d495c6eSApple OSS Distributions  * Please obtain a copy of the License at
16*4d495c6eSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*4d495c6eSApple OSS Distributions  *
18*4d495c6eSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*4d495c6eSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*4d495c6eSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*4d495c6eSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*4d495c6eSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*4d495c6eSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*4d495c6eSApple OSS Distributions  * limitations under the License.
25*4d495c6eSApple OSS Distributions  *
26*4d495c6eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*4d495c6eSApple OSS Distributions  */
28*4d495c6eSApple OSS Distributions 
29*4d495c6eSApple OSS Distributions #ifndef _MACH_THREAD_POLICY_H_
30*4d495c6eSApple OSS Distributions #define _MACH_THREAD_POLICY_H_
31*4d495c6eSApple OSS Distributions 
32*4d495c6eSApple OSS Distributions #include <mach/mach_types.h>
33*4d495c6eSApple OSS Distributions 
34*4d495c6eSApple OSS Distributions /*
35*4d495c6eSApple OSS Distributions  * These are the calls for accessing the policy parameters
36*4d495c6eSApple OSS Distributions  * of a particular thread.
37*4d495c6eSApple OSS Distributions  *
38*4d495c6eSApple OSS Distributions  * The extra 'get_default' parameter to the second call is
39*4d495c6eSApple OSS Distributions  * IN/OUT as follows:
40*4d495c6eSApple OSS Distributions  * 1) if asserted on the way in it indicates that the default
41*4d495c6eSApple OSS Distributions  * values should be returned, not the ones currently set, in
42*4d495c6eSApple OSS Distributions  * this case 'get_default' will always be asserted on return;
43*4d495c6eSApple OSS Distributions  * 2) if unasserted on the way in, the current settings are
44*4d495c6eSApple OSS Distributions  * desired and if still unasserted on return, then the info
45*4d495c6eSApple OSS Distributions  * returned reflects the current settings, otherwise if
46*4d495c6eSApple OSS Distributions  * 'get_default' returns asserted, it means that there are no
47*4d495c6eSApple OSS Distributions  * current settings due to other parameters taking precedence,
48*4d495c6eSApple OSS Distributions  * and the default ones are being returned instead.
49*4d495c6eSApple OSS Distributions  */
50*4d495c6eSApple OSS Distributions 
51*4d495c6eSApple OSS Distributions typedef natural_t       thread_policy_flavor_t;
52*4d495c6eSApple OSS Distributions typedef integer_t       *thread_policy_t;
53*4d495c6eSApple OSS Distributions 
54*4d495c6eSApple OSS Distributions /*
55*4d495c6eSApple OSS Distributions  *  kern_return_t	thread_policy_set(
56*4d495c6eSApple OSS Distributions  *                                       thread_t					thread,
57*4d495c6eSApple OSS Distributions  *                                       thread_policy_flavor_t		flavor,
58*4d495c6eSApple OSS Distributions  *                                       thread_policy_t				policy_info,
59*4d495c6eSApple OSS Distributions  *                                       mach_msg_type_number_t		count);
60*4d495c6eSApple OSS Distributions  *
61*4d495c6eSApple OSS Distributions  *  kern_return_t	thread_policy_get(
62*4d495c6eSApple OSS Distributions  *                                       thread_t					thread,
63*4d495c6eSApple OSS Distributions  *                                       thread_policy_flavor_t		flavor,
64*4d495c6eSApple OSS Distributions  *                                       thread_policy_t				policy_info,
65*4d495c6eSApple OSS Distributions  *                                       mach_msg_type_number_t		*count,
66*4d495c6eSApple OSS Distributions  *                                       boolean_t					*get_default);
67*4d495c6eSApple OSS Distributions  */
68*4d495c6eSApple OSS Distributions 
69*4d495c6eSApple OSS Distributions /*
70*4d495c6eSApple OSS Distributions  * Defined flavors.
71*4d495c6eSApple OSS Distributions  */
72*4d495c6eSApple OSS Distributions /*
73*4d495c6eSApple OSS Distributions  * THREAD_STANDARD_POLICY:
74*4d495c6eSApple OSS Distributions  *
75*4d495c6eSApple OSS Distributions  * This is the standard (fair) scheduling mode, assigned to new
76*4d495c6eSApple OSS Distributions  * threads.  The thread will be given processor time in a manner
77*4d495c6eSApple OSS Distributions  * which apportions approximately equal share to long running
78*4d495c6eSApple OSS Distributions  * computations.
79*4d495c6eSApple OSS Distributions  *
80*4d495c6eSApple OSS Distributions  * Parameters:
81*4d495c6eSApple OSS Distributions  *	[none]
82*4d495c6eSApple OSS Distributions  */
83*4d495c6eSApple OSS Distributions 
84*4d495c6eSApple OSS Distributions #define THREAD_STANDARD_POLICY                  1
85*4d495c6eSApple OSS Distributions 
86*4d495c6eSApple OSS Distributions struct thread_standard_policy {
87*4d495c6eSApple OSS Distributions 	natural_t               no_data;
88*4d495c6eSApple OSS Distributions };
89*4d495c6eSApple OSS Distributions 
90*4d495c6eSApple OSS Distributions typedef struct thread_standard_policy   thread_standard_policy_data_t;
91*4d495c6eSApple OSS Distributions typedef struct thread_standard_policy   *thread_standard_policy_t;
92*4d495c6eSApple OSS Distributions 
93*4d495c6eSApple OSS Distributions #define THREAD_STANDARD_POLICY_COUNT    0
94*4d495c6eSApple OSS Distributions 
95*4d495c6eSApple OSS Distributions /*
96*4d495c6eSApple OSS Distributions  * THREAD_EXTENDED_POLICY:
97*4d495c6eSApple OSS Distributions  *
98*4d495c6eSApple OSS Distributions  * Extended form of THREAD_STANDARD_POLICY, which supplies a
99*4d495c6eSApple OSS Distributions  * hint indicating whether this is a long running computation.
100*4d495c6eSApple OSS Distributions  *
101*4d495c6eSApple OSS Distributions  * Parameters:
102*4d495c6eSApple OSS Distributions  *
103*4d495c6eSApple OSS Distributions  * timeshare: TRUE (the default) results in identical scheduling
104*4d495c6eSApple OSS Distributions  * behavior as THREAD_STANDARD_POLICY.
105*4d495c6eSApple OSS Distributions  */
106*4d495c6eSApple OSS Distributions 
107*4d495c6eSApple OSS Distributions #define THREAD_EXTENDED_POLICY                  1
108*4d495c6eSApple OSS Distributions 
109*4d495c6eSApple OSS Distributions struct thread_extended_policy {
110*4d495c6eSApple OSS Distributions 	boolean_t               timeshare;
111*4d495c6eSApple OSS Distributions };
112*4d495c6eSApple OSS Distributions 
113*4d495c6eSApple OSS Distributions typedef struct thread_extended_policy   thread_extended_policy_data_t;
114*4d495c6eSApple OSS Distributions typedef struct thread_extended_policy   *thread_extended_policy_t;
115*4d495c6eSApple OSS Distributions 
116*4d495c6eSApple OSS Distributions #define THREAD_EXTENDED_POLICY_COUNT    ((mach_msg_type_number_t) \
117*4d495c6eSApple OSS Distributions 	(sizeof (thread_extended_policy_data_t) / sizeof (integer_t)))
118*4d495c6eSApple OSS Distributions 
119*4d495c6eSApple OSS Distributions /*
120*4d495c6eSApple OSS Distributions  * THREAD_TIME_CONSTRAINT_POLICY:
121*4d495c6eSApple OSS Distributions  *
122*4d495c6eSApple OSS Distributions  * This scheduling mode is for threads which have real time
123*4d495c6eSApple OSS Distributions  * constraints on their execution.
124*4d495c6eSApple OSS Distributions  *
125*4d495c6eSApple OSS Distributions  * Parameters:
126*4d495c6eSApple OSS Distributions  *
127*4d495c6eSApple OSS Distributions  * period: This is the nominal amount of time between separate
128*4d495c6eSApple OSS Distributions  * processing arrivals, specified in absolute time units.  A
129*4d495c6eSApple OSS Distributions  * value of 0 indicates that there is no inherent periodicity in
130*4d495c6eSApple OSS Distributions  * the computation.
131*4d495c6eSApple OSS Distributions  *
132*4d495c6eSApple OSS Distributions  * computation: This is the nominal amount of computation
133*4d495c6eSApple OSS Distributions  * time needed during a separate processing arrival, specified
134*4d495c6eSApple OSS Distributions  * in absolute time units.  The thread may be preempted after
135*4d495c6eSApple OSS Distributions  * the computation time has elapsed.
136*4d495c6eSApple OSS Distributions  * If (computation < constraint/2) it will be forced to
137*4d495c6eSApple OSS Distributions  * constraint/2 to avoid unintended preemption and associated
138*4d495c6eSApple OSS Distributions  * timer interrupts.
139*4d495c6eSApple OSS Distributions  *
140*4d495c6eSApple OSS Distributions  * constraint: This is the maximum amount of real time that
141*4d495c6eSApple OSS Distributions  * may elapse from the start of a separate processing arrival
142*4d495c6eSApple OSS Distributions  * to the end of computation for logically correct functioning,
143*4d495c6eSApple OSS Distributions  * specified in absolute time units.  Must be (>= computation).
144*4d495c6eSApple OSS Distributions  * Note that latency = (constraint - computation).
145*4d495c6eSApple OSS Distributions  *
146*4d495c6eSApple OSS Distributions  * preemptible: IGNORED (This indicates that the computation may be
147*4d495c6eSApple OSS Distributions  * interrupted, subject to the constraint specified above.)
148*4d495c6eSApple OSS Distributions  */
149*4d495c6eSApple OSS Distributions 
150*4d495c6eSApple OSS Distributions #define THREAD_TIME_CONSTRAINT_POLICY           2
151*4d495c6eSApple OSS Distributions 
152*4d495c6eSApple OSS Distributions struct thread_time_constraint_policy {
153*4d495c6eSApple OSS Distributions 	uint32_t                period;
154*4d495c6eSApple OSS Distributions 	uint32_t                computation;
155*4d495c6eSApple OSS Distributions 	uint32_t                constraint;
156*4d495c6eSApple OSS Distributions 	boolean_t               preemptible;
157*4d495c6eSApple OSS Distributions };
158*4d495c6eSApple OSS Distributions 
159*4d495c6eSApple OSS Distributions typedef struct thread_time_constraint_policy    \
160*4d495c6eSApple OSS Distributions         thread_time_constraint_policy_data_t;
161*4d495c6eSApple OSS Distributions typedef struct thread_time_constraint_policy    \
162*4d495c6eSApple OSS Distributions         *thread_time_constraint_policy_t;
163*4d495c6eSApple OSS Distributions 
164*4d495c6eSApple OSS Distributions #define THREAD_TIME_CONSTRAINT_POLICY_COUNT     ((mach_msg_type_number_t) \
165*4d495c6eSApple OSS Distributions 	(sizeof (thread_time_constraint_policy_data_t) / sizeof (integer_t)))
166*4d495c6eSApple OSS Distributions 
167*4d495c6eSApple OSS Distributions /*
168*4d495c6eSApple OSS Distributions  * THREAD_PRECEDENCE_POLICY:
169*4d495c6eSApple OSS Distributions  *
170*4d495c6eSApple OSS Distributions  * This may be used to indicate the relative value of the
171*4d495c6eSApple OSS Distributions  * computation compared to the other threads in the task.
172*4d495c6eSApple OSS Distributions  *
173*4d495c6eSApple OSS Distributions  * Parameters:
174*4d495c6eSApple OSS Distributions  *
175*4d495c6eSApple OSS Distributions  * importance: The importance is specified as a signed value.
176*4d495c6eSApple OSS Distributions  */
177*4d495c6eSApple OSS Distributions 
178*4d495c6eSApple OSS Distributions #define THREAD_PRECEDENCE_POLICY                3
179*4d495c6eSApple OSS Distributions 
180*4d495c6eSApple OSS Distributions struct thread_precedence_policy {
181*4d495c6eSApple OSS Distributions 	integer_t               importance;
182*4d495c6eSApple OSS Distributions };
183*4d495c6eSApple OSS Distributions 
184*4d495c6eSApple OSS Distributions typedef struct thread_precedence_policy         thread_precedence_policy_data_t;
185*4d495c6eSApple OSS Distributions typedef struct thread_precedence_policy         *thread_precedence_policy_t;
186*4d495c6eSApple OSS Distributions 
187*4d495c6eSApple OSS Distributions #define THREAD_PRECEDENCE_POLICY_COUNT  ((mach_msg_type_number_t) \
188*4d495c6eSApple OSS Distributions 	(sizeof (thread_precedence_policy_data_t) / sizeof (integer_t)))
189*4d495c6eSApple OSS Distributions 
190*4d495c6eSApple OSS Distributions /*
191*4d495c6eSApple OSS Distributions  * THREAD_AFFINITY_POLICY:
192*4d495c6eSApple OSS Distributions  *
193*4d495c6eSApple OSS Distributions  * This policy is experimental.
194*4d495c6eSApple OSS Distributions  * This may be used to express affinity relationships
195*4d495c6eSApple OSS Distributions  * between threads in the task. Threads with the same affinity tag will
196*4d495c6eSApple OSS Distributions  * be scheduled to share an L2 cache if possible. That is, affinity tags
197*4d495c6eSApple OSS Distributions  * are a hint to the scheduler for thread placement.
198*4d495c6eSApple OSS Distributions  *
199*4d495c6eSApple OSS Distributions  * The namespace of affinity tags is generally local to one task. However,
200*4d495c6eSApple OSS Distributions  * a child task created after the assignment of affinity tags by its parent
201*4d495c6eSApple OSS Distributions  * will share that namespace. In particular, a family of forked processes
202*4d495c6eSApple OSS Distributions  * may be created with a shared affinity namespace.
203*4d495c6eSApple OSS Distributions  *
204*4d495c6eSApple OSS Distributions  * Parameters:
205*4d495c6eSApple OSS Distributions  * tag: The affinity set identifier.
206*4d495c6eSApple OSS Distributions  */
207*4d495c6eSApple OSS Distributions 
208*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_POLICY          4
209*4d495c6eSApple OSS Distributions 
210*4d495c6eSApple OSS Distributions struct thread_affinity_policy {
211*4d495c6eSApple OSS Distributions 	integer_t       affinity_tag;
212*4d495c6eSApple OSS Distributions };
213*4d495c6eSApple OSS Distributions 
214*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_TAG_NULL                0
215*4d495c6eSApple OSS Distributions 
216*4d495c6eSApple OSS Distributions typedef struct thread_affinity_policy           thread_affinity_policy_data_t;
217*4d495c6eSApple OSS Distributions typedef struct thread_affinity_policy           *thread_affinity_policy_t;
218*4d495c6eSApple OSS Distributions 
219*4d495c6eSApple OSS Distributions #define THREAD_AFFINITY_POLICY_COUNT    ((mach_msg_type_number_t) \
220*4d495c6eSApple OSS Distributions 	(sizeof (thread_affinity_policy_data_t) / sizeof (integer_t)))
221*4d495c6eSApple OSS Distributions 
222*4d495c6eSApple OSS Distributions /*
223*4d495c6eSApple OSS Distributions  * THREAD_BACKGROUND_POLICY:
224*4d495c6eSApple OSS Distributions  */
225*4d495c6eSApple OSS Distributions 
226*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY        5
227*4d495c6eSApple OSS Distributions 
228*4d495c6eSApple OSS Distributions struct thread_background_policy {
229*4d495c6eSApple OSS Distributions 	integer_t       priority;
230*4d495c6eSApple OSS Distributions };
231*4d495c6eSApple OSS Distributions 
232*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY_DARWIN_BG 0x1000
233*4d495c6eSApple OSS Distributions 
234*4d495c6eSApple OSS Distributions typedef struct thread_background_policy         thread_background_policy_data_t;
235*4d495c6eSApple OSS Distributions typedef struct thread_background_policy         *thread_background_policy_t;
236*4d495c6eSApple OSS Distributions 
237*4d495c6eSApple OSS Distributions #define THREAD_BACKGROUND_POLICY_COUNT  ((mach_msg_type_number_t) \
238*4d495c6eSApple OSS Distributions 	(sizeof (thread_background_policy_data_t) / sizeof (integer_t)))
239*4d495c6eSApple OSS Distributions 
240*4d495c6eSApple OSS Distributions 
241*4d495c6eSApple OSS Distributions #define THREAD_LATENCY_QOS_POLICY       7
242*4d495c6eSApple OSS Distributions typedef integer_t       thread_latency_qos_t;
243*4d495c6eSApple OSS Distributions 
244*4d495c6eSApple OSS Distributions struct thread_latency_qos_policy {
245*4d495c6eSApple OSS Distributions 	thread_latency_qos_t thread_latency_qos_tier;
246*4d495c6eSApple OSS Distributions };
247*4d495c6eSApple OSS Distributions 
248*4d495c6eSApple OSS Distributions typedef struct thread_latency_qos_policy        thread_latency_qos_policy_data_t;
249*4d495c6eSApple OSS Distributions typedef struct thread_latency_qos_policy        *thread_latency_qos_policy_t;
250*4d495c6eSApple OSS Distributions 
251*4d495c6eSApple OSS Distributions #define THREAD_LATENCY_QOS_POLICY_COUNT ((mach_msg_type_number_t)       \
252*4d495c6eSApple OSS Distributions 	    (sizeof (thread_latency_qos_policy_data_t) / sizeof (integer_t)))
253*4d495c6eSApple OSS Distributions 
254*4d495c6eSApple OSS Distributions #define THREAD_THROUGHPUT_QOS_POLICY    8
255*4d495c6eSApple OSS Distributions typedef integer_t       thread_throughput_qos_t;
256*4d495c6eSApple OSS Distributions 
257*4d495c6eSApple OSS Distributions struct thread_throughput_qos_policy {
258*4d495c6eSApple OSS Distributions 	thread_throughput_qos_t thread_throughput_qos_tier;
259*4d495c6eSApple OSS Distributions };
260*4d495c6eSApple OSS Distributions 
261*4d495c6eSApple OSS Distributions typedef struct thread_throughput_qos_policy     thread_throughput_qos_policy_data_t;
262*4d495c6eSApple OSS Distributions typedef struct thread_throughput_qos_policy     *thread_throughput_qos_policy_t;
263*4d495c6eSApple OSS Distributions 
264*4d495c6eSApple OSS Distributions #define THREAD_THROUGHPUT_QOS_POLICY_COUNT      ((mach_msg_type_number_t) \
265*4d495c6eSApple OSS Distributions 	    (sizeof (thread_throughput_qos_policy_data_t) / sizeof (integer_t)))
266*4d495c6eSApple OSS Distributions 
267*4d495c6eSApple OSS Distributions #ifdef PRIVATE
268*4d495c6eSApple OSS Distributions #include <mach/thread_policy_private.h>
269*4d495c6eSApple OSS Distributions #endif
270*4d495c6eSApple OSS Distributions 
271*4d495c6eSApple OSS Distributions #endif  /* _MACH_THREAD_POLICY_H_ */
272