From owner-freebsd-current Fri Nov 23 18:36:49 2001 Delivered-To: freebsd-current@freebsd.org Received: from peter3.wemm.org (c1315225-a.plstn1.sfba.home.com [24.14.150.180]) by hub.freebsd.org (Postfix) with ESMTP id A9BAB37B417; Fri, 23 Nov 2001 18:36:41 -0800 (PST) Received: from overcee.netplex.com.au (overcee.wemm.org [10.0.0.3]) by peter3.wemm.org (8.11.0/8.11.0) with ESMTP id fAO2afM60676; Fri, 23 Nov 2001 18:36:41 -0800 (PST) (envelope-from peter@wemm.org) Received: from wemm.org (localhost [127.0.0.1]) by overcee.netplex.com.au (Postfix) with ESMTP id 56C0F380D; Fri, 23 Nov 2001 18:36:41 -0800 (PST) (envelope-from peter@wemm.org) X-Mailer: exmh version 2.5 07/13/2001 with nmh-1.0.4 To: Luigi Rizzo Cc: John Baldwin , current@FreeBSD.ORG Subject: Re: where is the idle_loop in current ? In-Reply-To: <20011123151522.B58238@iguana.aciri.org> Date: Fri, 23 Nov 2001 18:36:41 -0800 From: Peter Wemm Message-Id: <20011124023641.56C0F380D@overcee.netplex.com.au> Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Luigi Rizzo wrote: > 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). idle_proc isn't a real process. It has to be guaranteed to be runnable at any time. pgzero is a real idle priority thread. > 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 ? processes while in kernel mode cannot be preempted by another higher priority process. Once they have the cpu, they either have to return to userland (which kernel threads dont do), or block on something, or give up the cpu. > 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 > > Cheers, -Peter -- Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au "All of this is for nothing if we don't go to the stars" - JMS/B5 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message