X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/99c3a10404e5d1ef94397ab4df5a8b74711fc4d3..7e41aa883dd258f888d0470250eead40a53ef1f5:/osfmk/kern/hibernate.c diff --git a/osfmk/kern/hibernate.c b/osfmk/kern/hibernate.c index c88c0fd1e..c15eb172e 100644 --- a/osfmk/kern/hibernate.c +++ b/osfmk/kern/hibernate.c @@ -41,68 +41,96 @@ #include #include #include +#include /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +boolean_t need_to_unlock_decompressor = FALSE; + kern_return_t -hibernate_setup(IOHibernateImageHeader * header, - uint32_t free_page_ratio, - uint32_t free_page_time, - boolean_t vmflush, - hibernate_page_list_t ** page_list_ret, - hibernate_page_list_t ** page_list_wired_ret, - hibernate_page_list_t ** page_list_pal_ret, - boolean_t * encryptedswap) +hibernate_alloc_page_lists( + hibernate_page_list_t ** page_list_ret, + hibernate_page_list_t ** page_list_wired_ret, + hibernate_page_list_t ** page_list_pal_ret) { + kern_return_t retval = KERN_SUCCESS; + hibernate_page_list_t * page_list = NULL; hibernate_page_list_t * page_list_wired = NULL; hibernate_page_list_t * page_list_pal = NULL; - uint32_t gobble_count; - *page_list_ret = NULL; - *page_list_wired_ret = NULL; - *page_list_pal_ret = NULL; - - if (vmflush) - hibernate_flush_memory(); + page_list = hibernate_page_list_allocate(TRUE); + if (!page_list) { - page_list = hibernate_page_list_allocate(); - if (!page_list) - return (KERN_RESOURCE_SHORTAGE); - page_list_wired = hibernate_page_list_allocate(); + retval = KERN_RESOURCE_SHORTAGE; + goto done; + } + page_list_wired = hibernate_page_list_allocate(FALSE); if (!page_list_wired) { - kfree(page_list, page_list->list_size); - return (KERN_RESOURCE_SHORTAGE); + kfree(page_list, page_list->list_size); + + retval = KERN_RESOURCE_SHORTAGE; + goto done; } - page_list_pal = hibernate_page_list_allocate(); + page_list_pal = hibernate_page_list_allocate(FALSE); if (!page_list_pal) { - kfree(page_list, page_list->list_size); - kfree(page_list_wired, page_list_wired->list_size); - return (KERN_RESOURCE_SHORTAGE); + kfree(page_list, page_list->list_size); + kfree(page_list_wired, page_list_wired->list_size); + + retval = KERN_RESOURCE_SHORTAGE; + goto done; } + *page_list_ret = page_list; + *page_list_wired_ret = page_list_wired; + *page_list_pal_ret = page_list_pal; - *encryptedswap = dp_encryption; +done: + return (retval); - // pages we could force out to reduce hibernate image size - gobble_count = (uint32_t)((((uint64_t) page_list->page_count) * ((uint64_t) free_page_ratio)) / 100); +} - // no failures hereafter +extern int sync_internal(void); - hibernate_processor_setup(header); +kern_return_t +hibernate_setup(IOHibernateImageHeader * header, + boolean_t vmflush, + hibernate_page_list_t * page_list __unused, + hibernate_page_list_t * page_list_wired __unused, + hibernate_page_list_t * page_list_pal __unused) +{ + kern_return_t retval = KERN_SUCCESS; - HIBLOG("hibernate_alloc_pages flags %08x, gobbling %d pages\n", - header->processorFlags, gobble_count); + hibernate_create_paddr_map(); - if (gobble_count) - hibernate_gobble_pages(gobble_count, free_page_time); + hibernate_reset_stats(); + + if (vmflush && (COMPRESSED_PAGER_IS_ACTIVE || dp_isssd)) { + + sync_internal(); + + if (COMPRESSED_PAGER_IS_ACTIVE) { + vm_decompressor_lock(); + need_to_unlock_decompressor = TRUE; + } + hibernate_flush_memory(); + } - *page_list_ret = page_list; - *page_list_wired_ret = page_list_wired; - *page_list_pal_ret = page_list_pal; + // no failures hereafter - return (KERN_SUCCESS); + hibernate_processor_setup(header); + + HIBLOG("hibernate_alloc_pages act %d, inact %d, anon %d, throt %d, spec %d, wire %d, wireinit %d\n", + vm_page_active_count, vm_page_inactive_count, + vm_page_anonymous_count, vm_page_throttled_count, vm_page_speculative_count, + vm_page_wire_count, vm_page_wire_count_initial); + + if (retval != KERN_SUCCESS && need_to_unlock_decompressor == TRUE) { + need_to_unlock_decompressor = FALSE; + vm_decompressor_unlock(); + } + return (retval); } kern_return_t @@ -119,6 +147,12 @@ hibernate_teardown(hibernate_page_list_t * page_list, if (page_list_pal) kfree(page_list_pal, page_list_pal->list_size); + if (COMPRESSED_PAGER_IS_ACTIVE) { + if (need_to_unlock_decompressor == TRUE) { + need_to_unlock_decompressor = FALSE; + vm_decompressor_unlock(); + } + vm_compressor_delay_trim(); + } return (KERN_SUCCESS); } -