Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /* * Copyright (c) 2024 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. The rights granted to you under the License * may not be used to create, or enable the creation or redistribution of, * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include <stdbool.h> #include <stdint.h> #include <sys/_types/_pid_t.h> #pragma once #if !XNU_KERNEL_PRIVATE #error "Including xnu-private header in unexpected target" #endif /* !XNU_KERNEL_PRIVATE */ __BEGIN_DECLS /* TODO: migrate other xnu-private interfaces from kern_memorystatus.h */ /* * Query if this process is state-managed by RunningBoard. */ typedef struct proc * proc_t; extern bool memorystatus_get_proc_is_managed(proc_t proc); /* * Return the minimum number of available pages jetsam requires before it * begins killing non-idle processes. This is useful for some pageout * mechanisms to avoid deadlock. */ extern uint32_t memorystatus_get_critical_page_shortage_threshold(void); /* * Return the minimum number of available pages jetsam requires before it * begins killing idle processes. This is consumed by the vm pressure * notification system in the absence of the compressor. */ extern uint32_t memorystatus_get_idle_exit_page_shortage_threshold(void); /* * Return the minimum number of available pages jetsam requires before it * begins killing processes which have violated their soft memory limit. This * is consumed by the vm pressure notification system in the absence of the * compressor. */ extern uint32_t memorystatus_get_soft_memlimit_page_shortage_threshold(void); /* * Return the minumum number of available pages jetsam requires before it * begins reaping long-idle processes. */ extern uint32_t memorystatus_get_reaper_page_shortage_threshold(void); /* * Return the current number of available pages in the system. */ extern uint32_t memorystatus_get_available_page_count(void); /* * Set the available page count and consider engaging response measures (e.g. * waking jetsam thread/pressure-notification thread). */ extern void memorystatus_update_available_page_count(uint32_t available_pages); /* * Override fast-jetsam support. If override is enabled, fast-jetsam will be * disabled. */ extern void memorystatus_fast_jetsam_override(bool enable_override); /* * Callout to jetsam. If pid is -1, we wake up the memorystatus thread to do asynchronous kills. * For any other pid we try to kill that process synchronously. */ extern bool memorystatus_kill_on_zone_map_exhaustion(pid_t pid); /* * Kill a single process due to compressor space shortage. */ extern bool memorystatus_kill_on_VM_compressor_space_shortage(bool async); /* * Asynchronously kill a single process due to VM Pageout Starvation (i.e. * a "stuck" external pageout thread). */ extern void memorystatus_kill_on_vps_starvation(void); /* * Synchronously kill a single process due to vnode exhaustion */ extern bool memorystatus_kill_on_vnode_exhaustion(void); /* * Wake up the memorystatus thread so it can do async kills. * The memorystatus thread will keep killing until the system is * considered healthy. */ extern void memorystatus_thread_wake(void); /* * Respond to compressor exhaustion by waking the jetsam thread or * synchronously invoking a no-paging-space action. */ extern void memorystatus_respond_to_compressor_exhaustion(void); /* * Respond to swap exhaustion by waking the jetsam thread or * synchronously invoking a no-paging-space action. */ extern void memorystatus_respond_to_swap_exhaustion(void); __END_DECLS |