From owner-svn-src-projects@FreeBSD.ORG Sat Jun 2 14:16:45 2012 Return-Path: Delivered-To: svn-src-projects@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 00AE6106566B; Sat, 2 Jun 2012 14:16:45 +0000 (UTC) (envelope-from brde@optusnet.com.au) Received: from mail05.syd.optusnet.com.au (mail05.syd.optusnet.com.au [211.29.132.186]) by mx1.freebsd.org (Postfix) with ESMTP id 865B78FC14; Sat, 2 Jun 2012 14:16:44 +0000 (UTC) Received: from c122-106-171-232.carlnfd1.nsw.optusnet.com.au (c122-106-171-232.carlnfd1.nsw.optusnet.com.au [122.106.171.232]) by mail05.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id q52EGfx2020023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 3 Jun 2012 00:16:42 +1000 Date: Sun, 3 Jun 2012 00:16:41 +1000 (EST) From: Bruce Evans X-X-Sender: bde@besplex.bde.org To: Davide Italiano In-Reply-To: <201206021304.q52D4p2X090537@svn.freebsd.org> Message-ID: <20120602233307.S1957@besplex.bde.org> References: <201206021304.q52D4p2X090537@svn.freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: svn-src-projects@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r236449 - projects/calloutng/sys/kern X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Jun 2012 14:16:45 -0000 On Sat, 2 Jun 2012, Davide Italiano wrote: > Log: > Replace binuptime() with getbinuptime() because it's suitable for the > purpose and it's cheaper. Update the relative comment on precision error > during callwheel scan as well. This makes even less sense than converting to bintimes at all. getbinuptime() can give an even lower precision than the current timer ticks, since it is only updated every tc_tick/hz seconds while ticks are updated every 1/hz seconds. Also, you have to keep timeouts firing for getbintime() to work. OTOH, bintime() is unusable in timeout code, since it may be too inefficient, depending on the timecounter hardware. cpu_ticks() might be usable. It doesn't use bintimes and isn't very accurate, but these are other bugs which become features for use here. > Modified: projects/calloutng/sys/kern/kern_timeout.c > ============================================================================== > --- projects/calloutng/sys/kern/kern_timeout.c Sat Jun 2 12:26:14 2012 (r236448) > +++ projects/calloutng/sys/kern/kern_timeout.c Sat Jun 2 13:04:50 2012 (r236449) > @@ -373,9 +373,9 @@ callout_tick(void) > need_softclock = 0; > cc = CC_SELF(); > mtx_lock_spin_flags(&cc->cc_lock, MTX_QUIET); > - binuptime(&now); > + getbinuptime(&now); > /* > - * Get binuptime() may be inaccurate and return time up to 1/HZ in the past. > + * getbinuptime() may be inaccurate and return time up to 1/HZ in the past. > * In order to avoid the possible loss of one or more events look back 1/HZ > * in the past from the time we last checked. > */ Up to tc_tick/hz, not up to 1/HZ. tc_tick is the read-only sysctl variable kern.timecounter.tick that is set to make tc_tick/hz as close to 1 msec as possible. If someone asks for busy-waiting by setting HZ to much larger than 1000 and uses this to generate lots of timeouts, they probably get this now, but get*time() cannot be used even to distingish times differing by the timeout granularity. It is hard to see how it could ever work for the above use (timout scheduling with a granularity of ~1/hz when you can only see differences of ~tc_tick/hz, with tc_tick quite often 4-10, or 100-1000 to use or test corner cases??). With a tickless kernel, timeouts wouldn't have a fixed granularity, but you need accurate measurements of times even more. One slow way to get them is to call binuptime() again in the above. Another, even worse way to update timecounters after every timeout expires (the update has a much higher overhead than binuptime(), so this will be very slow iff timeouts that expire are actually used). I noticed too many style bugs to describe in previous changes in this area. The above only shows formatting for 85-column terminals. Bruce