Why is tc_get_timecount() called two times in tc_init()?

Konstantin Belousov kostikbel at gmail.com
Thu Oct 3 08:40:35 UTC 2019


On Thu, Oct 03, 2019 at 03:12:26AM +1000, Bruce Evans wrote:
> On Wed, 2 Oct 2019, Konstantin Belousov wrote:
> 
> > On Thu, Oct 03, 2019 at 02:25:46AM +1000, Bruce Evans wrote:
> >> On Wed, 2 Oct 2019, Konstantin Belousov wrote:
> > So the conclusion is that the second call can be removed, am I right ?
> 
> Yes.
> 
> All tc_get_timecount() functions should be checked for doing sufficient
> initialization in one call (so that deltas for subsequent calls are
> correct).

This should be it.

But, is even a single call to tc_get_timecount() needed for "warmup" ?

diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index 382d139617d..28d0d738a58 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -3191,7 +3191,6 @@ acpi_resync_clock(struct acpi_softc *sc)
      * Warm up timecounter again and reset system clock.
      */
     (void)timecounter->tc_get_timecount(timecounter);
-    (void)timecounter->tc_get_timecount(timecounter);
     inittodr(time_second + sc->acpi_sleep_delay);
 }
 
diff --git a/sys/dev/acpica/acpi_timer.c b/sys/dev/acpica/acpi_timer.c
index 34a832089a2..d768397a785 100644
--- a/sys/dev/acpica/acpi_timer.c
+++ b/sys/dev/acpica/acpi_timer.c
@@ -274,7 +274,6 @@ acpi_timer_resume_handler(struct timecounter *newtc)
 			    "restoring timecounter, %s -> %s\n",
 			    tc->tc_name, newtc->tc_name);
 		(void)newtc->tc_get_timecount(newtc);
-		(void)newtc->tc_get_timecount(newtc);
 		timecounter = newtc;
 	}
 }
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index 98ab5bf3a6b..1e132f4d866 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -303,7 +303,6 @@ xctrl_suspend()
 	 * Warm up timecounter again and reset system clock.
 	 */
 	timecounter->tc_get_timecount(timecounter);
-	timecounter->tc_get_timecount(timecounter);
 	inittodr(time_second);
 
 #ifdef EARLY_AP_STARTUP
diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
index 9920a9a9304..847fbbbf35d 100644
--- a/sys/kern/kern_tc.c
+++ b/sys/kern/kern_tc.c
@@ -1257,7 +1257,6 @@ tc_init(struct timecounter *tc)
 	    tc->tc_frequency < timecounter->tc_frequency)
 		return;
 	(void)tc->tc_get_timecount(tc);
-	(void)tc->tc_get_timecount(tc);
 	timecounter = tc;
 }
 
@@ -1519,7 +1518,6 @@ sysctl_kern_timecounter_hardware(SYSCTL_HANDLER_ARGS)
 
 		/* Warm up new timecounter. */
 		(void)newtc->tc_get_timecount(newtc);
-		(void)newtc->tc_get_timecount(newtc);
 
 		timecounter = newtc;
 
@@ -2011,7 +2009,6 @@ inittimecounter(void *dummy)
 
 	/* warm up new timecounter (again) and get rolling. */
 	(void)timecounter->tc_get_timecount(timecounter);
-	(void)timecounter->tc_get_timecount(timecounter);
 	mtx_lock_spin(&tc_setclock_mtx);
 	tc_windup(NULL);
 	mtx_unlock_spin(&tc_setclock_mtx);


More information about the freebsd-hackers mailing list