1

I'd like to understand why calling chill() in a DTrace action block increases the timestamp variable, but not vtimestamp and walltimestamp.

Here's an example showing timestamp increasing after a call to chill():

# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' timestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6734 has exited
CPU     ID                    FUNCTION:NAME
  5  83475          _r_debug_postinit:entry 11258

  5  85771                     atexit:entry 2218

  5  86468              __libc_atexit:entry 491

  5  86428                       exit:entry 441

  5  85397    __cxa_thread_call_dtors:entry 441

  5  86213             __cxa_finalize:entry 447

  5  86213             __cxa_finalize:entry 565

  5  83470            _rtld_addr_phdr:entry 454

  5  86213             __cxa_finalize:entry 431

  5  83470            _rtld_addr_phdr:entry 1645

  5  84405                      _exit:entry 432

If we run the same script but use walltimestamp (or vtimestamp), we'll see the counter did not increase:

# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' walltimestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6707 has exited
CPU     ID                    FUNCTION:NAME
  4  83475          _r_debug_postinit:entry 0

  4  85771                     atexit:entry 0

  4  86468              __libc_atexit:entry 0

  4  86428                       exit:entry 0

  4  85397    __cxa_thread_call_dtors:entry 0

  4  86213             __cxa_finalize:entry 0

  4  86213             __cxa_finalize:entry 0

  4  83470            _rtld_addr_phdr:entry 0

  4  86213             __cxa_finalize:entry 0

  4  83470            _rtld_addr_phdr:entry 0

  4  84405                      _exit:entry 0

This is understandable for vtimestamp, as it does not increase when executing DTrace code, but I don't understand walltimestamp's behavior here.

I'm running FreeBSD 13.1-RELEASE-p1 here on amd64.

Mateusz Piotrowski
  • 4,623
  • 5
  • 36
  • 70

1 Answers1

1

Apparently, it's a bug in DTrace. Apparently, the implementation of chill() only invalidates the cached value of the timestamp variable but not for walltimestamp, which is incorrect.

Thanks to Mark Johnston for providing the answer on the FreeBSD DTrace mailing list.

Mateusz Piotrowski
  • 4,623
  • 5
  • 36
  • 70