X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/39236c6e673c41db228275375ab7fdb0f837b292..d9a64523371fa019c4575bb400cbbc3a50ac9903:/osfmk/vm/vm_compressor_pager.h diff --git a/osfmk/vm/vm_compressor_pager.h b/osfmk/vm/vm_compressor_pager.h index be9035986..a42d1b9ee 100644 --- a/osfmk/vm/vm_compressor_pager.h +++ b/osfmk/vm/vm_compressor_pager.h @@ -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_ */