Exemple #1
0
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);
}
Exemple #3
0
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;
	}
}
Exemple #4
0
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);
}