From owner-freebsd-current Sun Feb 17 12:43: 1 2002 Delivered-To: freebsd-current@freebsd.org Received: from apollo.backplane.com (apollo.backplane.com [216.240.41.2]) by hub.freebsd.org (Postfix) with ESMTP id 85AD737B402 for ; Sun, 17 Feb 2002 12:42:54 -0800 (PST) Received: (from dillon@localhost) by apollo.backplane.com (8.11.6/8.9.1) id g1HKgs691210; Sun, 17 Feb 2002 12:42:54 -0800 (PST) (envelope-from dillon) Date: Sun, 17 Feb 2002 12:42:54 -0800 (PST) From: Matthew Dillon Message-Id: <200202172042.g1HKgs691210@apollo.backplane.com> To: Poul-Henning Kamp , Bruce Evans , freebsd-current@FreeBSD.ORG Subject: Re: Success! Sorta! (was Re: 'microuptime() went backwards ...' using ACPI timer. Shouldn't that be impossible? ) References: <5781.1013977327@critter.freebsd.dk> Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Whoop! I take it back. I'm still getting the errors: microuptime() went backwards (458.168990 -> 458.168882) microuptime() went backwards (578.609995 -> 577.929801) microuptime() went backwards (748.912755 -> 748.237402) microuptime() went backwards (775.159625 -> 775.159612) I also think this retry loop has to be done everywhere where the timecounter structure is accessed directly. -Matt : Ok, I've tested Bruce's patch and it appeaars to mostly solve the problem. : I no longer get 'microuptime ... backwards' errors on a -current SMP : box. :... Index: kern/kern_tc.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_tc.c,v retrieving revision 1.113 diff -u -r1.113 kern_tc.c --- kern/kern_tc.c 7 Feb 2002 21:21:55 -0000 1.113 +++ kern/kern_tc.c 17 Feb 2002 20:41:47 -0000 @@ -107,9 +107,11 @@ { struct timecounter *tc; - tc = timecounter; - *bt = tc->tc_offset; - bintime_addx(bt, tc->tc_scale * tco_delta(tc)); + do { + tc = timecounter; + *bt = tc->tc_offset; + bintime_addx(bt, tc->tc_scale * tco_delta(tc)); + } while (tc != timecounter); } void @@ -126,8 +128,10 @@ struct timecounter *tc; ngetmicrotime++; - tc = timecounter; - *tvp = tc->tc_microtime; + do { + tc = timecounter; + *tvp = tc->tc_microtime; + } while (tc != timecounter); } void @@ -136,8 +140,10 @@ struct timecounter *tc; ngetnanotime++; - tc = timecounter; - *tsp = tc->tc_nanotime; + do { + tc = timecounter; + *tsp = tc->tc_nanotime; + } while (tc != timecounter); } void @@ -166,8 +172,10 @@ struct timecounter *tc; ngetmicrouptime++; - tc = timecounter; - bintime2timeval(&tc->tc_offset, tvp); + do { + tc = timecounter; + bintime2timeval(&tc->tc_offset, tvp); + } while (tc != timecounter); } void @@ -176,8 +184,10 @@ struct timecounter *tc; ngetnanouptime++; - tc = timecounter; - bintime2timespec(&tc->tc_offset, tsp); + do { + tc = timecounter; + bintime2timespec(&tc->tc_offset, tsp); + } while (tc != timecounter); } void To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message