[DTrace-devel] [PATCH] Add support for built-in variable walltimestamp
Kris Van Hees
kris.van.hees at oracle.com
Mon Jun 14 07:15:17 PDT 2021
On Mon, Apr 26, 2021 at 04:40:05PM -0400, Eugene Loh wrote:
> On 4/24/21 10:07 PM, Kris Van Hees wrote:
>
> > On Fri, Apr 23, 2021 at 09:50:39PM -0400, eugene.loh at oracle.com wrote:
> >> From: Eugene Loh <eugene.loh at oracle.com>
> >>
> >> Use bpf_ktime_get_ns() to get the time (in nsec) since boot. This
> >> value must be adjusted to POSIX time. So, when we load a built-in
> >> variable, check if it is walltimestamp. If so, add BPF instructions
> >> to add the adjustment.
> >>
> >> It would be nice if the support for walltimestamp were more localized,
> >> but the BPF code that gets built-in variables is compiled at build
> >> time while the adjustment is determined at run time.
> > Why not store the adjustment as a value in the 'state' map as we already
> > do for some struct offsets that we need in get_bvar()? That way you can
> > keep the walltimestamp handling all in the precompiler BPF code. All you
> > need to do is populate an element in the 'state' map woth the correct
> > delta.
>
>
> That strikes me as unnecessarily complicated. Not a huge deal -- none
> of this is rocket science or particularly expensive -- I'm just saying
> it's more complicated than it needs to be. The code generator needs to
> know about this stuff anyhow, since it has to figure out the adjustment
> and then do *something* with that information. In the current approach,
> if the adjustment is needed, the cg figures it out and uses it. Done.
> What you propose means also storing this somewhere where BPF can find it
> and then having BPF retrieve it before adding it. (And currently,
> get_bvar gets stuff from the state map with a bpf_map_lookup_elem()
> call, which is a few lines of C that compile to about 7 BPF instructions.)
>
> I agree it'd be nice if the walltimestamp stuff were all confined to
> get_bvar. That'd be nice. But, again, cg needs to know this stuff
> anyhow. Putting the adjustment into get_bvar as well doesn't change
> that, requires more instructions to retrieve it, and requires adding a
> place to store this stuff.
>
> The struct offsets aren't a fair comparison. BPF needs to know those
> offsets.
>
> Anyhow, you asked. :^)
How about using the newly discovered and (ab)used approach of a symbol like
STBSZ that gets resolved at load time? That avoids adding custom code to the
code generator for this particular D variable, and it also avoids the extra
complexity of pulling a value out of a map. (Come to think of it, we might
want to deprecate putting the offsets needed for ppid into that state map and
do that using a resolved symbol as well - but that is a separate issue).
This gives us a solution that solves both concerns.
> >> A few more walltimestamp tests pass now, but existing walltimestamp
> >> tests are rather lenient. Add a new, more stringent test. In particular,
> >> timestamp is supposed to be fixed for an entire clause while walltimestamp
> >> is fresh with every call.
> > What about timezones? Does the CLOCK_REALTIME provide a timespec in UTC or
> > in local tiemzone? The walltimestamp D variable needs to report in UTC.
>
> I don't think timezones are relevant. Neither one is actually reporting
> a timestamp. Both CLOCK_REALTIME and D walltimestamp are reporting
> elapsed time since some well defined and universal instant (Unix
> Epoch). (Modulo relativistic effects!) one could just as well be in
> outer space.
OK.
More information about the DTrace-devel
mailing list