xref: /xnu-8792.61.2/osfmk/vm/vm_compressor_pager.h (revision 42e220869062b56f8d7d0726fd4c88954f87902c)
1 /*
2  * Copyright (c) 2013 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 #ifdef  XNU_KERNEL_PRIVATE
30 
31 #ifndef _VM_VM_COMPRESSOR_PAGER_H_
32 #define _VM_VM_COMPRESSOR_PAGER_H_
33 
34 #include <mach/mach_types.h>
35 #include <kern/kern_types.h>
36 #include <vm/vm_external.h>
37 
38 extern kern_return_t vm_compressor_pager_put(
39 	memory_object_t                 mem_obj,
40 	memory_object_offset_t          offset,
41 	ppnum_t                         ppnum,
42 	void                            **current_chead,
43 	char                            *scratch_buf,
44 	int                             *compressed_count_delta_p);
45 extern kern_return_t vm_compressor_pager_get(
46 	memory_object_t         mem_obj,
47 	memory_object_offset_t  offset,
48 	ppnum_t                 ppnum,
49 	int                     *my_fault_type,
50 	int                     flags,
51 	int                     *compressed_count_delta_p);
52 
53 #define C_DONT_BLOCK            0x01
54 #define C_KEEP                  0x02
55 #define C_KDP                   0x04
56 
57 extern unsigned int vm_compressor_pager_state_clr(
58 	memory_object_t         mem_obj,
59 	memory_object_offset_t  offset);
60 extern vm_external_state_t vm_compressor_pager_state_get(
61 	memory_object_t         mem_obj,
62 	memory_object_offset_t  offset);
63 
64 #define VM_COMPRESSOR_PAGER_STATE_GET(object, offset)                   \
65 	(((object)->internal &&                                 \
66 	  (object)->pager != NULL &&                                    \
67 	  !(object)->terminating &&                                     \
68 	  (object)->alive)                                              \
69 	 ? vm_compressor_pager_state_get((object)->pager,               \
70 	                                 (offset) + (object)->paging_offset) \
71 	 : VM_EXTERNAL_STATE_UNKNOWN)
72 
73 #define VM_COMPRESSOR_PAGER_STATE_CLR(object, offset)                   \
74 	MACRO_BEGIN                                                     \
75 	if ((object)->internal &&                                       \
76 	    (object)->pager != NULL &&                                  \
77 	    !(object)->terminating &&                                   \
78 	    (object)->alive) {                                          \
79 	        int _num_pages_cleared;                                 \
80 	        _num_pages_cleared =                                    \
81 	                vm_compressor_pager_state_clr(                  \
82 	                        (object)->pager,                        \
83 	                        (offset) + (object)->paging_offset);    \
84 	        if (_num_pages_cleared) {                               \
85 	                vm_compressor_pager_count((object)->pager,      \
86 	                                          -_num_pages_cleared,  \
87 	                                          FALSE, /* shared */   \
88 	                                          (object));            \
89 	        }                                                       \
90 	        if (_num_pages_cleared &&                               \
91 	            ((object)->purgable != VM_PURGABLE_DENY ||          \
92 	             (object)->vo_ledger_tag)) {                        \
93 	/* less compressed purgeable/tagged pages */    \
94 	                assert(_num_pages_cleared == 1);                \
95 	                vm_object_owner_compressed_update(              \
96 	                        (object),                               \
97 	                        -_num_pages_cleared);                   \
98 	        }                                                       \
99 	}                                                               \
100 	MACRO_END
101 
102 extern void vm_compressor_pager_transfer(
103 	memory_object_t         dst_mem_obj,
104 	memory_object_offset_t  dst_offset,
105 	memory_object_t         src_mem_obj,
106 	memory_object_offset_t  src_offset);
107 extern memory_object_offset_t vm_compressor_pager_next_compressed(
108 	memory_object_t         mem_obj,
109 	memory_object_offset_t  offset);
110 
111 extern bool osenvironment_is_diagnostics(void);
112 extern void vm_compressor_init(void);
113 extern int vm_compressor_put(ppnum_t pn, int *slot, void **current_chead, char *scratch_buf);
114 extern int vm_compressor_get(ppnum_t pn, int *slot, int flags);
115 extern int vm_compressor_free(int *slot, int flags);
116 extern unsigned int vm_compressor_pager_reap_pages(memory_object_t mem_obj, int flags);
117 extern unsigned int vm_compressor_pager_get_count(memory_object_t mem_obj);
118 extern void vm_compressor_pager_count(memory_object_t mem_obj,
119     int compressed_count_delta,
120     boolean_t shared_lock,
121     vm_object_t object);
122 
123 extern void vm_compressor_transfer(int *dst_slot_p, int *src_slot_p);
124 
125 #if CONFIG_FREEZE
126 extern kern_return_t vm_compressor_pager_relocate(memory_object_t mem_obj, memory_object_offset_t mem_offset, void **current_chead);
127 extern kern_return_t vm_compressor_relocate(void **current_chead, int *src_slot_p);
128 extern void vm_compressor_finished_filling(void **current_chead);
129 #endif /* CONFIG_FREEZE */
130 
131 #if DEVELOPMENT || DEBUG
132 extern kern_return_t vm_compressor_pager_inject_error(memory_object_t pager,
133     memory_object_offset_t offset);
134 extern void vm_compressor_inject_error(int *slot);
135 #endif /* DEVELOPMENT || DEBUG */
136 
137 #endif  /* _VM_VM_COMPRESSOR_PAGER_H_ */
138 
139 #endif  /* XNU_KERNEL_PRIVATE */
140