From owner-cvs-src@FreeBSD.ORG Sat Nov 6 07:59:17 2004 Return-Path: Delivered-To: cvs-src@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1BA0F16A4CE; Sat, 6 Nov 2004 07:59:17 +0000 (GMT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id E876943D31; Sat, 6 Nov 2004 07:59:16 +0000 (GMT) (envelope-from davidxu@freebsd.org) Received: from [127.0.0.1] (davidxu@localhost [127.0.0.1]) iA67xCUP069854; Sat, 6 Nov 2004 07:59:13 GMT (envelope-from davidxu@freebsd.org) Message-ID: <418C844E.3030403@freebsd.org> Date: Sat, 06 Nov 2004 15:59:10 +0800 From: David Xu User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.2) Gecko/20040921 X-Accept-Language: en-us, en MIME-Version: 1.0 To: David Schultz References: <200410311932.i9VJWvmo058193@repoman.freebsd.org> <20041101045331.GP16728@cs.rice.edu> <20041101105113.GS24892@elvis.mu.org> <200411011441.33067.jhb@FreeBSD.org> <20041106062955.GA1986@VARK.MIT.EDU> In-Reply-To: <20041106062955.GA1986@VARK.MIT.EDU> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit cc: src-committers@freebsd.org cc: John Baldwin cc: Alan Cox cc: cvs-src@freebsd.org cc: Alfred Perlstein cc: cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/vm vm_zeroidle.c X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.1 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: Sat, 06 Nov 2004 07:59:17 -0000 David Schultz wrote: >On Mon, Nov 01, 2004, John Baldwin wrote: > > >>On Monday 01 November 2004 05:51 am, Alfred Perlstein wrote: >> >> >>>* Alan Cox [041031 20:53] wrote: >>> >>> >>>>On Sun, Oct 31, 2004 at 07:13:17PM -0800, Alfred Perlstein wrote: >>>> >>>> >>>>>* Alan Cox [041031 11:33] wrote: >>>>> >>>>> >>>>>>alc 2004-10-31 19:32:57 UTC >>>>>> >>>>>> FreeBSD src repository >>>>>> >>>>>> Modified files: >>>>>> sys/vm vm_zeroidle.c >>>>>> Log: >>>>>> Introduce a Boolean variable wakeup_needed to avoid repeated, >>>>>>unnecessary calls to wakeup() by vm_page_zero_idle_wakeup(). >>>>>> >>>>>> Revision Changes Path >>>>>> 1.31 +9 -2 src/sys/vm/vm_zeroidle.c >>>>>> >>>>>> >>>>>Why not switch to a cv? >>>>> >>>>> >>>>Calling cv_signal repeatedly would be no better than calling wakeup() >>>>repeatedly. Either way, a Boolean variable is desirable to prevent >>>>unnecessary calls. >>>> >>>> >>>Yah, I figured there would be something in the cv code to optimize >>>the "no waiters" case. >>> >>> >>There is, though sometimes it might think there are waiters when there >>actually aren't any. >> >> > >It doesn't look very optimized: > > void > cv_signal(struct cv *cvp) > { > > sleepq_lock(cvp); > ^^^^^^^^^^^^^^^^^ > if (cvp->cv_waiters > 0) { > [...] > } else > sleepq_release(cvp); > >The mutex associated with the condition variable will be held on >entry to both cv_wait() and cv_signal(), so why is the sleepqueue >locked in the no waiters case? > > > > cv_wait and cv_signal have to pass a serialization point, the serialization point is condition variable internal lock, before testing cvp_waiters, the internal lock should be locked, otherwise you should be ready to hit the race condition. It is legal to call cv_signal() without a locked mutex. David Xu