powerpc64 head -r344018 stuck sleeping problems: th->th_scale * tc_delta(th) overflows unsigned 64 bits sometimes [patched failed]
Bruce Evans
brde at optusnet.com.au
Sat Mar 2 17:14:31 UTC 2019
On Sat, 2 Mar 2019, Poul-Henning Kamp wrote:
> --------
> In message <20190302105652.GD68879 at kib.kiev.ua>, Konstantin Belousov writes:
>
>> Using more than two timehands increases a chance of reader to try to
>> use outdated timehands.
>
> No, using only two timehands increase the chance that the reader tries
> to use the timehand which is being updated.
Then it sees the generation change and retries. We fixed the ordering
of accesses to the generation count so that this is robust. 1 timehands
is always valid, so with 2 timehands there is no wait for the retry
except in the very unlikely event that the generation changes for the
new timehands too. 1 timehands would work too, but the retries would
have to wait while it is updated.
> As long as the reader does not use the timehand being updated, using
> a one or two generations old timehand is OK.
In old versions, there were races checking the generation count. Having
multiple timehands made these races more unlikely to matter.
> The target-value for delta-t was "a few milliseconds" when I wrote
> timecounters, if somebody has changed that since, I hope they did
> their math first.
Tickless kernels complicate things. It's surprising that tc_ticktock()
works so well with them. Calls to hardclock() are not periodic, so
calls to tc_ticktock() are not periodic either. It has to handle
coalesced and 1/hz ticks. Too much coalescing would break it. With
my normal hz = 100, cpu0:timer interrupts still occur at at least 100 Hz.
These presumably go to hardclock(), so the timing is satisfied. With
hz = 1000, cpu0:timer interrupts only occur at at least 200 Hz. This
is less than tc_ticktock() expects, but it still works.
Bruce
More information about the freebsd-ppc
mailing list