]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/vm/vm_compressor_pager.h
xnu-4903.221.2.tar.gz
[apple/xnu.git] / osfmk / vm / vm_compressor_pager.h
index be903598687553b3cd09fc8f5db43c59cf947571..a42d1b9ee1bc52037189540b52702d0a64d458af 100644 (file)
@@ -40,18 +40,21 @@ extern kern_return_t vm_compressor_pager_put(
        memory_object_offset_t          offset,
        ppnum_t                         ppnum,
        void                            **current_chead,
-       char                            *scratch_buf);
+       char                            *scratch_buf,
+       int                             *compressed_count_delta_p);
 extern kern_return_t vm_compressor_pager_get(
        memory_object_t         mem_obj,
        memory_object_offset_t  offset,
        ppnum_t                 ppnum,
        int                     *my_fault_type,
-       int                     flags);
+       int                     flags,
+       int                     *compressed_count_delta_p);
 
 #define        C_DONT_BLOCK            0x01
 #define C_KEEP                 0x02
+#define C_KDP                  0x04
 
-extern void vm_compressor_pager_state_clr(
+extern unsigned int vm_compressor_pager_state_clr(
        memory_object_t         mem_obj,
        memory_object_offset_t  offset);
 extern vm_external_state_t vm_compressor_pager_state_get(
@@ -59,8 +62,7 @@ extern vm_external_state_t vm_compressor_pager_state_get(
        memory_object_offset_t  offset);
 
 #define VM_COMPRESSOR_PAGER_STATE_GET(object, offset)                  \
-       (((COMPRESSED_PAGER_IS_ACTIVE || DEFAULT_FREEZER_COMPRESSED_PAGER_IS_ACTIVE) && \
-         (object)->internal &&                                         \
+       (((object)->internal &&                                 \
          (object)->pager != NULL &&                                    \
          !(object)->terminating &&                                     \
          (object)->alive)                                              \
@@ -68,23 +70,62 @@ extern vm_external_state_t vm_compressor_pager_state_get(
                                         (offset) + (object)->paging_offset) \
         : VM_EXTERNAL_STATE_UNKNOWN)
 
-#define VM_COMPRESSOR_PAGER_STATE_CLR(object, offset)          \
-       MACRO_BEGIN                                             \
-       if ((COMPRESSED_PAGER_IS_ACTIVE || DEFAULT_FREEZER_COMPRESSED_PAGER_IS_ACTIVE) &&       \
-           (object)->internal &&                               \
-           (object)->pager != NULL &&                          \
-           !(object)->terminating &&                           \
-           (object)->alive) {                                  \
-               vm_compressor_pager_state_clr(                  \
-                       (object)->pager,                        \
-                       (offset) + (object)->paging_offset);    \
-       }                                                       \
+#define VM_COMPRESSOR_PAGER_STATE_CLR(object, offset)                  \
+       MACRO_BEGIN                                                     \
+       if ((object)->internal &&                                       \
+           (object)->pager != NULL &&                                  \
+           !(object)->terminating &&                                   \
+           (object)->alive) {                                          \
+               int _num_pages_cleared;                                 \
+               _num_pages_cleared =                                    \
+                       vm_compressor_pager_state_clr(                  \
+                               (object)->pager,                        \
+                               (offset) + (object)->paging_offset);    \
+               if (_num_pages_cleared) {                               \
+                       vm_compressor_pager_count((object)->pager,      \
+                                                 -_num_pages_cleared,  \
+                                                 FALSE, /* shared */   \
+                                                 (object));            \
+               }                                                       \
+               if (_num_pages_cleared &&                               \
+                   ((object)->purgable != VM_PURGABLE_DENY ||          \
+                    (object)->vo_ledger_tag)) {                        \
+                       /* less compressed purgeable/tagged pages */    \
+                       assert(_num_pages_cleared == 1);                \
+                       vm_object_owner_compressed_update(              \
+                               (object),                               \
+                               -_num_pages_cleared);                   \
+               }                                                       \
+       }                                                               \
        MACRO_END
 
+extern void vm_compressor_pager_transfer(
+       memory_object_t         dst_mem_obj,
+       memory_object_offset_t  dst_offset,
+       memory_object_t         src_mem_obj,
+       memory_object_offset_t  src_offset);
+extern memory_object_offset_t vm_compressor_pager_next_compressed(
+       memory_object_t         mem_obj,
+       memory_object_offset_t  offset);
+
 extern void vm_compressor_init(void);
 extern int vm_compressor_put(ppnum_t pn, int *slot, void **current_chead, char *scratch_buf);
 extern int vm_compressor_get(ppnum_t pn, int *slot, int flags);
-extern void vm_compressor_free(int *slot);
+extern int vm_compressor_free(int *slot, int flags);
+extern unsigned int vm_compressor_pager_reap_pages(memory_object_t mem_obj, int flags);
+extern unsigned int vm_compressor_pager_get_count(memory_object_t mem_obj);
+extern void vm_compressor_pager_count(memory_object_t mem_obj,
+                                     int compressed_count_delta,
+                                     boolean_t shared_lock,
+                                     vm_object_t object);
+
+extern void vm_compressor_transfer(int *dst_slot_p, int        *src_slot_p);
+
+#if CONFIG_FREEZE
+extern kern_return_t vm_compressor_pager_relocate(memory_object_t mem_obj, memory_object_offset_t mem_offset, void **current_chead);
+extern kern_return_t vm_compressor_relocate(void **current_chead, int *src_slot_p);
+extern void vm_compressor_finished_filling(void **current_chead);
+#endif /* CONFIG_FREEZE */
 
 #endif /* _VM_VM_COMPRESSOR_PAGER_H_ */