Fast gettimeofday(2) and clock_gettime(2)

Bruce Evans brde at optusnet.com.au
Fri Jun 8 08:39:33 UTC 2012


On Thu, 7 Jun 2012, John Baldwin wrote:

> On Wednesday, June 06, 2012 9:35:49 pm Bruce Evans wrote:
>> On Wed, 6 Jun 2012, John Baldwin wrote:

>>> 1) You don't follow the model of clearing tk_current to 0 while you
>>>   are updating the structure that the in-kernel timecounter code
>>>   uses.  This also means you have to avoid using a tk_current of 0
>>>   and that userland has to keep spinning as long as tk_current is 0.
>>>   Without this I believe userland can read a partially updated
>>>   structure.
>>
>> I thought that too at first, but after looking at the patch decided
>> that it may be correct, but is too hard for me to understand.
>> Urk, we both missed that tk_current is an index into the timehands
>> array, so it cannot act as a generation count and it seems to be harder
>> to lock.
>
> Ugh, so it goes a long way to emulate the timehands array in userland.  As I
> mentioned previously, I consider the timehands array to be a bug.  However, I
> do think the generation count in the in-kernel timehands structure is useful
> and should be kept (and follow the same model of setting it to 0 before doing
> updates, then updating the structure, then setting the new generation).

Without the timehands array you will need slow atomic ops or maybe MD magic
to make them unnecessary.

I think 3 generations are necessary and sufficient: one pointed to by
timehands for normal use; another that used to be pointed to be
timehands and that remains valid for 1 more generation time after
timehands was switched away from it, and one
invalid/unready/being_updated one that will become the one pointed to
by timehands 1 generation after it was updated.  2 generations are
needed instead of 1 to allow updating one while the other remains
usable, and 3 generations are needed instead of 1 to ensure that the
one pointed to by timehands remains valid for a full generation time
(average 1.5 generation times) after any read of timehands.

Bruce


More information about the freebsd-arch mailing list