static int vm_page_zero_idle(void) { static int free_rover; vm_page_t m; mtx_lock_spin(&vm_page_queue_free_mtx); zero_state = 0; m = vm_pageq_find(PQ_FREE, free_rover, FALSE); if (m != NULL && (m->flags & PG_ZERO) == 0) { vm_pageq_remove_nowakeup(m); mtx_unlock_spin(&vm_page_queue_free_mtx); pmap_zero_page_idle(m); mtx_lock_spin(&vm_page_queue_free_mtx); m->flags |= PG_ZERO; vm_pageq_enqueue(PQ_FREE + m->pc, m); ++vm_page_zero_count; ++cnt_prezero; if (vm_page_zero_count >= ZIDLE_HI(cnt.v_free_count)) zero_state = 1; } free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK; mtx_unlock_spin(&vm_page_queue_free_mtx); return (1); }
/* * vm_pagezero should sleep for a longer time when idlezero is disabled or * when there is an excess of zeroed pages. */ static int vm_page_zero_time(void) { if (idlezero_enable == 0) return (LONG_SLEEP_TIME); if (vm_page_zero_count >= ZIDLE_HI(vmstats.v_free_count)) return (LONG_SLEEP_TIME); return (DEFAULT_SLEEP_TIME); }
static void vm_page_zero_idle(void) { mtx_assert(&vm_page_queue_free_mtx, MA_OWNED); zero_state = 0; if (vm_phys_zero_pages_idle()) { if (vm_page_zero_count >= ZIDLE_HI(cnt.v_free_count)) zero_state = 1; } }
static int vm_page_zero_check(void) { if (!idlezero_enable) return (0); /* * Attempt to maintain approximately 1/2 of our free pages in a * PG_ZERO'd state. Add some hysteresis to (attempt to) avoid * generally zeroing a page when the system is near steady-state. * Otherwise we might get 'flutter' during disk I/O / IPC or * fast sleeps. We also do not want to be continuously zeroing * pages because doing so may flush our L1 and L2 caches too much. */ if (zero_state && vm_page_zero_count >= ZIDLE_LO(cnt.v_free_count)) return (0); if (vm_page_zero_count >= ZIDLE_HI(cnt.v_free_count)) return (0); return (1); }
/* * Attempt to maintain approximately 1/2 of our free pages in a * PG_ZERO'd state. Add some hysteresis to (attempt to) avoid * generally zeroing a page when the system is near steady-state. * Otherwise we might get 'flutter' during disk I/O / IPC or * fast sleeps. We also do not want to be continuously zeroing * pages because doing so may flush our L1 and L2 caches too much. * * Returns non-zero if pages should be zerod. */ static int vm_page_zero_check(void) { if (idlezero_enable == 0) return (0); if (zero_state == 0) { /* * Wait for the count to fall to LO before starting * to zero pages. */ if (vm_page_zero_count <= ZIDLE_LO(vmstats.v_free_count)) zero_state = 1; } else { /* * Once we are zeroing pages wait for the count to * increase to HI before we stop zeroing pages. */ if (vm_page_zero_count >= ZIDLE_HI(vmstats.v_free_count)) zero_state = 0; } return (zero_state); }