X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/b0d623f7f2ae71ed96e60569f61f9a9a27016e80..4b17d6b6e417f714551ec129064745ea9919780e:/osfmk/kern/hibernate.c?ds=inline diff --git a/osfmk/kern/hibernate.c b/osfmk/kern/hibernate.c index 3bf72594e..431c4795c 100644 --- a/osfmk/kern/hibernate.c +++ b/osfmk/kern/hibernate.c @@ -42,36 +42,45 @@ #include #include - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ kern_return_t hibernate_setup(IOHibernateImageHeader * header, - uint32_t free_page_ratio, - uint32_t free_page_time, + 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, - 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 && 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); @@ -80,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(); @@ -102,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); }