if (whichqs != 0) { uvm_unlock_fpageq(s); return; }
s = uvm_lock_fpageq();
uvm_pageidlezero(){	struct vm_page *pg;	struct pgfreelist *pgfl;	int free_list, s, firstbucket;	static int nextbucket;	s = uvm_lock_fpageq();	firstbucket = nextbucket;	do {		if (whichqs != 0) {			uvm_unlock_fpageq(s);			return;		}		if (uvmexp.zeropages >= UVM_PAGEZERO_TARGET) {			uvm.page_idle_zero = FALSE;			uvm_unlock_fpageq(s);			return;		}		for (free_list = 0; free_list < VM_NFREELIST; free_list++) {			pgfl = &uvm.page_free[free_list];			while ((pg = TAILQ_FIRST(&pgfl->pgfl_buckets[			    nextbucket].pgfl_queues[PGFL_UNKNOWN])) != NULL) {				if (whichqs != 0) {					uvm_unlock_fpageq(s);					return;				}				TAILQ_REMOVE(&pgfl->pgfl_buckets[				    nextbucket].pgfl_queues[PGFL_UNKNOWN],				    pg, pageq);				uvmexp.free--;				uvm_unlock_fpageq(s);#ifdef PMAP_PAGEIDLEZERO				if (PMAP_PAGEIDLEZERO(VM_PAGE_TO_PHYS(pg)) ==				    FALSE) {					/*					 * The machine-dependent code detected					 * some reason for us to abort zeroing					 * pages, probably because there is a					 * process now ready to run.					 */					s = uvm_lock_fpageq();					TAILQ_INSERT_HEAD(&pgfl->pgfl_buckets[					    nextbucket].pgfl_queues[					    PGFL_UNKNOWN], pg, pageq);					uvmexp.free++;					uvmexp.zeroaborts++;					uvm_unlock_fpageq(s);					return;				}#else				pmap_zero_page(VM_PAGE_TO_PHYS(pg));#endif /* PMAP_PAGEIDLEZERO */				pg->flags |= PG_ZERO;				s = uvm_lock_fpageq();				TAILQ_INSERT_HEAD(&pgfl->pgfl_buckets[				    nextbucket].pgfl_queues[PGFL_ZEROS],				    pg, pageq);				uvmexp.free++;				uvmexp.zeropages++;			}		}		nextbucket = (nextbucket + 1) & uvmexp.colormask;	} while (nextbucket != firstbucket);	uvm_unlock_fpageq(s);}