1 /* 2 * Copyright (c) 2023 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 _VM_VM_COMPRESSOR_INTERNAL_H_ 30 #define _VM_VM_COMPRESSOR_INTERNAL_H_ 31 32 #include <stdbool.h> 33 #include <stdint.h> 34 #include <kern/locks.h> 35 #include <kern/thread.h> 36 #include <mach/boolean.h> 37 #include <sys/cdefs.h> 38 #include <vm/vm_compressor_xnu.h> 39 40 __BEGIN_DECLS 41 #ifdef XNU_KERNEL_PRIVATE 42 43 #pragma mark Compressor Globals 44 45 extern int vm_compressor_mode; 46 extern boolean_t vm_compressor_is_active; 47 extern boolean_t vm_compressor_available; 48 49 extern boolean_t fastwake_recording_in_progress; 50 extern int compaction_swapper_inited; 51 extern int compaction_swapper_running; 52 extern uint64_t vm_swap_put_failures; 53 54 extern int c_overage_swapped_count; 55 extern int c_overage_swapped_limit; 56 57 extern queue_head_t c_minor_list_head; 58 extern queue_head_t c_age_list_head; 59 extern queue_head_t c_major_list_head; 60 extern queue_head_t c_early_swapout_list_head; 61 extern queue_head_t c_regular_swapout_list_head; 62 extern queue_head_t c_late_swapout_list_head; 63 extern queue_head_t c_swappedout_list_head; 64 extern queue_head_t c_swappedout_sparse_list_head; 65 66 extern uint64_t first_c_segment_to_warm_generation_id; 67 extern uint64_t last_c_segment_to_warm_generation_id; 68 extern boolean_t hibernate_flushing; 69 extern boolean_t hibernate_no_swapspace; 70 extern boolean_t hibernate_in_progress_with_pinned_swap; 71 extern boolean_t hibernate_flush_timed_out; 72 73 extern uint32_t c_age_count; 74 extern uint32_t c_early_swappedin_count, c_regular_swappedin_count, c_late_swappedin_count; 75 extern uint32_t c_early_swapout_count, c_regular_swapout_count, c_late_swapout_count; 76 extern uint32_t c_swappedout_count; 77 extern uint32_t c_swappedout_sparse_count; 78 extern uint32_t c_swapio_count; 79 extern uint32_t c_minor_count; 80 extern uint32_t c_major_count; 81 extern uint32_t c_bad_count; 82 extern uint32_t c_empty_count; 83 extern uint32_t c_filling_count; 84 extern uint32_t c_segment_count; 85 extern uint32_t c_segments_nearing_limit; 86 extern uint32_t c_segments_limit; 87 88 extern uint32_t c_segment_pages_compressed; 89 extern uint32_t c_segment_pages_compressed_nearing_limit; 90 extern uint32_t c_segment_pages_compressed_limit; 91 #if CONFIG_FREEZE 92 extern bool freezer_incore_cseg_acct; 93 extern int32_t c_segment_pages_compressed_incore; 94 extern int32_t c_segment_pages_compressed_incore_late_swapout; 95 #endif 96 97 extern uint32_t c_segment_svp_in_hash; 98 extern uint32_t c_segment_svp_hash_succeeded; 99 extern uint32_t c_segment_svp_hash_failed; 100 extern uint32_t c_segment_svp_zero_compressions; 101 extern uint32_t c_segment_svp_nonzero_compressions; 102 extern uint32_t c_segment_svp_zero_decompressions; 103 extern uint32_t c_segment_svp_nonzero_decompressions; 104 105 #if MACH_KERNEL_PRIVATE 106 107 #pragma mark Internal Compressor Functions 108 109 void vm_consider_waking_compactor_swapper(void); 110 void vm_consider_swapping(void); 111 void vm_compressor_flush(void); 112 void c_seg_free(c_segment_t); 113 void c_seg_free_locked(c_segment_t); 114 void c_seg_need_delayed_compaction(c_segment_t, boolean_t); 115 void c_seg_update_task_owner(c_segment_t, task_t); 116 void vm_compressor_record_warmup_start(void); 117 void vm_compressor_record_warmup_end(void); 118 119 int vm_wants_task_throttled(task_t); 120 121 extern void vm_compaction_swapper_do_init(void); 122 extern void vm_compressor_swap_init(void); 123 extern lck_rw_t c_master_lock; 124 125 #define PAGE_REPLACEMENT_DISALLOWED(enable) (enable == TRUE ? lck_rw_lock_shared(&c_master_lock) : lck_rw_done(&c_master_lock)) 126 #define PAGE_REPLACEMENT_ALLOWED(enable) (enable == TRUE ? lck_rw_lock_exclusive(&c_master_lock) : lck_rw_done(&c_master_lock)) 127 128 #if ENCRYPTED_SWAP 129 extern void vm_swap_decrypt(c_segment_t, bool); 130 #endif /* ENCRYPTED_SWAP */ 131 132 extern void vm_swap_free(uint64_t); 133 134 extern void c_seg_swapin_requeue(c_segment_t, boolean_t, boolean_t, boolean_t); 135 extern int c_seg_swapin(c_segment_t, boolean_t, boolean_t); 136 extern void c_seg_wait_on_busy(c_segment_t); 137 extern void c_seg_trim_tail(c_segment_t); 138 extern void c_seg_switch_state(c_segment_t, int, boolean_t); 139 140 extern void c_seg_insert_into_q(queue_head_t *, c_segment_t); 141 142 extern uint64_t vm_compressor_compute_elapsed_msecs(clock_sec_t, clock_nsec_t, clock_sec_t, clock_nsec_t); 143 144 uint32_t vm_compressor_get_encode_scratch_size(void) __pure2; 145 uint32_t vm_compressor_get_decode_scratch_size(void) __pure2; 146 147 #if RECORD_THE_COMPRESSED_DATA 148 extern void c_compressed_record_init(void); 149 extern void c_compressed_record_write(char *, int); 150 #endif 151 152 #endif /* MACH_KERNEL_PRIVATE */ 153 #endif /* XNU_KERNEL_PRIVATE */ 154 __END_DECLS 155 #endif /* _VM_VM_COMPRESSOR_INTERNAL_H_ */ 156