diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c --- a/sys/kern/kern_clocksource.c +++ b/sys/kern/kern_clocksource.c @@ -175,6 +175,9 @@ state = DPCPU_PTR(timerstate); + /* make sure the time is properly aligned */ + state->nexthard -= state->nexthard % tick_sbt; + runs = 0; while (now >= state->nexthard) { state->nexthard += tick_sbt; @@ -317,7 +320,7 @@ next = &nexttick; now = sbinuptime(); if (periodic) - *next = now + timerperiod; + *next = now - (now % timerperiod) + timerperiod; else *next = -1; /* Next tick is not scheduled yet. */ state->now = now; diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -906,6 +906,8 @@ to_sbt = sbinuptime(); if ((flags & C_HARDCLOCK) == 0) to_sbt += tick_sbt; + /* make sure the target time is really aligned to "tick_sbt" */ + to_sbt -= to_sbt % tick_sbt; } else to_sbt = sbinuptime(); if (SBT_MAX - to_sbt < sbt)