Date: Tue, 05 Feb 2002 20:52:11 +0100 From: Poul-Henning Kamp <phk@critter.freebsd.dk> To: John Polstra <jdp@polstra.com> Cc: hackers@freebsd.org Subject: Re: A question about timecounters Message-ID: <92661.1012938731@critter.freebsd.dk> In-Reply-To: Your message of "Tue, 05 Feb 2002 11:44:15 PST." <200202051944.g15JiFw04286@vashon.polstra.com>
next in thread | previous in thread | raw e-mail | index | archive | help
In message <200202051944.g15JiFw04286@vashon.polstra.com>, John Polstra writes: >OK, adding the splhigh() around the body of microuptime seems to have >solved the problem. After 45 minutes of running the same test as >before, I haven't gotten a single message. If I get one later, I'll >let you know. Ok, so we know where the bogotism happens, now to identify it... >I don't follow that. As I read the code, the "current" timecounter >is only advanced every second -- not every 1/HZ seconds. Why should >more of them be needed when HZ is large? No, only if you have set tco_method to one, if tco_method is zero (default) we update the timecounter every HZ. >> You didn't say if you ran with standard NTIMECOUNTER right now, >> but 5 would be awfully short time at HZ=10000: 500 usec... > >Well, microseconds aren't what they used to be ... :-) But isn't it >true that the current timecounter only advances every second? I think >I have 5 seconds, not 5/HZ seconds. Depends on your tco_method... Could you try this combination: NTIMECOUNTER = HZ (or even 5 * HZ) tco_method = 0 no splhigh protection for microuptime() ? The reason why tco_method=1 isn't nice is that we loose the ability to use 1/hz precision cached timestamps in the get*() funtions. Btw, regarding the volatile thing: If I do extern volatile struct timecounter *timecounter; microtime() { struct timecounter *tc; tc = timecounter; The compiler complains about loosing the volatile thing. How do I tell it that it is the contents of the "timecounter" pointer which is volatile, but now what it points at ? I don't want the "tc" pointer to be volatile because it obviously isn't. Do I really need to cast it ? tc = (struct timecounter *)timecounter; That looks silly to me... -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?92661.1012938731>