]> git.saurik.com Git - apple/xnu.git/blame - osfmk/kern/policy_internal.h
xnu-4903.270.47.tar.gz
[apple/xnu.git] / osfmk / kern / policy_internal.h
CommitLineData
39037602
A
1/*
2 * Copyright (c) 2015-2016 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
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.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
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.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29#ifndef _KERN_POLICY_INTERNAL_H_
30#define _KERN_POLICY_INTERNAL_H_
31
32/*
33 * Interfaces for functionality implemented in task_ or thread_policy subsystem
34 */
35
36#ifdef XNU_KERNEL_PRIVATE
37
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>
44
45/*
46 ******************************
47 * XNU-internal functionality
48 ******************************
49 */
50
51/*
52 * Get effective policy
53 * Only for use by relevant subsystem, should never be passed into a setter!
54 */
55extern int proc_get_effective_task_policy(task_t task, int flavor);
56extern int proc_get_effective_thread_policy(thread_t thread, int flavor);
57
58/* Set task 'nice' value */
59extern kern_return_t task_importance(task_t task, integer_t importance);
60
61/* value */
62#define TASK_POLICY_DISABLE 0x0
63#define TASK_POLICY_ENABLE 0x1
64
65/* category */
66#define TASK_POLICY_INTERNAL 0x0
67#define TASK_POLICY_EXTERNAL 0x1
68#define TASK_POLICY_ATTRIBUTE 0x2
69
70/* for tracing */
71#define TASK_POLICY_TASK 0x4
72#define TASK_POLICY_THREAD 0x8
73
74/* flavors (also DBG_IMPORTANCE subclasses 0x20 - 0x3F) */
75
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
81
82/* internal, task only */
83#define TASK_POLICY_DARWIN_BG_IOPOL 0x27
84
85/* task-only attributes */
86#define TASK_POLICY_TAL 0x28
87#define TASK_POLICY_BOOST 0x29
88#define TASK_POLICY_ROLE 0x2A
89/* unused 0x2B */
90#define TASK_POLICY_TERMINATED 0x2C
91#define TASK_POLICY_NEW_SOCKETS_BG 0x2D
0a7de745 92#define TASK_POLICY_SUP_ACTIVE 0x2E
39037602
A
93#define TASK_POLICY_LATENCY_QOS 0x2F
94#define TASK_POLICY_THROUGH_QOS 0x30
95#define TASK_POLICY_WATCHERS_BG 0x31
96
97#define TASK_POLICY_SFI_MANAGED 0x34
98#define TASK_POLICY_ALL_SOCKETS_BG 0x37
99
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 */
102
103/* thread-only attributes */
104#define TASK_POLICY_PIDBIND_BG 0x32
105/* unused 0x33 */
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 */
d9a64523 109#define TASK_POLICY_QOS_WORKQ_OVERRIDE 0x3B
39037602
A
110#define TASK_POLICY_QOS_PROMOTE 0x3C
111#define TASK_POLICY_QOS_IPC_OVERRIDE 0x3D
d9a64523 112// was TASK_POLICY_QOS_SYNC_IPC_OVERRIDE 0x3E
39037602
A
113
114#define TASK_POLICY_MAX 0x3F
115
116/* The main entrance to task policy is this function */
117extern void proc_set_task_policy(task_t task, int category, int flavor, int value);
118extern int proc_get_task_policy(task_t task, int category, int flavor);
119
120extern void proc_set_thread_policy(thread_t thread, int category, int flavor, int value);
121extern int proc_get_thread_policy(thread_t thread, int category, int flavor);
122
123/* For use when you don't already hold a reference on the target thread */
124extern void proc_set_thread_policy_with_tid(task_t task, uint64_t tid, int category, int flavor, int value);
125
126
127/* Functions used by kern_resource.c */
128extern boolean_t thread_has_qos_policy(thread_t thread);
129extern kern_return_t thread_remove_qos_policy(thread_t thread);
130
131extern int proc_darwin_role_to_task_role(int darwin_role, int* task_role);
132extern int proc_task_role_to_darwin_role(int task_role);
133
134/* Functions used by kern_exec.c */
135extern void task_set_main_thread_qos(task_t task, thread_t main_thread);
136extern void proc_set_task_spawnpolicy(task_t task, int apptype, int qos_clamp, int role,
0a7de745 137 ipc_port_t * portwatch_ports, int portwatch_count);
d190cdc3 138extern void proc_inherit_task_role(task_t new_task, task_t old_task);
39037602
A
139
140/* IO Throttle tiers */
141#define THROTTLE_LEVEL_NONE -1
0a7de745 142#define THROTTLE_LEVEL_TIER0 0 /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */
39037602
A
143
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 */
148
149#define THROTTLE_LEVEL_START 0
150#define THROTTLE_LEVEL_END 3
151
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
155
156#define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER2
157#define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1
158
159#if CONFIG_IOSCHED
160#define IOSCHED_METADATA_TIER THROTTLE_LEVEL_TIER1
161#endif /* CONFIG_IOSCHED */
162
163extern int proc_get_darwinbgstate(task_t task, uint32_t *flagsp);
164extern int task_get_apptype(task_t);
165
166#ifdef MACH_BSD
167extern void proc_apply_task_networkbg(void * bsd_info, thread_t thread);
168#endif /* MACH_BSD */
169
170/* Functions used by pthread_shims.c */
d9a64523 171extern int proc_thread_qos_add_override(task_t task, thread_t thread, uint64_t tid,
0a7de745
A
172 int override_qos, boolean_t first_override_for_resource,
173 user_addr_t resource, int resource_type);
d9a64523 174extern int proc_thread_qos_remove_override(task_t task, thread_t thread, uint64_t tid,
0a7de745 175 user_addr_t resource, int resource_type);
39037602 176
d9a64523
A
177extern void thread_reset_workq_qos(thread_t thread, uint32_t qos);
178extern void thread_set_workq_override(thread_t thread, uint32_t qos);
179extern void thread_set_workq_pri(thread_t thread, thread_qos_t qos, integer_t priority, integer_t policy);
180extern uint8_t thread_workq_pri_for_qos(thread_qos_t qos) __pure2;
181extern thread_qos_t thread_workq_qos_for_pri(int priority);
39037602
A
182
183extern int
184task_get_default_manager_qos(task_t task);
185
186extern void proc_thread_qos_deallocate(thread_t thread);
187
188extern int task_clear_cpuusage(task_t task, int cpumon_entitled);
189
5ba3f43e
A
190#if CONFIG_EMBEDDED
191/* Taskwatch related external BSD interface */
192extern int proc_lf_pidbind(task_t curtask, uint64_t tid, task_t target_task, int bind);
193#endif /* CONFIG_EMBEDDED */
39037602
A
194
195/* Importance inheritance functions not under IMPORTANCE_INHERITANCE */
196extern void task_importance_mark_donor(task_t task, boolean_t donating);
197extern void task_importance_reset(task_t task);
d9a64523 198extern void task_importance_init_from_parent(task_t new_task, task_t parent_task);
39037602
A
199
200#if IMPORTANCE_INHERITANCE
201extern boolean_t task_is_importance_donor(task_t task);
202extern boolean_t task_is_importance_receiver_type(task_t task);
203
204extern int task_importance_hold_file_lock_assertion(task_t target_task, uint32_t count);
205extern int task_importance_drop_file_lock_assertion(task_t target_task, uint32_t count);
206
207extern int task_importance_hold_legacy_external_assertion(task_t target_task, uint32_t count);
208extern int task_importance_drop_legacy_external_assertion(task_t target_task, uint32_t count);
209#endif /* IMPORTANCE_INHERITANCE */
210
211/* Functions used by process_policy.c */
212extern boolean_t proc_task_is_tal(task_t task);
213
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
222
223extern int proc_get_task_ruse_cpu(task_t task, uint32_t *policyp, uint8_t *percentagep,
0a7de745 224 uint64_t *intervalp, uint64_t *deadlinep);
39037602 225extern int proc_set_task_ruse_cpu(task_t task, uint32_t policy, uint8_t percentage,
0a7de745 226 uint64_t interval, uint64_t deadline, int cpumon_entitled);
39037602
A
227extern int task_suspend_cpumon(task_t task);
228extern int task_resume_cpumon(task_t task);
229extern int proc_clear_task_ruse_cpu(task_t task, int cpumon_entitled);
230
231extern int proc_apply_resource_actions(void * p, int type, int action);
232extern int proc_restore_resource_actions(void * p, int type, int action);
233
234/* VM/Jetsam importance callouts */
235extern int task_low_mem_privileged_listener(task_t task, boolean_t new_value, boolean_t *old_value);
236extern boolean_t task_has_been_notified(task_t task, int pressurelevel);
237extern boolean_t task_used_for_purging(task_t task, int pressurelevel);
238extern void task_mark_has_been_notified(task_t task, int pressurelevel);
239extern void task_mark_used_for_purging(task_t task, int pressurelevel);
240extern void task_clear_has_been_notified(task_t task, int pressurelevel);
241extern void task_clear_used_for_purging(task_t task);
242extern int task_importance_estimate(task_t task);
243
39037602 244extern kern_return_t thread_policy_set_internal(thread_t thread, thread_policy_flavor_t flavor,
0a7de745 245 thread_policy_t policy_info, mach_msg_type_number_t count);
39037602 246
d9a64523
A
247extern boolean_t thread_recompute_user_promotion_locked(thread_t thread);
248extern thread_qos_t thread_user_promotion_qos_for_pri(int priority);
5ba3f43e
A
249
250extern void thread_set_exec_promotion(thread_t thread);
251extern void thread_clear_exec_promotion(thread_t thread);
252
39037602
A
253/* for IPC override management */
254extern void thread_add_ipc_override(thread_t thread, uint32_t qos_override);
255extern void thread_update_ipc_override(thread_t thread, uint32_t qos_override);
256extern void thread_drop_ipc_override(thread_t thread);
d9a64523
A
257
258/* for ipc_pset.c */
259extern thread_qos_t thread_get_requested_qos(thread_t thread, int *relpri);
39037602
A
260
261/*
262 ******************************
263 * Mach-internal functionality
264 ******************************
265 */
266
267#ifdef MACH_KERNEL_PRIVATE
268
269/*
270 * this exports the internal policy update calls
271 * for IPC importance hooks into task policy
272 */
273
274typedef struct task_pend_token {
275 uint32_t tpt_update_sockets :1,
0a7de745
A
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;
39037602
A
284} *task_pend_token_t;
285
286extern void task_policy_update_complete_unlocked(task_t task, task_pend_token_t pend_token);
287extern void task_update_boost_locked(task_t task, boolean_t boost_active, task_pend_token_t pend_token);
288
289extern void thread_policy_update_locked(thread_t thread, task_pend_token_t pend_token);
290extern void thread_policy_update_complete_unlocked(thread_t task, task_pend_token_t pend_token);
291
292typedef struct {
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;
298
299extern const qos_policy_params_t thread_qos_policy_params;
300
301/* for task policy tracepoints */
302/* Convenience functions for munging a policy bitfield into a tracepoint */
303uintptr_t threquested_0(thread_t thread);
304uintptr_t threquested_1(thread_t thread);
305uintptr_t theffective_0(thread_t thread);
306uintptr_t theffective_1(thread_t thread);
307extern uint32_t tpending(task_pend_token_t pend_token);
308
309extern void proc_iopol_to_tier(int iopolicy, int *tier, int *passive);
310extern int proc_tier_to_iopol(int tier, int passive);
311
312extern void set_thread_iotier_override(thread_t, int policy);
313
314extern integer_t task_grab_latency_qos(task_t task);
315extern void task_policy_create(task_t task, task_t parent_task);
316extern void thread_policy_create(thread_t thread);
317
318extern boolean_t task_is_daemon(task_t task);
319extern boolean_t task_is_app(task_t task);
320
5ba3f43e
A
321#if CONFIG_EMBEDDED
322/* Taskwatch related external interface */
323extern void thead_remove_taskwatch(thread_t thread);
324extern void task_removewatchers(task_t task);
325extern void task_watch_init(void);
326
327typedef struct task_watcher task_watch_t;
328#endif /* CONFIG_EMBEDDED */
39037602
A
329
330#if IMPORTANCE_INHERITANCE
331extern boolean_t task_is_marked_importance_donor(task_t task);
332extern boolean_t task_is_marked_importance_receiver(task_t task);
333
334extern boolean_t task_is_marked_importance_denap_receiver(task_t task);
335#endif /* IMPORTANCE_INHERITANCE */
336
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 */
39037602
A
343
344extern void proc_init_cpumon_params(void);
345extern void thread_policy_init(void);
346
347int task_compute_main_thread_qos(task_t task);
348
349/* thread policy internals */
350extern void thread_policy_reset(thread_t thread);
351extern kern_return_t thread_set_mode_and_absolute_pri(thread_t thread, integer_t policy, integer_t priority);
352
353extern void thread_policy_update_tasklocked(thread_t thread, integer_t priority, integer_t max_priority, task_pend_token_t pend_token);
354
355#include "mach/resource_notify.h" /* from MIG */
356
357/*! @function send_resource_violation
0a7de745
A
358 * @abstract send usage monitor violation notification
359 *
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
363 *
364 * @result KERN_SUCCESS if the message was sent
365 *
366 * @discussion
367 * send_resource_violation() calls the corresponding MIG routine
368 * over the host special RESOURCE_NOTIFY port.
369 */
39037602 370kern_return_t send_resource_violation(typeof(send_cpu_usage_violation),
0a7de745
A
371 task_t violator,
372 struct ledger_entry_info *ledger_info,
373 resource_notify_flags_t flags);
39037602
A
374
375/*! @function trace_resource_violation
0a7de745
A
376 * @abstract trace violations on K32/64
377 *
378 * @param code the (K64) DBG_MACH_RESOURCE trace code
379 * @param ledger_info the entry tracking the resource limit
380 *
381 * @discussion
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
387 * ...
388 #define LOGWRITES_VIOLATED_K32A 0x024
389 #define LOGWRITES_VIOLATED_K32B 0x025
390 */
39037602 391void trace_resource_violation(uint16_t code,
0a7de745 392 struct ledger_entry_info *ledger_info);
39037602
A
393
394#endif /* MACH_KERNEL_PRIVATE */
395
396#endif /* XNU_KERNEL_PRIVATE */
397
398#endif /* _KERN_POLICY_INTERNAL_H_ */