Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Nov 2001 15:15:22 -0800
From:      Luigi Rizzo <rizzo@aciri.org>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        current@FreeBSD.org
Subject:   Re: where is the idle_loop in current ?
Message-ID:  <20011123151522.B58238@iguana.aciri.org>
In-Reply-To: <XFMail.011025043121.jhb@FreeBSD.org>
References:  <20011025120306.A57392@iguana.aciri.org> <XFMail.011025043121.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In order to port my network polling stuff to current, I was looking
at ways to do things within the "idle loop", and was pointed to
the idle_proc() or vm_pagezero() .  I am listing below the code
for these kernel threads (I hope the name is the correct one).

I do not follow, however, the reason why these two threads periodically
give up the CPU, given that their priority is (i guess) lower than
any other thread in the system, so any event that should wake up
a thread would immediately cause their preemption.
Where am i wrong ?

	cheers
	luigi



	static void
	vm_pagezero(void)
	{
	    struct thread *td = curthread;
	    struct rtprio rtp;
	    int pages = 0;

	    rtp.prio = RTP_PRIO_MAX;
	    rtp.type = RTP_PRIO_IDLE;
	    mtx_lock_spin(&sched_lock); 
	    rtp_to_pri(&rtp, &td->td_ksegrp->kg_pri);
	    mtx_unlock_spin(&sched_lock);

	    for (;;) {
		if (vm_page_zero_check()) {
		    pages += vm_page_zero_idle();
		    if (pages > idlezero_maxrun) {
			mtx_lock_spin(&sched_lock);
			setrunqueue(td);
			td->td_proc->p_stats->p_ru.ru_nvcsw++;
			mi_switch();
			mtx_unlock_spin(&sched_lock);
			pages = 0;
		    }
		} else {
		    tsleep(&zero_state, PPAUSE, "pgzero", hz * 300);
		    pages = 0;
		}
	    }
	}

	/*
	 * idle process context
	 */
	static void
	idle_proc(void *dummy)
	{
	    for (;;) {
		mtx_assert(&Giant, MA_NOTOWNED);

		while (procrunnable() == 0) {
		    /*
		     * This is a good place to put things to be done in
		     * the background, including sanity checks.
		     */
	#ifdef __i386__
		    cpu_idle();
	#endif
		}

		mtx_lock_spin(&sched_lock);
		curproc->p_stats->p_ru.ru_nvcsw++;
		mi_switch();
		mtx_unlock_spin(&sched_lock);
	    }
	}


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011123151522.B58238>