From owner-cvs-src@FreeBSD.ORG Wed Jan 24 04:37:50 2007 Return-Path: X-Original-To: cvs-src@freebsd.org Delivered-To: cvs-src@freebsd.org Received: from [127.0.0.1] (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 9CE5416A400; Wed, 24 Jan 2007 04:37:47 +0000 (UTC) (envelope-from davidxu@freebsd.org) Message-ID: <45B6E2A5.6080404@freebsd.org> Date: Wed, 24 Jan 2007 12:37:57 +0800 From: David Xu User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.13) Gecko/20061204 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jeff Roberson References: <200701230850.l0N8oZV2065483@repoman.freebsd.org> <200701241147.17846.davidxu@freebsd.org> <20070123200041.Y564@10.0.0.1> In-Reply-To: <20070123200041.Y564@10.0.0.1> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Cc: src-committers@freebsd.org, jhb@freebsd.org, cvs-src@freebsd.org, Jeff Roberson , cvs-all@freebsd.org, Julian Elischer Subject: Re: cvs commit: src/sys/kern sched_ule.c X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jan 2007 04:37:50 -0000 Jeff Roberson wrote: >> if idlethread is preempted, who will clear its idle bit in >> idle_cpus_mask ? > > > idle_cpus_mask was broken before for all schedulers. This commit didn't > change that. ULE doesn't use idle_cpus_mask and it's idlethread doesn't > set or clear it. The idle thread for the other schedulers remains > unchanged. > I havn't read ULE code, but 4BSD has following code: void sched_idletd(void *dummy) { struct proc *p; struct thread *td; #ifdef SMP cpumask_t mycpu; #endif td = curthread; p = td->td_proc; #ifdef SMP mycpu = PCPU_GET(cpumask); mtx_lock_spin(&sched_lock); idle_cpus_mask |= mycpu; mtx_unlock_spin(&sched_lock); #endif for (;;) { mtx_assert(&Giant, MA_NOTOWNED); how about if the idlethread is preempted here ? mycpu is not cleared. while (sched_runnable() == 0) cpu_idle(); mtx_lock_spin(&sched_lock); #ifdef SMP idle_cpus_mask &= ~mycpu; #endif mi_switch(SW_VOL, NULL); #ifdef SMP idle_cpus_mask |= mycpu; #endif mtx_unlock_spin(&sched_lock); } } > Julian wants to set idle_cpus_mask in sched_switch() which would make it > accurate no matter how idlethread switched out. that seems much more > reasonable to me. > I haven't seen sched_switch clears it, so at least, it should be fixed for current 4BSD scheduler. > Cheers, > Jeff Regards, David Xu