Give up on calling tc_ticktock() from a timeout, we have timeout
functions which run for several milliseconds at a time and getting in queue behind one or more of those makes us miss our rewind. Instead call it from hardclock() like we used to do, but retain the prescaler so we still cope with high HZ values.
This commit is contained in:
parent
386fefa3a0
commit
e7fa55af89
@ -59,6 +59,7 @@
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/interrupt.h>
|
||||
#include <sys/timetc.h>
|
||||
|
||||
#include <machine/cpu.h>
|
||||
#include <machine/limits.h>
|
||||
@ -208,6 +209,7 @@ hardclock(frame)
|
||||
hardclock_process(curthread, CLKF_USERMODE(frame));
|
||||
mtx_unlock_spin_flags(&sched_lock, MTX_QUIET);
|
||||
|
||||
tc_ticktock();
|
||||
/*
|
||||
* If no separate statistics clock is available, run it from here.
|
||||
*
|
||||
|
@ -647,12 +647,15 @@ pps_event(struct pps_state *pps, int event)
|
||||
static int tc_tick;
|
||||
SYSCTL_INT(_kern_timecounter, OID_AUTO, tick, CTLFLAG_RD, &tick, 0, "");
|
||||
|
||||
static void
|
||||
tc_ticktock(void *dummy)
|
||||
void
|
||||
tc_ticktock(void)
|
||||
{
|
||||
static int count;
|
||||
|
||||
if (++count < tc_tick)
|
||||
return;
|
||||
count = 0;
|
||||
tc_windup();
|
||||
timeout(tc_ticktock, NULL, tc_tick);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -678,7 +681,6 @@ inittimecounter(void *dummy)
|
||||
/* warm up new timecounter (again) and get rolling. */
|
||||
(void)timecounter->tc_get_timecount(timecounter);
|
||||
(void)timecounter->tc_get_timecount(timecounter);
|
||||
tc_ticktock(NULL);
|
||||
}
|
||||
|
||||
SYSINIT(timecounter, SI_SUB_CLOCKS, SI_ORDER_FIRST, inittimecounter, NULL)
|
||||
|
@ -62,5 +62,6 @@ extern struct timecounter *timecounter;
|
||||
u_int32_t tc_getfrequency(void);
|
||||
void tc_init(struct timecounter *tc);
|
||||
void tc_setclock(struct timespec *ts);
|
||||
void tc_ticktock(void);
|
||||
|
||||
#endif /* !_SYS_TIMETC_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user