X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0b4c1975fb5e4eccf1012a35081f7e7799b81046..4b17d6b6e417f714551ec129064745ea9919780e:/osfmk/kern/hibernate.c diff --git a/osfmk/kern/hibernate.c b/osfmk/kern/hibernate.c index b56317bf9..431c4795c 100644 --- a/osfmk/kern/hibernate.c +++ b/osfmk/kern/hibernate.c @@ -51,29 +51,36 @@ hibernate_setup(IOHibernateImageHeader * header, boolean_t vmflush, hibernate_page_list_t ** page_list_ret, hibernate_page_list_t ** page_list_wired_ret, - boolean_t * encryptedswap) + hibernate_page_list_t ** page_list_pal_ret) { 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) + if (vmflush && dp_isssd) hibernate_flush_memory(); - page_list = hibernate_page_list_allocate(); + page_list = hibernate_page_list_allocate(TRUE); if (!page_list) return (KERN_RESOURCE_SHORTAGE); - page_list_wired = hibernate_page_list_allocate(); + page_list_wired = hibernate_page_list_allocate(FALSE); if (!page_list_wired) { kfree(page_list, page_list->list_size); return (KERN_RESOURCE_SHORTAGE); } - - *encryptedswap = dp_encryption; + 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); + } // 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); @@ -82,21 +89,25 @@ hibernate_setup(IOHibernateImageHeader * header, hibernate_processor_setup(header); - HIBLOG("hibernate_alloc_pages flags %08x, gobbling %d pages\n", - header->processorFlags, gobble_count); - if (gobble_count) hibernate_gobble_pages(gobble_count, free_page_time); - *page_list_ret = page_list; - *page_list_wired_ret = page_list_wired; + 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); + + *page_list_ret = page_list; + *page_list_wired_ret = page_list_wired; + *page_list_pal_ret = page_list_pal; return (KERN_SUCCESS); } kern_return_t hibernate_teardown(hibernate_page_list_t * page_list, - hibernate_page_list_t * page_list_wired) + hibernate_page_list_t * page_list_wired, + hibernate_page_list_t * page_list_pal) { hibernate_free_gobble_pages(); @@ -104,6 +115,8 @@ hibernate_teardown(hibernate_page_list_t * page_list, kfree(page_list, page_list->list_size); if (page_list_wired) kfree(page_list_wired, page_list_wired->list_size); + if (page_list_pal) + kfree(page_list_pal, page_list_pal->list_size); return (KERN_SUCCESS); }