From owner-freebsd-current Fri Nov 23 15:19:32 2001 Delivered-To: freebsd-current@freebsd.org Received: from iguana.aciri.org (iguana.aciri.org [192.150.187.36]) by hub.freebsd.org (Postfix) with ESMTP id CA2D037B417; Fri, 23 Nov 2001 15:19:25 -0800 (PST) Received: (from rizzo@localhost) by iguana.aciri.org (8.11.3/8.11.1) id fANNFMc59040; Fri, 23 Nov 2001 15:15:22 -0800 (PST) (envelope-from rizzo) Date: Fri, 23 Nov 2001 15:15:22 -0800 From: Luigi Rizzo To: John Baldwin Cc: current@FreeBSD.org Subject: Re: where is the idle_loop in current ? Message-ID: <20011123151522.B58238@iguana.aciri.org> References: <20011025120306.A57392@iguana.aciri.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.23i 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 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