Page MenuHomeFreeBSD

dtrace/arm64: Fix dtrace_gethrtime()
ClosedPublic

Authored by markj on Wed, Mar 5, 11:00 AM.
Tags
None
Referenced Files
F112540200: D49244.diff
Wed, Mar 19, 2:04 PM
Unknown Object (File)
Mon, Mar 10, 11:08 PM
Unknown Object (File)
Mon, Mar 10, 3:42 AM
Unknown Object (File)
Sat, Mar 8, 10:54 AM
Unknown Object (File)
Fri, Mar 7, 10:07 AM
Unknown Object (File)
Fri, Mar 7, 1:21 AM
Unknown Object (File)
Fri, Mar 7, 12:52 AM
Unknown Object (File)
Thu, Mar 6, 6:20 AM
Subscribers

Details

Summary

This routine returns a monotonic count of the number of nanoseconds elapsed
since the previous call. On arm64 it uses the generic system timer. The
implementation multiplies the counter value by 10**9 then divides by the counter
frequency, but this multiplication can overflow. This can result in trace
records with non-monotonic timestamps, which breaks libdtrace's temporal
ordering algorithm.

An easy fix is to reverse the order of operations, since the counter frequency
will in general be smaller than 10**9. (In fact, it's mandated to be 1Ghz in
ARMv9, which makes life simple.) However, this can give a fair bit of error.
Adopt the calculation used on amd64, with tweaks to handle frequencies as low as
1MHz: the ARM generic timer documentation suggests that ARMv8 timers are
typically in the 1MHz-50MHz range, which is true on arm64 systems that I have
access to.

Sponsored by: Innovate UK

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped
Build Status
Buildable 62770
Build 59654: arc lint + arc unit

Event Timeline

markj requested review of this revision.Wed, Mar 5, 11:00 AM
This revision was not accepted when it landed; it landed in state Needs Review.Mon, Mar 10, 3:05 AM
This revision was automatically updated to reflect the committed changes.