#include <mach/task_policy.h>
#include <kern/task.h>
#include <kern/ledger.h>
-
+#include <sys/kdebug.h>
+#include <kern/sched_prim.h>
/*
******************************
* XNU-internal functionality
/* flavors (also DBG_IMPORTANCE subclasses 0x20 - 0x3F) */
/* internal or external, thread or task */
-#define TASK_POLICY_DARWIN_BG 0x21
-#define TASK_POLICY_IOPOL 0x22
-#define TASK_POLICY_IO 0x23
-#define TASK_POLICY_PASSIVE_IO 0x24
+#define TASK_POLICY_DARWIN_BG IMP_TASK_POLICY_DARWIN_BG
+#define TASK_POLICY_IOPOL IMP_TASK_POLICY_IOPOL
+#define TASK_POLICY_IO IMP_TASK_POLICY_IO
+#define TASK_POLICY_PASSIVE_IO IMP_TASK_POLICY_PASSIVE_IO
/* internal, task only */
-#define TASK_POLICY_DARWIN_BG_IOPOL 0x27
+#define TASK_POLICY_DARWIN_BG_IOPOL IMP_TASK_POLICY_DARWIN_BG_IOPOL
/* task-only attributes */
-#define TASK_POLICY_TAL 0x28
-#define TASK_POLICY_BOOST 0x29
-#define TASK_POLICY_ROLE 0x2A
+#define TASK_POLICY_TAL IMP_TASK_POLICY_TAL
+#define TASK_POLICY_BOOST IMP_TASK_POLICY_BOOST
+#define TASK_POLICY_ROLE IMP_TASK_POLICY_ROLE
/* unused 0x2B */
-#define TASK_POLICY_TERMINATED 0x2C
-#define TASK_POLICY_NEW_SOCKETS_BG 0x2D
-/* unused 0x2E */
-#define TASK_POLICY_LATENCY_QOS 0x2F
-#define TASK_POLICY_THROUGH_QOS 0x30
-#define TASK_POLICY_WATCHERS_BG 0x31
-
-#define TASK_POLICY_SFI_MANAGED 0x34
-#define TASK_POLICY_ALL_SOCKETS_BG 0x37
-
-#define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS 0x39 /* latency as value1, throughput as value2 */
-#define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS 0x3A /* latency as value1, throughput as value2 */
+#define TASK_POLICY_TERMINATED IMP_TASK_POLICY_TERMINATED
+#define TASK_POLICY_NEW_SOCKETS_BG IMP_TASK_POLICY_NEW_SOCKETS_BG
+#define TASK_POLICY_SUP_ACTIVE IMP_TASK_POLICY_SUP_ACTIVE
+#define TASK_POLICY_LATENCY_QOS IMP_TASK_POLICY_LATENCY_QOS
+#define TASK_POLICY_THROUGH_QOS IMP_TASK_POLICY_THROUGH_QOS
+#define TASK_POLICY_WATCHERS_BG IMP_TASK_POLICY_WATCHERS_BG
+#define TASK_POLICY_SFI_MANAGED IMP_TASK_POLICY_SFI_MANAGED
+#define TASK_POLICY_ALL_SOCKETS_BG IMP_TASK_POLICY_ALL_SOCKETS_BG
+
+#define TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS IMP_TASK_POLICY_BASE_LATENCY_AND_THROUGHPUT_QOS /* latency as value1, throughput as value2 */
+#define TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS IMP_TASK_POLICY_OVERRIDE_LATENCY_AND_THROUGHPUT_QOS /* latency as value1, throughput as value2 */
/* thread-only attributes */
-#define TASK_POLICY_PIDBIND_BG 0x32
+#define TASK_POLICY_PIDBIND_BG IMP_TASK_POLICY_PIDBIND_BG
/* unused 0x33 */
-#define TASK_POLICY_QOS 0x35
-#define TASK_POLICY_QOS_OVERRIDE 0x36
-#define TASK_POLICY_QOS_AND_RELPRIO 0x38 /* QoS as value1, relative priority as value2 */
-#define TASK_POLICY_QOS_PROMOTE 0x3C
-#define TASK_POLICY_QOS_IPC_OVERRIDE 0x3D
-#define TASK_POLICY_QOS_SYNC_IPC_OVERRIDE 0x3E
+#define TASK_POLICY_QOS 0x35 /* Used only as a convenience for getter */
+#define TASK_POLICY_QOS_OVERRIDE IMP_TASK_POLICY_QOS_OVERRIDE
+#define TASK_POLICY_QOS_AND_RELPRIO IMP_TASK_POLICY_QOS_AND_RELPRIO /* QoS as value1, relative priority as value2 */
+#define TASK_POLICY_QOS_WORKQ_OVERRIDE IMP_TASK_POLICY_QOS_WORKQ_OVERRIDE
+#define TASK_POLICY_QOS_PROMOTE IMP_TASK_POLICY_QOS_PROMOTE
+#define TASK_POLICY_QOS_KEVENT_OVERRIDE IMP_TASK_POLICY_QOS_KEVENT_OVERRIDE
+#define TASK_POLICY_QOS_SERVICER_OVERRIDE IMP_TASK_POLICY_QOS_SERVICER_OVERRIDE
#define TASK_POLICY_MAX 0x3F
/* Functions used by kern_exec.c */
extern void task_set_main_thread_qos(task_t task, thread_t main_thread);
-extern void proc_set_task_spawnpolicy(task_t task, int apptype, int qos_clamp, int role,
- ipc_port_t * portwatch_ports, int portwatch_count);
+extern void proc_set_task_spawnpolicy(task_t task, thread_t thread, int apptype, int qos_clamp, int role,
+ ipc_port_t * portwatch_ports, uint32_t portwatch_count);
extern void proc_inherit_task_role(task_t new_task, task_t old_task);
/* IO Throttle tiers */
#define THROTTLE_LEVEL_NONE -1
-#define THROTTLE_LEVEL_TIER0 0 /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */
+#define THROTTLE_LEVEL_TIER0 0 /* IOPOL_NORMAL, IOPOL_DEFAULT, IOPOL_PASSIVE */
#define THROTTLE_LEVEL_THROTTLED 1
#define THROTTLE_LEVEL_TIER1 1 /* IOPOL_STANDARD */
#define THROTTLE_LEVEL_COMPRESSOR_TIER1 THROTTLE_LEVEL_TIER1
#define THROTTLE_LEVEL_COMPRESSOR_TIER2 THROTTLE_LEVEL_TIER2
-#if CONFIG_EMBEDDED
-#define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER3
-#define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1
-#else
#define THROTTLE_LEVEL_PAGEOUT_THROTTLED THROTTLE_LEVEL_TIER2
#define THROTTLE_LEVEL_PAGEOUT_UNTHROTTLED THROTTLE_LEVEL_TIER1
-#endif
#if CONFIG_IOSCHED
#define IOSCHED_METADATA_TIER THROTTLE_LEVEL_TIER1
extern void proc_apply_task_networkbg(void * bsd_info, thread_t thread);
#endif /* MACH_BSD */
+extern void thread_freeze_base_pri(thread_t thread);
+extern bool thread_unfreeze_base_pri(thread_t thread);
+
/* Functions used by pthread_shims.c */
-extern boolean_t proc_thread_qos_add_override(task_t task, thread_t thread, uint64_t tid,
- int override_qos, boolean_t first_override_for_resource,
- user_addr_t resource, int resource_type);
-extern int proc_thread_qos_add_override_check_owner(thread_t thread, int override_qos,
- boolean_t first_override_for_resource, user_addr_t resource, int resource_type,
- user_addr_t user_lock_addr, mach_port_name_t user_lock_owner);
-extern boolean_t proc_thread_qos_remove_override(task_t task, thread_t thread, uint64_t tid,
- user_addr_t resource, int resource_type);
-extern boolean_t proc_thread_qos_reset_override(task_t task, thread_t thread, uint64_t tid,
- user_addr_t resource, int resource_type);
-extern int proc_thread_qos_squash_override(thread_t thread, user_addr_t resource, int resource_type);
-
-extern kern_return_t
-thread_set_workq_qos(thread_t thread, int qos_tier, int relprio);
-extern kern_return_t
-thread_set_workq_pri(thread_t thread, integer_t priority, integer_t policy);
+extern int proc_thread_qos_add_override(task_t task, thread_t thread, uint64_t tid,
+ int override_qos, boolean_t first_override_for_resource,
+ user_addr_t resource, int resource_type);
+extern int proc_thread_qos_remove_override(task_t task, thread_t thread, uint64_t tid,
+ user_addr_t resource, int resource_type);
+
+extern void thread_reset_workq_qos(thread_t thread, uint32_t qos);
+extern void thread_set_workq_override(thread_t thread, uint32_t qos);
+extern void thread_set_workq_pri(thread_t thread, thread_qos_t qos, integer_t priority, integer_t policy);
+extern uint8_t thread_workq_pri_for_qos(thread_qos_t qos) __pure2;
+extern thread_qos_t thread_workq_qos_for_pri(int priority);
extern int
task_get_default_manager_qos(task_t task);
/* Importance inheritance functions not under IMPORTANCE_INHERITANCE */
extern void task_importance_mark_donor(task_t task, boolean_t donating);
extern void task_importance_reset(task_t task);
+extern void task_importance_init_from_parent(task_t new_task, task_t parent_task);
#if IMPORTANCE_INHERITANCE
extern boolean_t task_is_importance_donor(task_t task);
#define TASK_POLICY_RESOURCE_ATTRIBUTE_DEFAULT TASK_POLICY_RESOURCE_ATTRIBUTE_NONE
extern int proc_get_task_ruse_cpu(task_t task, uint32_t *policyp, uint8_t *percentagep,
- uint64_t *intervalp, uint64_t *deadlinep);
+ uint64_t *intervalp, uint64_t *deadlinep);
extern int proc_set_task_ruse_cpu(task_t task, uint32_t policy, uint8_t percentage,
- uint64_t interval, uint64_t deadline, int cpumon_entitled);
+ uint64_t interval, uint64_t deadline, int cpumon_entitled);
extern int task_suspend_cpumon(task_t task);
extern int task_resume_cpumon(task_t task);
extern int proc_clear_task_ruse_cpu(task_t task, int cpumon_entitled);
extern int task_importance_estimate(task_t task);
extern kern_return_t thread_policy_set_internal(thread_t thread, thread_policy_flavor_t flavor,
- thread_policy_t policy_info, mach_msg_type_number_t count);
+ thread_policy_t policy_info, mach_msg_type_number_t count);
-struct promote_token {
- uint16_t pt_basepri;
- uint16_t pt_qos;
-};
-
-#define PROMOTE_TOKEN_INIT ((struct promote_token){.pt_basepri = 0, .pt_qos = 0})
-
-extern void thread_user_promotion_add(thread_t thread, thread_t promoter, struct promote_token* promote_token);
-extern void thread_user_promotion_update(thread_t thread, thread_t promoter, struct promote_token* promote_token);
-extern void thread_user_promotion_drop(thread_t thread);
-
-/* for thread exec promotion */
-#define EXEC_BOOST_PRIORITY 31
+extern boolean_t thread_recompute_user_promotion_locked(thread_t thread);
+extern boolean_t thread_recompute_kernel_promotion_locked(thread_t thread);
+extern thread_qos_t thread_user_promotion_qos_for_pri(int priority);
extern void thread_set_exec_promotion(thread_t thread);
extern void thread_clear_exec_promotion(thread_t thread);
-/* for IPC override management */
-extern void thread_add_ipc_override(thread_t thread, uint32_t qos_override);
-extern void thread_update_ipc_override(thread_t thread, uint32_t qos_override);
-extern void thread_drop_ipc_override(thread_t thread);
-extern void thread_add_sync_ipc_override(thread_t thread);
-extern void thread_drop_sync_ipc_override(thread_t thread);
-extern uint32_t thread_get_ipc_override(thread_t thread);
+/* for servicer override management (workloops only) */
+extern void thread_add_servicer_override(thread_t thread, uint32_t qos_override);
+extern void thread_update_servicer_override(thread_t thread, uint32_t qos_override);
+extern void thread_drop_servicer_override(thread_t thread);
+
+/* for generic kevent override management */
+extern void thread_add_kevent_override(thread_t thread, uint32_t qos_override);
+extern void thread_update_kevent_override(thread_t thread, uint32_t qos_override);
+extern void thread_drop_kevent_override(thread_t thread);
+
+/* for ipc_pset.c */
+extern thread_qos_t thread_get_requested_qos(thread_t thread, int *relpri);
/*
******************************
typedef struct task_pend_token {
uint32_t tpt_update_sockets :1,
- tpt_update_timers :1,
- tpt_update_watchers :1,
- tpt_update_live_donor :1,
- tpt_update_coal_sfi :1,
- tpt_update_throttle :1,
- tpt_update_thread_sfi :1,
- tpt_force_recompute_pri :1,
- tpt_update_tg_ui_flag :1;
+ tpt_update_timers :1,
+ tpt_update_watchers :1,
+ tpt_update_live_donor :1,
+ tpt_update_coal_sfi :1,
+ tpt_update_throttle :1,
+ tpt_update_thread_sfi :1,
+ tpt_force_recompute_pri :1,
+ tpt_update_tg_ui_flag :1,
+ tpt_update_turnstile :1;
} *task_pend_token_t;
extern void task_policy_update_complete_unlocked(task_t task, task_pend_token_t pend_token);
#include "mach/resource_notify.h" /* from MIG */
/*! @function send_resource_violation
- @abstract send usage monitor violation notification
-
- @param violator the task (process) violating its CPU budget
- @param ledger_info the entry tracking the resource limit
- @param flags see constants for type in sys/reason.h
-
- @result KERN_SUCCESS if the message was sent
-
- @discussion
- send_resource_violation() calls the corresponding MIG routine
- over the host special RESOURCE_NOTIFY port.
-*/
+ * @abstract send usage monitor violation notification
+ *
+ * @param violator the task (process) violating its CPU budget
+ * @param ledger_info the entry tracking the resource limit
+ * @param flags see constants for type in sys/reason.h
+ *
+ * @result KERN_SUCCESS if the message was sent
+ *
+ * @discussion
+ * send_resource_violation() calls the corresponding MIG routine
+ * over the host special RESOURCE_NOTIFY port.
+ */
kern_return_t send_resource_violation(typeof(send_cpu_usage_violation),
- task_t violator,
- struct ledger_entry_info *ledger_info,
- resource_notify_flags_t flags);
+ task_t violator,
+ struct ledger_entry_info *ledger_info,
+ resource_notify_flags_t flags);
/*! @function trace_resource_violation
- @abstract trace violations on K32/64
-
- @param code the (K64) DBG_MACH_RESOURCE trace code
- @param ledger_info the entry tracking the resource limit
-
- @discussion
- Trace observed usage and corresponding limit on K32 or K64. On
- K32, a pair of trace points are used. The low nibble of the K32
- trace points must start at double the low nibble of the provided
- K64 trace point. For example:
- #define LOGWRITES_VIOLATED 0x022
- ...
- #define LOGWRITES_VIOLATED_K32A 0x024
- #define LOGWRITES_VIOLATED_K32B 0x025
-*/
+ * @abstract trace violations on K32/64
+ *
+ * @param code the (K64) DBG_MACH_RESOURCE trace code
+ * @param ledger_info the entry tracking the resource limit
+ *
+ * @discussion
+ * Trace observed usage and corresponding limit on K32 or K64. On
+ * K32, a pair of trace points are used. The low nibble of the K32
+ * trace points must start at double the low nibble of the provided
+ * K64 trace point. For example:
+ #define LOGWRITES_VIOLATED 0x022
+ * ...
+ #define LOGWRITES_VIOLATED_K32A 0x024
+ #define LOGWRITES_VIOLATED_K32B 0x025
+ */
void trace_resource_violation(uint16_t code,
- struct ledger_entry_info *ledger_info);
+ struct ledger_entry_info *ledger_info);
#endif /* MACH_KERNEL_PRIVATE */