- hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
-
- hibernate_stats.cd_total_free++;
- }
- }
-
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_throttled);
- while (m && !vm_page_queue_end(&vm_page_queue_throttled, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_THROTTLED_Q);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanInactive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- count_discard_inactive++;
- discard = discard_all;
- }
- else
- count_throttled++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
-
- if (discard) hibernate_discard_page(m);
- m = next;
- }
-
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_anonymous);
- while (m && !vm_page_queue_end(&vm_page_queue_anonymous, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_INACTIVE_INTERNAL_Q);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanInactive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (m->vmp_dirty)
- count_discard_purgeable++;
- else
- count_discard_inactive++;
- discard = discard_all;
- }
- else
- count_anonymous++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (discard) hibernate_discard_page(m);
- m = next;
- }
-
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_cleaned);
- while (m && !vm_page_queue_end(&vm_page_queue_cleaned, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_INACTIVE_CLEANED_Q);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanInactive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (m->vmp_dirty)
- count_discard_purgeable++;
- else
- count_discard_cleaned++;
- discard = discard_all;
- }
- else
- count_cleaned++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (discard) hibernate_discard_page(m);
- m = next;
- }
-
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_active);
- while (m && !vm_page_queue_end(&vm_page_queue_active, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_ACTIVE_Q);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanActive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (m->vmp_dirty)
- count_discard_purgeable++;
- else
- count_discard_active++;
- discard = discard_all;
- }
- else
- count_active++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (discard) hibernate_discard_page(m);
- m = next;
- }
-
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_inactive);
- while (m && !vm_page_queue_end(&vm_page_queue_inactive, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_INACTIVE_EXTERNAL_Q);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanInactive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (m->vmp_dirty)
- count_discard_purgeable++;
- else
- count_discard_inactive++;
- discard = discard_all;
- }
- else
- count_inactive++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (discard) hibernate_discard_page(m);
- m = next;
- }
- /* XXX FBDP TODO: secluded queue */
-
- for( i = 0; i <= VM_PAGE_MAX_SPECULATIVE_AGE_Q; i++ )
- {
- m = (vm_page_t) vm_page_queue_first(&vm_page_queue_speculative[i].age_q);
- while (m && !vm_page_queue_end(&vm_page_queue_speculative[i].age_q, (vm_page_queue_entry_t)m))
- {
- assert(m->vmp_q_state == VM_PAGE_ON_SPECULATIVE_Q);
- assertf(m->vmp_q_state == VM_PAGE_ON_SPECULATIVE_Q,
- "Bad page: %p (0x%x:0x%x) on queue %d has state: %d (Discard: %d, Preflight: %d)",
- m, m->vmp_pageq.next, m->vmp_pageq.prev, i, m->vmp_q_state, discard, preflight);
-
- next = (vm_page_t)VM_PAGE_UNPACK_PTR(m->vmp_pageq.next);
- discard = FALSE;
- if ((kIOHibernateModeDiscardCleanInactive & gIOHibernateMode)
- && hibernate_consider_discard(m, preflight))
- {
- if (!preflight) hibernate_page_bitset(page_list, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- count_discard_speculative++;
- discard = discard_all;
- }
- else
- count_speculative++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- if (discard) hibernate_discard_page(m);
- m = next;
- }
- }
-
- vm_page_queue_iterate(&compressor_object->memq, m, vm_page_t, vmp_listq)
- {
- assert(m->vmp_q_state == VM_PAGE_USED_BY_COMPRESSOR);
-
- count_compressor++;
- count_wire--;
- if (!preflight) hibernate_page_bitset(page_list_wired, TRUE, VM_PAGE_GET_PHYS_PAGE(m));
- }
-
- if (preflight == FALSE && discard_all == TRUE) {
- KDBG(IOKDBG_CODE(DBG_HIBERNATE, 12) | DBG_FUNC_START);
-
- HIBLOG("hibernate_teardown started\n");
- count_discard_vm_struct_pages = hibernate_teardown_vm_structs(page_list, page_list_wired);
- HIBLOG("hibernate_teardown completed - discarded %d\n", count_discard_vm_struct_pages);
-
- pages -= count_discard_vm_struct_pages;
- count_wire -= count_discard_vm_struct_pages;
-
- hibernate_stats.cd_vm_struct_pages_unneeded = count_discard_vm_struct_pages;
-
- KDBG(IOKDBG_CODE(DBG_HIBERNATE, 12) | DBG_FUNC_END);
- }
-
- if (!preflight) {
- // pull wired from hibernate_bitmap
- bitmap = &page_list->bank_bitmap[0];
- bitmap_wired = &page_list_wired->bank_bitmap[0];
- for (bank = 0; bank < page_list->bank_count; bank++)
- {
- for (i = 0; i < bitmap->bitmapwords; i++)
- bitmap->bitmap[i] = bitmap->bitmap[i] | ~bitmap_wired->bitmap[i];
- bitmap = (hibernate_bitmap_t *) &bitmap->bitmap [bitmap->bitmapwords];
- bitmap_wired = (hibernate_bitmap_t *) &bitmap_wired->bitmap[bitmap_wired->bitmapwords];