Date: Sat, 06 Nov 2004 15:59:10 +0800 From: David Xu <davidxu@freebsd.org> To: David Schultz <das@freebsd.org> Cc: cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/vm vm_zeroidle.c Message-ID: <418C844E.3030403@freebsd.org> In-Reply-To: <20041106062955.GA1986@VARK.MIT.EDU> 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>
next in thread | previous in thread | raw e-mail | index | archive | help
David Schultz wrote: >On Mon, Nov 01, 2004, John Baldwin wrote: > > >>On Monday 01 November 2004 05:51 am, Alfred Perlstein wrote: >> >> >>>* Alan Cox <alc@cs.rice.edu> [041031 20:53] wrote: >>> >>> >>>>On Sun, Oct 31, 2004 at 07:13:17PM -0800, Alfred Perlstein wrote: >>>> >>>> >>>>>* Alan Cox <alc@FreeBSD.org> [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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?418C844E.3030403>