X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/3903760236c30e3b5ace7a4eefac3a269d68957c..0a7de7458d150b5d4dffc935ba399be265ef0a1a:/osfmk/kern/policy_internal.h diff --git a/osfmk/kern/policy_internal.h b/osfmk/kern/policy_internal.h index 59a7b9a79..0a2e47e35 100644 --- a/osfmk/kern/policy_internal.h +++ b/osfmk/kern/policy_internal.h @@ -89,7 +89,7 @@ extern kern_return_t task_importance(task_t task, integer_t importance); /* unused 0x2B */ #define TASK_POLICY_TERMINATED 0x2C #define TASK_POLICY_NEW_SOCKETS_BG 0x2D -/* unused 0x2E */ +#define TASK_POLICY_SUP_ACTIVE 0x2E #define TASK_POLICY_LATENCY_QOS 0x2F #define TASK_POLICY_THROUGH_QOS 0x30 #define TASK_POLICY_WATCHERS_BG 0x31 @@ -106,8 +106,10 @@ extern kern_return_t task_importance(task_t task, integer_t importance); #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_WORKQ_OVERRIDE 0x3B #define TASK_POLICY_QOS_PROMOTE 0x3C #define TASK_POLICY_QOS_IPC_OVERRIDE 0x3D +// was TASK_POLICY_QOS_SYNC_IPC_OVERRIDE 0x3E #define TASK_POLICY_MAX 0x3F @@ -132,11 +134,12 @@ extern int proc_task_role_to_darwin_role(int task_role); /* 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); + ipc_port_t * portwatch_ports, int 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 */ @@ -165,22 +168,17 @@ extern void proc_apply_task_networkbg(void * bsd_info, thread_t thread); #endif /* MACH_BSD */ /* 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); @@ -189,10 +187,15 @@ extern void proc_thread_qos_deallocate(thread_t thread); extern int task_clear_cpuusage(task_t task, int cpumon_entitled); +#if CONFIG_EMBEDDED +/* Taskwatch related external BSD interface */ +extern int proc_lf_pidbind(task_t curtask, uint64_t tid, task_t target_task, int bind); +#endif /* CONFIG_EMBEDDED */ /* 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); @@ -218,9 +221,9 @@ extern boolean_t proc_task_is_tal(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); @@ -238,32 +241,22 @@ extern void task_clear_has_been_notified(task_t task, int pressurelevel); extern void task_clear_used_for_purging(task_t task); extern int task_importance_estimate(task_t task); -/* - * Allocate/assign a single work interval ID for a thread, - * and support deallocating it. - */ -extern kern_return_t thread_policy_create_work_interval(thread_t thread, uint64_t *work_interval_id); -extern kern_return_t thread_policy_destroy_work_interval(thread_t thread, uint64_t work_interval_id); - 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); - -struct promote_token { - uint16_t pt_basepri; - uint16_t pt_qos; -}; + thread_policy_t policy_info, mach_msg_type_number_t count); -#define PROMOTE_TOKEN_INIT ((struct promote_token){.pt_basepri = 0, .pt_qos = 0}) +extern boolean_t thread_recompute_user_promotion_locked(thread_t thread); +extern thread_qos_t thread_user_promotion_qos_for_pri(int priority); -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); +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 uint32_t thread_get_ipc_override(thread_t thread); + +/* for ipc_pset.c */ +extern thread_qos_t thread_get_requested_qos(thread_t thread, int *relpri); /* ****************************** @@ -280,13 +273,14 @@ extern uint32_t thread_get_ipc_override(thread_t thread); 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_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; } *task_pend_token_t; extern void task_policy_update_complete_unlocked(task_t task, task_pend_token_t pend_token); @@ -324,6 +318,14 @@ extern void thread_policy_create(thread_t thread); extern boolean_t task_is_daemon(task_t task); extern boolean_t task_is_app(task_t task); +#if CONFIG_EMBEDDED +/* Taskwatch related external interface */ +extern void thead_remove_taskwatch(thread_t thread); +extern void task_removewatchers(task_t task); +extern void task_watch_init(void); + +typedef struct task_watcher task_watch_t; +#endif /* CONFIG_EMBEDDED */ #if IMPORTANCE_INHERITANCE extern boolean_t task_is_marked_importance_donor(task_t task); @@ -338,7 +340,6 @@ extern boolean_t task_is_marked_importance_denap_receiver(task_t task); #define TASK_RUSECPU_FLAGS_DEADLINE 0x04 #define TASK_RUSECPU_FLAGS_FATAL_CPUMON 0x08 /* CPU usage monitor violations are fatal */ #define TASK_RUSECPU_FLAGS_FATAL_WAKEUPSMON 0x10 /* wakeups monitor violations are fatal */ -#define TASK_RUSECPU_FLAGS_PHYS_FOOTPRINT_EXCEPTION 0x20 /* exceeding physical footprint generates EXC_RESOURCE */ extern void proc_init_cpumon_params(void); extern void thread_policy_init(void); @@ -354,41 +355,41 @@ extern void thread_policy_update_tasklocked(thread_t thread, integer_t priority, #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 */