xref: /xnu-12377.61.12/osfmk/vm/vm_compressor_internal.h (revision 4d495c6e23c53686cf65f45067f79024cf5dcee8)
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