2 * Copyright (c) 2015-2016 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #ifndef _KERN_POLICY_INTERNAL_H_
30 #define _KERN_POLICY_INTERNAL_H_
33 * Interfaces for functionality implemented in task_ or thread_policy subsystem
36 #ifdef XNU_KERNEL_PRIVATE
38 #include <sys/cdefs.h>
39 #include <mach/kern_return.h>
40 #include <kern/kern_types.h>
41 #include <mach/task_policy.h>
42 #include <kern/task.h>
43 #include <kern/ledger.h>
46 ******************************
47 * XNU-internal functionality
48 ******************************
52 * Get effective policy
53 * Only for use by relevant subsystem, should never be passed into a setter!
55 extern int proc_get_effective_task_policy(task_t task
, int flavor
);
56 extern int proc_get_effective_thread_policy(thread_t thread
, int flavor
);
58 /* Set task 'nice' value */
59 extern kern_return_t
task_importance(task_t task
, integer_t importance
);
62 #define TASK_POLICY_DISABLE 0x0
63 #define TASK_POLICY_ENABLE 0x1
66 #define TASK_POLICY_INTERNAL 0x0
67 #define TASK_POLICY_EXTERNAL 0x1
68 #define TASK_POLICY_ATTRIBUTE 0x2
71 #define TASK_POLICY_TASK 0x4
72 #define TASK_POLICY_THREAD 0x8
74 /* flavors (also DBG_IMPORTANCE subclasses 0x20 - 0x3F) */
76 /* internal or external, thread or task */
77 #define TASK_POLICY_DARWIN_BG 0x21
78 #define TASK_POLICY_IOPOL 0x22
79 #define TASK_POLICY_IO 0x23
80 #define TASK_POLICY_PASSIVE_IO 0x24
82 /* internal, task only */
83 #define TASK_POLICY_DARWIN_BG_IOPOL 0x27
85 /* task-only attributes */
86 #define TASK_POLICY_TAL 0x28
87 #define TASK_POLICY_BOOST 0x29
88 #define TASK_POLICY_ROLE 0x2A
90 #define TASK_POLICY_TERMINATED 0x2C
91 #define TASK_POLICY_NEW_SOCKETS_BG 0x2D
92 #define TASK_POLICY_SUP_ACTIVE 0x2E
93 #define TASK_POLICY_LATENCY_QOS 0x2F
94 #define TASK_POLICY_THROUGH_QOS 0x30
95 #define TASK_POLICY_WATCHERS_BG 0x31
97 #define TASK_POLICY_SFI_MANAGED 0x34
98 #define TASK_POLICY_ALL_SOCKETS_BG 0x37
100 #define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS 0x39 /* latency as value1, throughput as value2 */
101 #define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS 0x3A /* latency as value1, throughput as value2 */
103 /* thread-only attributes */
104 #define TASK_POLICY_PIDBIND_BG 0x32
106 #define TASK_POLICY_QOS 0x35
107 #define TASK_POLICY_QOS_OVERRIDE 0x36
108 #define TASK_POLICY_QOS_AND_RELPRIO 0x38 /* QoS as value1, relative priority as value2 */
109 #define TASK_POLICY_QOS_WORKQ_OVERRIDE 0x3B
110 #define TASK_POLICY_QOS_PROMOTE 0x3C
111 #define TASK_POLICY_QOS_IPC_OVERRIDE 0x3D
112 // was TASK_POLICY_QOS_SYNC_IPC_OVERRIDE 0x3E
114 #define TASK_POLICY_MAX 0x3F
116 /* The main entrance to task policy is this function */
117 extern void proc_set_task_policy(task_t task
, int category
, int flavor
, int value
);
118 extern int proc_get_task_policy(task_t task
, int category
, int flavor
);
120 extern void proc_set_thread_policy(thread_t thread
, int category
, int flavor
, int value
);
121 extern int proc_get_thread_policy(thread_t thread
, int category
, int flavor
);
123 /* For use when you don't already hold a reference on the target thread */
124 extern void proc_set_thread_policy_with_tid(task_t task
, uint64_t tid
, int category
, int flavor
, int value
);
127 /* Functions used by kern_resource.c */
128 extern boolean_t
thread_has_qos_policy(thread_t thread
);
129 extern kern_return_t
thread_remove_qos_policy(thread_t thread
);
131 extern int proc_darwin_role_to_task_role(int darwin_role
, int* task_role
);
132 extern int proc_task_role_to_darwin_role(int task_role
);
134 /* Functions used by kern_exec.c */
135 extern void task_set_main_thread_qos(task_t task
, thread_t main_thread
);
136 extern void proc_set_task_spawnpolicy(task_t task
, int apptype
, int qos_clamp
, int role
,
137 ipc_port_t
* portwatch_ports
, int portwatch_count
);
138 extern void proc_inherit_task_role(task_t new_task
, task_t old_task
);
140 /* IO Throttle tiers */
141 #define THROTTLE_LEVEL_NONE -1
142 #define THROTTLE_LEVEL_TIER0 0 /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */
144 #define THROTTLE_LEVEL_THROTTLED 1
145 #define THROTTLE_LEVEL_TIER1 1 /* IOPOL_STANDARD */
146 #define THROTTLE_LEVEL_TIER2 2 /* IOPOL_UTILITY */
147 #define THROTTLE_LEVEL_TIER3 3 /* IOPOL_THROTTLE */
149 #define THROTTLE_LEVEL_START 0
150 #define THROTTLE_LEVEL_END 3
152 #define THROTTLE_LEVEL_COMPRESSOR_TIER0 THROTTLE_LEVEL_TIER0
153 #define THROTTLE_LEVEL_COMPRESSOR_TIER1 THROTTLE_LEVEL_TIER1
154 #define THROTTLE_LEVEL_COMPRESSOR_TIER2 THROTTLE_LEVEL_TIER2
156 #define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER2
157 #define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1
160 #define IOSCHED_METADATA_TIER THROTTLE_LEVEL_TIER1
161 #endif /* CONFIG_IOSCHED */
163 extern int proc_get_darwinbgstate(task_t task
, uint32_t *flagsp
);
164 extern int task_get_apptype(task_t
);
167 extern void proc_apply_task_networkbg(void * bsd_info
, thread_t thread
);
168 #endif /* MACH_BSD */
170 /* Functions used by pthread_shims.c */
171 extern int proc_thread_qos_add_override(task_t task
, thread_t thread
, uint64_t tid
,
172 int override_qos
, boolean_t first_override_for_resource
,
173 user_addr_t resource
, int resource_type
);
174 extern int proc_thread_qos_remove_override(task_t task
, thread_t thread
, uint64_t tid
,
175 user_addr_t resource
, int resource_type
);
177 extern void thread_reset_workq_qos(thread_t thread
, uint32_t qos
);
178 extern void thread_set_workq_override(thread_t thread
, uint32_t qos
);
179 extern void thread_set_workq_pri(thread_t thread
, thread_qos_t qos
, integer_t priority
, integer_t policy
);
180 extern uint8_t thread_workq_pri_for_qos(thread_qos_t qos
) __pure2
;
181 extern thread_qos_t
thread_workq_qos_for_pri(int priority
);
184 task_get_default_manager_qos(task_t task
);
186 extern void proc_thread_qos_deallocate(thread_t thread
);
188 extern int task_clear_cpuusage(task_t task
, int cpumon_entitled
);
191 /* Taskwatch related external BSD interface */
192 extern int proc_lf_pidbind(task_t curtask
, uint64_t tid
, task_t target_task
, int bind
);
193 #endif /* CONFIG_EMBEDDED */
195 /* Importance inheritance functions not under IMPORTANCE_INHERITANCE */
196 extern void task_importance_mark_donor(task_t task
, boolean_t donating
);
197 extern void task_importance_reset(task_t task
);
198 extern void task_importance_init_from_parent(task_t new_task
, task_t parent_task
);
200 #if IMPORTANCE_INHERITANCE
201 extern boolean_t
task_is_importance_donor(task_t task
);
202 extern boolean_t
task_is_importance_receiver_type(task_t task
);
204 extern int task_importance_hold_file_lock_assertion(task_t target_task
, uint32_t count
);
205 extern int task_importance_drop_file_lock_assertion(task_t target_task
, uint32_t count
);
207 extern int task_importance_hold_legacy_external_assertion(task_t target_task
, uint32_t count
);
208 extern int task_importance_drop_legacy_external_assertion(task_t target_task
, uint32_t count
);
209 #endif /* IMPORTANCE_INHERITANCE */
211 /* Functions used by process_policy.c */
212 extern boolean_t
proc_task_is_tal(task_t task
);
214 /* Arguments to proc_set_task_ruse_cpu */
215 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NONE 0x00
216 #define TASK_POLICY_RESOURCE_ATTRIBUTE_THROTTLE 0x01
217 #define TASK_POLICY_RESOURCE_ATTRIBUTE_SUSPEND 0x02
218 #define TASK_POLICY_RESOURCE_ATTRIBUTE_TERMINATE 0x03
219 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_KQ 0x04
220 #define TASK_POLICY_RESOURCE_ATTRIBUTE_NOTIFY_EXC 0x05
221 #define TASK_POLICY_RESOURCE_ATTRIBUTE_DEFAULT TASK_POLICY_RESOURCE_ATTRIBUTE_NONE
223 extern int proc_get_task_ruse_cpu(task_t task
, uint32_t *policyp
, uint8_t *percentagep
,
224 uint64_t *intervalp
, uint64_t *deadlinep
);
225 extern int proc_set_task_ruse_cpu(task_t task
, uint32_t policy
, uint8_t percentage
,
226 uint64_t interval
, uint64_t deadline
, int cpumon_entitled
);
227 extern int task_suspend_cpumon(task_t task
);
228 extern int task_resume_cpumon(task_t task
);
229 extern int proc_clear_task_ruse_cpu(task_t task
, int cpumon_entitled
);
231 extern int proc_apply_resource_actions(void * p
, int type
, int action
);
232 extern int proc_restore_resource_actions(void * p
, int type
, int action
);
234 /* VM/Jetsam importance callouts */
235 extern int task_low_mem_privileged_listener(task_t task
, boolean_t new_value
, boolean_t
*old_value
);
236 extern boolean_t
task_has_been_notified(task_t task
, int pressurelevel
);
237 extern boolean_t
task_used_for_purging(task_t task
, int pressurelevel
);
238 extern void task_mark_has_been_notified(task_t task
, int pressurelevel
);
239 extern void task_mark_used_for_purging(task_t task
, int pressurelevel
);
240 extern void task_clear_has_been_notified(task_t task
, int pressurelevel
);
241 extern void task_clear_used_for_purging(task_t task
);
242 extern int task_importance_estimate(task_t task
);
244 extern kern_return_t
thread_policy_set_internal(thread_t thread
, thread_policy_flavor_t flavor
,
245 thread_policy_t policy_info
, mach_msg_type_number_t count
);
247 extern boolean_t
thread_recompute_user_promotion_locked(thread_t thread
);
248 extern thread_qos_t
thread_user_promotion_qos_for_pri(int priority
);
250 extern void thread_set_exec_promotion(thread_t thread
);
251 extern void thread_clear_exec_promotion(thread_t thread
);
253 /* for IPC override management */
254 extern void thread_add_ipc_override(thread_t thread
, uint32_t qos_override
);
255 extern void thread_update_ipc_override(thread_t thread
, uint32_t qos_override
);
256 extern void thread_drop_ipc_override(thread_t thread
);
259 extern thread_qos_t
thread_get_requested_qos(thread_t thread
, int *relpri
);
262 ******************************
263 * Mach-internal functionality
264 ******************************
267 #ifdef MACH_KERNEL_PRIVATE
270 * this exports the internal policy update calls
271 * for IPC importance hooks into task policy
274 typedef struct task_pend_token
{
275 uint32_t tpt_update_sockets
:1,
276 tpt_update_timers
:1,
277 tpt_update_watchers
:1,
278 tpt_update_live_donor
:1,
279 tpt_update_coal_sfi
:1,
280 tpt_update_throttle
:1,
281 tpt_update_thread_sfi
:1,
282 tpt_force_recompute_pri
:1,
283 tpt_update_tg_ui_flag
:1;
284 } *task_pend_token_t
;
286 extern void task_policy_update_complete_unlocked(task_t task
, task_pend_token_t pend_token
);
287 extern void task_update_boost_locked(task_t task
, boolean_t boost_active
, task_pend_token_t pend_token
);
289 extern void thread_policy_update_locked(thread_t thread
, task_pend_token_t pend_token
);
290 extern void thread_policy_update_complete_unlocked(thread_t task
, task_pend_token_t pend_token
);
293 int qos_pri
[THREAD_QOS_LAST
];
294 int qos_iotier
[THREAD_QOS_LAST
];
295 uint32_t qos_through_qos
[THREAD_QOS_LAST
];
296 uint32_t qos_latency_qos
[THREAD_QOS_LAST
];
297 } qos_policy_params_t
;
299 extern const qos_policy_params_t thread_qos_policy_params
;
301 /* for task policy tracepoints */
302 /* Convenience functions for munging a policy bitfield into a tracepoint */
303 uintptr_t threquested_0(thread_t thread
);
304 uintptr_t threquested_1(thread_t thread
);
305 uintptr_t theffective_0(thread_t thread
);
306 uintptr_t theffective_1(thread_t thread
);
307 extern uint32_t tpending(task_pend_token_t pend_token
);
309 extern void proc_iopol_to_tier(int iopolicy
, int *tier
, int *passive
);
310 extern int proc_tier_to_iopol(int tier
, int passive
);
312 extern void set_thread_iotier_override(thread_t
, int policy
);
314 extern integer_t
task_grab_latency_qos(task_t task
);
315 extern void task_policy_create(task_t task
, task_t parent_task
);
316 extern void thread_policy_create(thread_t thread
);
318 extern boolean_t
task_is_daemon(task_t task
);
319 extern boolean_t
task_is_app(task_t task
);
322 /* Taskwatch related external interface */
323 extern void thead_remove_taskwatch(thread_t thread
);
324 extern void task_removewatchers(task_t task
);
325 extern void task_watch_init(void);
327 typedef struct task_watcher task_watch_t
;
328 #endif /* CONFIG_EMBEDDED */
330 #if IMPORTANCE_INHERITANCE
331 extern boolean_t
task_is_marked_importance_donor(task_t task
);
332 extern boolean_t
task_is_marked_importance_receiver(task_t task
);
334 extern boolean_t
task_is_marked_importance_denap_receiver(task_t task
);
335 #endif /* IMPORTANCE_INHERITANCE */
337 /* flags for rusage_cpu_flags */
338 #define TASK_RUSECPU_FLAGS_PROC_LIMIT 0x01
339 #define TASK_RUSECPU_FLAGS_PERTHR_LIMIT 0x02
340 #define TASK_RUSECPU_FLAGS_DEADLINE 0x04
341 #define TASK_RUSECPU_FLAGS_FATAL_CPUMON 0x08 /* CPU usage monitor violations are fatal */
342 #define TASK_RUSECPU_FLAGS_FATAL_WAKEUPSMON 0x10 /* wakeups monitor violations are fatal */
344 extern void proc_init_cpumon_params(void);
345 extern void thread_policy_init(void);
347 int task_compute_main_thread_qos(task_t task
);
349 /* thread policy internals */
350 extern void thread_policy_reset(thread_t thread
);
351 extern kern_return_t
thread_set_mode_and_absolute_pri(thread_t thread
, integer_t policy
, integer_t priority
);
353 extern void thread_policy_update_tasklocked(thread_t thread
, integer_t priority
, integer_t max_priority
, task_pend_token_t pend_token
);
355 #include "mach/resource_notify.h" /* from MIG */
357 /*! @function send_resource_violation
358 * @abstract send usage monitor violation notification
360 * @param violator the task (process) violating its CPU budget
361 * @param ledger_info the entry tracking the resource limit
362 * @param flags see constants for type in sys/reason.h
364 * @result KERN_SUCCESS if the message was sent
367 * send_resource_violation() calls the corresponding MIG routine
368 * over the host special RESOURCE_NOTIFY port.
370 kern_return_t
send_resource_violation(typeof(send_cpu_usage_violation
),
372 struct ledger_entry_info
*ledger_info
,
373 resource_notify_flags_t flags
);
375 /*! @function trace_resource_violation
376 * @abstract trace violations on K32/64
378 * @param code the (K64) DBG_MACH_RESOURCE trace code
379 * @param ledger_info the entry tracking the resource limit
382 * Trace observed usage and corresponding limit on K32 or K64. On
383 * K32, a pair of trace points are used. The low nibble of the K32
384 * trace points must start at double the low nibble of the provided
385 * K64 trace point. For example:
386 #define LOGWRITES_VIOLATED 0x022
388 #define LOGWRITES_VIOLATED_K32A 0x024
389 #define LOGWRITES_VIOLATED_K32B 0x025
391 void trace_resource_violation(uint16_t code
,
392 struct ledger_entry_info
*ledger_info
);
394 #endif /* MACH_KERNEL_PRIVATE */
396 #endif /* XNU_KERNEL_PRIVATE */
398 #endif /* _KERN_POLICY_INTERNAL_H_ */