1/* 2 * Copyright (c) 2006 Apple Computer, 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 SYS_MEMORYSTATUS_H 30#define SYS_MEMORYSTATUS_H 31 32#include <stdint.h> 33#include <sys/time.h> 34#include <sys/proc.h> 35#include <sys/param.h> 36 37#define JETSAM_PRIORITY_REVISION 2 38 39#define JETSAM_PRIORITY_IDLE_HEAD -2 40/* The value -1 is an alias to JETSAM_PRIORITY_DEFAULT */ 41#define JETSAM_PRIORITY_IDLE 0 42#define JETSAM_PRIORITY_IDLE_DEFERRED 1 43#define JETSAM_PRIORITY_BACKGROUND_OPPORTUNISTIC 2 44#define JETSAM_PRIORITY_BACKGROUND 3 45#define JETSAM_PRIORITY_MAIL 4 46#define JETSAM_PRIORITY_PHONE 5 47#define JETSAM_PRIORITY_UI_SUPPORT 8 48#define JETSAM_PRIORITY_FOREGROUND_SUPPORT 9 49#define JETSAM_PRIORITY_FOREGROUND 10 50#define JETSAM_PRIORITY_AUDIO_AND_ACCESSORY 12 51#define JETSAM_PRIORITY_CONDUCTOR 13 52#define JETSAM_PRIORITY_HOME 16 53#define JETSAM_PRIORITY_EXECUTIVE 17 54#define JETSAM_PRIORITY_IMPORTANT 18 55#define JETSAM_PRIORITY_CRITICAL 19 56 57#define JETSAM_PRIORITY_MAX 21 58 59/* TODO - tune. This should probably be lower priority */ 60#define JETSAM_PRIORITY_DEFAULT 18 61#define JETSAM_PRIORITY_TELEPHONY 19 62 63/* Compatibility */ 64#define DEFAULT_JETSAM_PRIORITY 18 65 66#define DEFERRED_IDLE_EXIT_TIME_SECS 10 67 68#define KEV_MEMORYSTATUS_SUBCLASS 3 69 70enum { 71 kMemorystatusLevelNote = 1, 72 kMemorystatusSnapshotNote = 2, 73 kMemorystatusFreezeNote = 3, 74 kMemorystatusPressureNote = 4 75}; 76 77enum { 78 kMemorystatusLevelAny = -1, 79 kMemorystatusLevelNormal = 0, 80 kMemorystatusLevelWarning = 1, 81 kMemorystatusLevelUrgent = 2, 82 kMemorystatusLevelCritical = 3 83}; 84 85typedef struct memorystatus_priority_entry { 86 pid_t pid; 87 int32_t priority; 88 uint64_t user_data; 89 int32_t limit; 90 uint32_t state; 91} memorystatus_priority_entry_t; 92 93typedef struct memorystatus_kernel_stats { 94 uint32_t free_pages; 95 uint32_t active_pages; 96 uint32_t inactive_pages; 97 uint32_t throttled_pages; 98 uint32_t purgeable_pages; 99 uint32_t wired_pages; 100 uint32_t speculative_pages; 101 uint32_t filebacked_pages; 102 uint32_t anonymous_pages; 103 uint32_t compressor_pages; 104 uint64_t compressions; 105 uint64_t decompressions; 106 uint64_t total_uncompressed_pages_in_compressor; 107} memorystatus_kernel_stats_t; 108 109/* 110** This is a variable-length struct. 111** Allocate a buffer of the size returned by the sysctl, cast to a memorystatus_snapshot_t * 112*/ 113 114typedef struct jetsam_snapshot_entry { 115 pid_t pid; 116 char name[MAXCOMLEN+1]; 117 int32_t priority; 118 uint32_t pages; 119 uint32_t max_pages; 120 uint32_t state; 121 uint32_t killed; 122 uint64_t user_data; 123 uint8_t uuid[16]; 124 uint32_t fds; 125 uint32_t max_pages_lifetime; 126 uint32_t purgeable_pages; 127 struct timeval cpu_time; 128} memorystatus_jetsam_snapshot_entry_t; 129 130typedef struct jetsam_snapshot { 131 uint64_t snapshot_time; 132 uint64_t notification_time; 133 memorystatus_kernel_stats_t stats; 134 size_t entry_count; 135 memorystatus_jetsam_snapshot_entry_t entries[]; 136} memorystatus_jetsam_snapshot_t; 137 138typedef struct memorystatus_freeze_entry { 139 int32_t pid; 140 uint32_t flags; 141 uint32_t pages; 142} memorystatus_freeze_entry_t; 143 144/* TODO - deprecate; see <rdar://problem/12969599> */ 145#define kMaxSnapshotEntries 192 146 147/* State */ 148#define kMemorystatusSuspended 0x01 149#define kMemorystatusFrozen 0x02 150#define kMemorystatusWasThawed 0x04 151#define kMemorystatusTracked 0x08 152#define kMemorystatusSupportsIdleExit 0x10 153#define kMemorystatusDirty 0x20 154 155/* Cause */ 156enum { 157 kMemorystatusKilled = 1, 158 kMemorystatusKilledHiwat, 159 kMemorystatusKilledVnodes, 160 kMemorystatusKilledVMPageShortage, 161 kMemorystatusKilledVMThrashing, 162 kMemorystatusKilledFCThrashing, 163 kMemorystatusKilledPerProcessLimit, 164 kMemorystatusKilledDiagnostic, 165 kMemorystatusKilledIdleExit 166}; 167 168/* Temporary, to prevent the need for a linked submission of ReportCrash */ 169/* Remove when <rdar://problem/13210532> has been integrated */ 170enum { 171 kMemorystatusKilledVM = kMemorystatusKilledVMPageShortage 172}; 173 174/* Memorystatus control */ 175#define MEMORYSTATUS_BUFFERSIZE_MAX 65536 176 177#ifndef KERNEL 178int memorystatus_get_level(user_addr_t level); 179int memorystatus_control(uint32_t command, int32_t pid, uint32_t flags, void *buffer, size_t buffersize); 180#endif 181 182/* Commands */ 183#define MEMORYSTATUS_CMD_GET_PRIORITY_LIST 1 184#define MEMORYSTATUS_CMD_SET_PRIORITY_PROPERTIES 2 185#define MEMORYSTATUS_CMD_GET_JETSAM_SNAPSHOT 3 186#define MEMORYSTATUS_CMD_GET_PRESSURE_STATUS 4 187#define MEMORYSTATUS_CMD_SET_JETSAM_HIGH_WATER_MARK 5 188#define MEMORYSTATUS_CMD_SET_JETSAM_TASK_LIMIT 6 189 190/* Group Commands */ 191#define MEMORYSTATUS_CMD_GRP_SET_PROPERTIES 7 192 193#if PRIVATE 194/* Test commands */ 195 196/* Trigger forced jetsam */ 197#define MEMORYSTATUS_CMD_TEST_JETSAM 1000 198 199/* Panic on jetsam options */ 200typedef struct memorystatus_jetsam_panic_options { 201 uint32_t data; 202 uint32_t mask; 203} memorystatus_jetsam_panic_options_t; 204 205#define MEMORYSTATUS_CMD_SET_JETSAM_PANIC_BITS 1001 206#endif /* PRIVATE */ 207 208typedef struct memorystatus_priority_properties { 209 int32_t priority; 210 uint64_t user_data; 211} memorystatus_priority_properties_t; 212 213#ifdef XNU_KERNEL_PRIVATE 214 215/* p_memstat_state flags */ 216 217#define P_MEMSTAT_SUSPENDED 0x00000001 218#define P_MEMSTAT_FROZEN 0x00000002 219#define P_MEMSTAT_NORECLAIM 0x00000004 220#define P_MEMSTAT_ERROR 0x00000008 221#define P_MEMSTAT_LOCKED 0x00000010 222#define P_MEMSTAT_TERMINATED 0x00000020 223#define P_MEMSTAT_NOTFIED 0x00000040 224#define P_MEMSTAT_PRIORITYUPDATED 0x00000080 225#define P_MEMSTAT_FOREGROUND 0x00000100 226#define P_MEMSTAT_DIAG_SUSPENDED 0x00000200 227#define P_MEMSTAT_PRIOR_THAW 0x00000400 228#define P_MEMSTAT_MEMLIMIT_BACKGROUND 0x00000800 /* Task has a memory limit for when it's in the background. Used for a process' "high water mark".*/ 229#define P_MEMSTAT_INTERNAL 0x00001000 230#define P_MEMSTAT_FATAL_MEMLIMIT 0x00002000 /* cross this limit and the process is killed. Types: system-wide default task memory limit and per-task custom memory limit. */ 231 232extern void memorystatus_init(void) __attribute__((section("__TEXT, initcode"))); 233 234extern int memorystatus_add(proc_t p, boolean_t locked); 235extern int memorystatus_update(proc_t p, int priority, uint64_t user_data, boolean_t effective, boolean_t update_memlimit, int32_t memlimit, boolean_t memlimit_background, boolean_t is_fatal_limit); 236extern int memorystatus_remove(proc_t p, boolean_t locked); 237 238extern int memorystatus_dirty_track(proc_t p, uint32_t pcontrol); 239extern int memorystatus_dirty_set(proc_t p, boolean_t self, uint32_t pcontrol); 240extern int memorystatus_dirty_get(proc_t p); 241extern int memorystatus_dirty_clear(proc_t p, uint32_t pcontrol); 242 243extern int memorystatus_on_terminate(proc_t p); 244 245extern void memorystatus_on_suspend(proc_t p); 246extern void memorystatus_on_resume(proc_t p); 247extern void memorystatus_on_inactivity(proc_t p); 248 249extern void memorystatus_on_pageout_scan_end(void); 250 251/* Memorystatus kevent */ 252 253void memorystatus_kevent_init(lck_grp_t *grp, lck_attr_t *attr); 254 255int memorystatus_knote_register(struct knote *kn); 256void memorystatus_knote_unregister(struct knote *kn); 257 258#if CONFIG_JETSAM 259 260typedef enum memorystatus_policy { 261 kPolicyDefault = 0x0, 262 kPolicyMoreFree = 0x1, 263 kPolicyDiagnoseAll = 0x2, 264 kPolicyDiagnoseFirst = 0x4, 265 kPolicyDiagnoseActive = (kPolicyDiagnoseAll | kPolicyDiagnoseFirst), 266} memorystatus_policy_t; 267 268extern int memorystatus_jetsam_wakeup; 269extern unsigned int memorystatus_jetsam_running; 270 271boolean_t memorystatus_kill_on_VM_page_shortage(boolean_t async); 272boolean_t memorystatus_kill_on_VM_thrashing(boolean_t async); 273boolean_t memorystatus_kill_on_FC_thrashing(boolean_t async); 274boolean_t memorystatus_kill_on_vnode_limit(void); 275 276void memorystatus_on_ledger_footprint_exceeded(int warning, const int max_footprint_mb); 277void jetsam_on_ledger_cpulimit_exceeded(void); 278 279void memorystatus_pages_update(unsigned int pages_avail); 280 281#else /* CONFIG_JETSAM */ 282 283boolean_t memorystatus_idle_exit_from_VM(void); 284 285#endif /* !CONFIG_JETSAM */ 286 287#ifdef CONFIG_FREEZE 288 289#define FREEZE_PAGES_MIN ( 1 * 1024 * 1024 / PAGE_SIZE) 290#define FREEZE_PAGES_MAX (16 * 1024 * 1024 / PAGE_SIZE) 291 292#define FREEZE_SUSPENDED_THRESHOLD_LOW 2 293#define FREEZE_SUSPENDED_THRESHOLD_DEFAULT 4 294 295#define FREEZE_DAILY_MB_MAX 1024 296#define FREEZE_DAILY_PAGEOUTS_MAX (FREEZE_DAILY_MB_MAX * (1024 * 1024 / PAGE_SIZE)) 297 298typedef struct throttle_interval_t { 299 uint32_t mins; 300 uint32_t burst_multiple; 301 uint32_t pageouts; 302 uint32_t max_pageouts; 303 mach_timespec_t ts; 304 boolean_t throttle; 305} throttle_interval_t; 306 307extern boolean_t memorystatus_freeze_enabled; 308extern int memorystatus_freeze_wakeup; 309 310extern void memorystatus_freeze_init(void) __attribute__((section("__TEXT, initcode"))); 311 312#endif /* CONFIG_FREEZE */ 313 314#if VM_PRESSURE_EVENTS 315 316extern kern_return_t memorystatus_update_vm_pressure(boolean_t); 317 318#if CONFIG_MEMORYSTATUS 319extern int memorystatus_send_pressure_note(int pid); 320extern boolean_t memorystatus_is_foreground_locked(proc_t p); 321extern boolean_t memorystatus_bg_pressure_eligible(proc_t p); 322#endif /* CONFIG_MEMORYSTATUS */ 323 324#endif /* VM_PRESSURE_EVENTS */ 325 326#endif /* XNU_KERNEL_PRIVATE */ 327 328#endif /* SYS_MEMORYSTATUS_H */ 329