monotonic time going back by wrong skews

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
41 messages Options
123
Reply | Threaded
Open this post in threaded view
|

monotonic time going back by wrong skews

YASUOKA Masahiko-3
Hi,

I hit a problem which is caused by going back of monotonic time.  It
happens on hosts on VMware ESXi.

I wrote the program which repeats the problem.

 % cc -o monotime monotime.c -lpthread
 % ./monotime
 194964 Starting
 562210 Starting
 483046 Starting
 148865 Starting
 148865 Back 991.808048665 => 991.007447931
 562210 Back 991.808048885 => 991.007448224
 483046 Back 991.808049115 => 991.007449172
 148865 Stopped
 562210 Stopped
 483046 Stopped
 194964 Stopped
 % uname -a
 OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
 % sysctl kern.version
 kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
     [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
 %

monotime.c
----
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>

#define NTHREAD 4
#define NTRY 50000

void *
start(void *dummy)
{
        int i;
        struct timespec ts0, ts1;

        printf("%d Starting\n", (int)getthrid());
        clock_gettime(CLOCK_MONOTONIC, &ts0);

        for (i = 0; i < NTRY; i++) {
                clock_gettime(CLOCK_MONOTONIC, &ts1);
                if (timespeccmp(&ts0, &ts1, <=)) {
                        ts0 = ts1;
                        continue;
                }
                printf("%d Back %lld.%09lu => %lld.%09lu\n",
                    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
                    ts1.tv_nsec);
            break;
        }
        printf("%d Stopped\n", (int)getthrid());

        return (NULL);
}

int
main(int argc, char *argv[])
{
        int i, n = NTHREAD;
        pthread_t *threads;

        threads = calloc(n, sizeof(pthread_t));

        for (i = 0; i < n; i++)
                pthread_create(&threads[i], NULL, start, NULL);
        for (i = 0; i < n; i++)
                pthread_join(threads[i], NULL);

}
----

The machine has 4 vCPUs and showing the following message on boot.

  cpu1: disabling user TSC (skew=-5310)
  cpu2: disabling user TSC (skew=-5335)
  cpu3: disabling user TSC (skew=-7386)

This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
delayed against cpu0.

Simply ignoring the skews by the following diff seems to workaround
this problem.

diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
index 238a5a068e1..3b951a8b5a3 100644
--- a/sys/arch/amd64/amd64/tsc.c
+++ b/sys/arch/amd64/amd64/tsc.c
@@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
 u_int
 tsc_get_timecount(struct timecounter *tc)
 {
- return rdtsc_lfence() + curcpu()->ci_tsc_skew;
+ //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
+ return rdtsc_lfence();
 }
 
 void

So I supposed the skews are not calculated properly.  Also I found
NetBSD changed the skew calculating so that it checks 1000 times and
take the minimum value.

  https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
  https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef


I checked skews on the machine by the following debug code.

diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
index 238a5a068e1..83e835e4f82 100644
--- a/sys/arch/amd64/amd64/tsc.c
+++ b/sys/arch/amd64/amd64/tsc.c
@@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
  *aptscp = tsc_sync_val;
 }
 
+#define TSC_SYNC_NTIMES 1000
+
+static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
+
+void
+tsc_debug(void)
+{
+ int i, cpuid = curcpu()->ci_cpuid;
+
+ for (i = 0; i < TSC_SYNC_NTIMES; i++) {
+ if (i % 10 == 0)
+ printf("%5d", tsc_difs[cpuid][i]);
+ else
+ printf(" %5d", tsc_difs[cpuid][i]);
+ if (i % 10 == 9)
+ printf("\n");
+ }
+ printf("\n");
+}
+
 void
 tsc_sync_bp(struct cpu_info *ci)
 {
+ int i, mindif = INT_MAX, dif;
  uint64_t bptsc, aptsc;
 
- tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
- tsc_read_bp(ci, &bptsc, &aptsc);
+ for (i = 0; i < TSC_SYNC_NTIMES; i++) {
+ tsc_read_bp(ci, &bptsc, &aptsc);
+ dif = bptsc - aptsc;
+ if (abs(dif) < abs(mindif))
+ mindif = dif;
+ tsc_difs[ci->ci_cpuid][i] = dif;
+ }
 
  /* Compute final value to adjust for skew. */
- ci->ci_tsc_skew = bptsc - aptsc;
+ ci->ci_tsc_skew = mindif;
 }
 
 /*
@@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
 void
 tsc_sync_ap(struct cpu_info *ci)
 {
- tsc_post_ap(ci);
- tsc_post_ap(ci);
+ int i;
+
+ for (i = 0; i < TSC_SYNC_NTIMES; i++)
+ tsc_post_ap(ci);
 }
 
 void

----
Stopped at      db_enter+0x10:  popq    %rbp
ddb{0}> machine ddbcpu 1
Stopped at      x86_ipi_db+0x12:        leave
ddb{1}> call tsc_debug
-8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
  -11    -9    -5    -3    -4    -3    -7     8    -5    -6
   -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
   -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
   -9    -1    -8     1    -8     6    -5    -4     2    -2
   -8    -3    -1    -5    -2    -2     1     2    -2    -9
  -12     0    -9    -2    -2    -5    -2     1     2     0
   -1     2    -2     6    -5    -1    -2    -4     2    -2
    0    -9    -9    -6    -2     2     3    -6    -1     3
    8     4    -2     2    -8     7     1     2    -2     1
   -2    -6    -2     5     0     0    -4    -9     6    -2
   -3    -6    -2   -12     1    -9    -2    -3   -10    10
    2    -1    -3    -2     3     1     1    -5     3    -3
   -5     1    -6    -2    -3     0     0     9     1     6
    8    -6     5     4   -12    -1     4     2    -1    -1
   -1     2     2     0    -5     1     2    -8     3     9
    0     6    -3     4     6     0     8     6   -14    -1
   -1     0    -6    -7     6   -10     7    -6    -5    -4
    6   -12     4     3    -5     5     1    -6     3     0
   -2     0     6    -9    -2    -1     1    -1     4     0
    4    10   -13     1    -8    -2    -8    -3    -5    -3
   -5    -5     1    -9    -9     0    -3    -1     2     6
   -2     2    -3    -9    -9   -11    -7    -6    -4    -9
   -4    -9    -3    -4     0    -5     0    -9   -12    -7
   -6    -9     1    -5    -4   -12     7    -3   -12    -4
   -5    -5    -6    -9    -7    -1     0     0    -1    -2
   -6    -8     0     1    -8    -5    -2    -4     0    -1
   -3   -10   -15    -3    -8   -11    -9    -9     2     0
   -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
    0     0     2    -2    -4     1    -6     0     0    -5
   -2    -7    -5    -2    -2     1    -2    -6    -1    -7
   -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
   -4    -3    -4   -11     1    -9     0    -3     2    -9
   -8     2    -1    -7    -5    -5    -9     2    -3    -5
    0     5   -12     0    -5    -3    -6    -1   -13   -10
   -9     0     0    -5    -7    -4    -3    -3    -3    -2
   -2     3    -5    -3    -5    -1    -7    -4   -10     0
   -3     0     2     1    -4    -1    -5    -3    -5    -6
   -4    -8    -3     0    -1    -2   -13   -10    -9    -5
  -11   -11    -4    -3     0     5    -2    -3    -6     0
   -6    -9    -1    -4    -1     2    -2    -7    -9     0
   -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
   -8    -6    -2    -3    -9    -5    -9   -11   -10     1
   -3    -6    -1    -1    -6     0     0    -8    -4     0
   -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
   -4     2    -2 -5012     5     2   -17     0     7    -5
    0    -4    -3     6    -7    -1    -1     4    -6     3
    0    -4    -9    -7   -11   -11     8    -7   -15   -10
    3    -4     1   -17    -4     3   -17     0     4     3
   -2     0    -3   -10    -2     1     3    -5   -12   -19
    1     2     5     1    -9     4    -2    -3    -4     0
   -1   -11    -3    -1    -9    -5     0    -8     7    -2
   -6    -7     4    -5    -2    -1    -5     0    -5    -5
  -14    -2    -8     0   -11     9   -10     2    -6   -17
   -3    -5    -6     2     0     9   -14     0    -4    -7
    6     2     2    -9    -9     5     5     0    -6     3
  -12     5    -2   -13   -10    -5    -7     2   -11    -3
   -6    -2   -13     1     8    -5   -14     2     4    -3
  -13    -5   -11    -9   -10     4    -3    -1     9   -17
  -11     2   -13    -2    -1    -9   -10     0    -5    -4
    0    10    -8    -5    -8    -3   -14    -6     3   -15
    1    -5     1   176    -8    -7    -7    -4    -1    -1
   -8    -7    -4     1    -6    -9     1    -2    -9    -4
   -4    -1    -7     0    -8    -3    -4    -3    -1    -2
   -5    -6    -9     2    -6     0    -8    -5     0    -9
  -10     0    -4     4    -6   -11    -3     2   -12     1
   -2    -6    -6    -3    -7    -7     0    -9    -1    -9
   -1    -8    -4    -3   -11     1     0     1    -2    -4
  -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
   -3    -4    -2    -4     1     0    -5    -2    -1     4
   -9    -1    -4     1    -8   -11     0   -10    -4    -9
   -5    -2    -2     4     0    -7    -4     1    -2     1
   -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
   -4    -9    -7    -5    -3     3    -5   -12    -3     0
   -8    -4    -9    -5    -6     0     0    -1    -2    -6
   -8   -12    -3     1     2    -6    -1    -7   -10    -9
   -6    -8     0    -2    -3    -7    -3    -2     6    -3
  -12     0     0    -7    -9    -6    -1    -5    -2    -9
   -6     1     0    -3    -1    -1    -2     2    -2    -3
   -7    -9    -1    -8    -4    -2     5    -5    -3   -10
    2     6    -3     0    -6    -8    -9    -1    -1    -7
   -8    -1    -1    -4    -4     7    -2   -10   -11    -6
    2     2    -4     3    -2    -1    -3     0     0    -7
   -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
    0     1    -3     5    -3    -4    -1    -6    -9    -4
   -6     0    -9    -6     0    -2     4    -2    -4   -10
   -9    -4    -3    -9    -3    -6    -9    -8    -4     1
   -5    -6    -5     1     0    -2    -3    -6    -5    -9
   -4     1    -5    -4    -2    -4    -8    -3    -4     0
    2    -5    -3    -7    -1    -2    -1    -9    -6   -15
  -10    -6    -2    -7    -1    -3     3    -6    -6    -9
  -10    -8    -9    -2    -3     0    -6     3    -4     4
    3     3     8    -2    -2    -4     0    -3    -9    -3
   -6    -4     3     2     1     1    -3    -7   -15    -1
   -4    -6    -1    -2    -1   -12     2    -1    -4     1
    2     3    -5     3    -3    -7    -6    -5     0     1
    5   -13    -8     0    -5     2     0    -5    -3     6
   -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
  -10    -4   -10    -9    -2     1     0    -4    -3     0
    1    -3    -1    -4    -7   -10   -13    -8    -1    -1

0x1
ddb{1}> machine ddbcpu 2
Stopped at      x86_ipi_db+0x12:        leave
ddb{2}> call tsc_debug
-8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
    3     3    -8    -3    -4     4     0    -8    -7    -5
   -5     3    -7    -5    -4    -9    -7    -3     0     2
   -5     2     1     3    -2     3     8    -6   -11     8
    8    -5     1     5     0    -8     2     0     6     3
  -14     7    -2    -1    -3     1    -5    -6     0     5
    1    -1     0    -2    -5     2    -3     0    -3    -1
   -5   -12    -4    -4    -9     4     0    -2    -2    -8
    2     5     7    -2     0    -6   110    -8    -8    -4
    0     5    -7    -3    -5    -4     9    -2    -2     3
   -8    -2    -5     4    -3   217     0    -7    -7    -6
    7   -10    -9    -3     3   -14     3    -5     5   -12
    5    -8   -17    -5   286    -6     0    -3    -4    -2
    1    -5    -5    -9    -6    -7    -3    -5     6     0
    1    -1    -4    -2     2    -2    -2    -2    -5     2
   12     3   -18    -8     6    -4    -3     6     2    -3
   -7    -3     4    -5   -23     9     6     6    -6   -11
    9    -1   -10 50505    -1     2     6   -11     2    -2
   -4    -6   201     1     3     4    -9     6     0     1
   -4     0    -1     3     4     1     6    -7    -5     4
  -14    -3    -1    -8     5     6    -5     3    -7    -9
   -7     1    -2     5    -2     0    -2    -9     4    -3
   98    -5     7    -7     3     0    -5     0     9     2
   -7    -5    -3   -12   -11   -11     6    -5    -7    -6
  210     5    -3    -5    -4   -11    -6     0    -5    -9
    3     0    -9     5     1     0     0    -7    -5   210
    1    -6   -17    -8     0     1    -2    -8     1    -7
   10    -8    -8    -9     4    -2    -4    -3   204     5
   -9   -15     3    -1    -5     0   -12    -1     0     1
   -1    -6    -5    -9    -1     4    -1    -1     0     1
    4    -8   -13     1     0    -5    -6     0    -4     0
    6    -2    -4    -8    -7   -12    -2    -2    -6    -8
   -5     0    -8    -7   -11     0     6    -1    -8    -3
    2     6    -6     0   -10   285    -1    -2    -8    -6
   -6    -1    -5    -6     0    -5    -8    -5     1    -8
   -1     1     4    -3    -4   188    -3    -3   -10     5
    6     0    -7     4     1     2     0    -2    -2     2
   -3    -1    -9   -12   201    -1    -7    -1     8     0
    0     0    -5     0     7   -18     5     1    -2    15
    5    -6     4   -10   272     0    -4    -3     2   -10
   -7     7     3     4     1     6    -9    -8   -12    -2
   -2    -2    -6     8     3    97    -1    -7     5     1
   -7     4    -6    -9    -7    -2     0    -6     8   -13
   -1     3    -9    -4   233    -2     0     0    -5    -5
   -2     0     0     5    -7     6   -14     4    -6     5
    4     3     3    -3   103    -2    -6   -11     2    -2
   -3    -8     0    -1     1     0    -6     1     1   -10
   -1     0    -1     0     0    -1    -6    -4    -4    -3
    3     0    -5     0     2    -2     6     0   -13     3
    1   -16    -2   -12   206    -4    -6    -5    -3     2
   -8    -2    -9    -2     9     7    -1     1     3    -5
    6     6    10     0    99    -2    -1    -2     0    -6
   -8    -9     0     3     0   -11    -6     1    -4     9
  -11   -11     2    -1   276    -7     2     4    -4    -3
    4     2   -12     8     1    -4     0    -1    -1    -1
    5    -8     0     6   232    -4     2    -2   -11     2
   -6     0     4     6    -7     8    -6     3    -3    -9
    0     1    -7     2    -3    -5    -3    -2    -8    -4
  -14    -2     0     4    -4    -3    -4     9     3    -1
   -5    -8     1     0   210     0    -6    -4     2     2
    0    -3    -4     0     4   -12    10    -2    -3    -1
    3     7    -3     6    -9   190     4     6    -2    11
  -10    -2    -9     3     2     4    -4    -7    -9    -2
  -10    12     1    -7     3    -1     0    -1   -11     6
    6     0    -8     1     4     2    -2    -5     0     0
    5    -5    -3    -5   205    -1    -3    -1     0    -4
   -3    -7     3     0    -7    -5    -4    -3     7     1
  -14    -2     0   -14     2     0     7    11    -2    -7
    6    -6    -3    -4     0     4    -3    -4    -3    -7
   -6     3    -4     0     4    -3    -6     3     4    -4
   -6     7   -11     1   -10   -10   -12    -4    -3     6
   -5    -6     5   212    -8     1    -4     3    -3    -8
    0   -10     0     2     6    -3    -1   -13     1     6
   -6     5    -4     0    -7    -4    -5    -6     1    -2
    1   -10   -12    -3    -8     9   -11     0     1    -3
   -1     1   186     2   -12     3    -4     0     0    -1
   -5    -4     1    -1     4     5   -10     0    -4     1
   -1    -6   270     0   -17     5     0     0    -4    -1
    4     6     1     0    -6     6     5    -3     3    -2
   -6    -7    18   -16     0     9     4     3    -1     6
    4     1    -5     7   -11    -1    -6    -2     6    -2
   -8   256    -5    -2     1    -1    -5    -3    -9     0
   -1     3    -2   -11     4     3    -7    -3     3    -1
   -5    -5     0    -4    -1    -3    -3     6    -3     3
    3    -2   -11    -2    -3    11    -8     1     5    -7
    5   -12    -3     8    -9    -5     7     5    -3     2
   -7    -3    -6     2    -2    -1    -2    -9    -8    99
    6    -2     9    -1    -4    -2     0    -2    -7    -5
    0     1    -4    -8    -1    -2     2    -8     2   205
   -3   -10    -1    -1    -2    -5     2     2     5    -2
   -5    -6    -4     6     6    -6     4     1    -5     0
   -7     3     1     0   -11    -7    -3     5    -5     5
    1    -1     3    -5    -8     0    -1     0   183    -5
    0     4    -1    -6   -11   -10     1   -18     3    -1
   -5    -9    -2     2     2    -2     0    99    -7    -8
   -1    -3    -5    -1    12    -3    -1     2     1     4
    7     3   -14     2    -4     8    -9    -3    -8    -5
    6    -6     5   -12     6    -1    -9    -4    -4     1
   -6     0     0    -2    -3    -5    -9    -2    -9    -3
    3   -16    -2    -1     0     9    -4     5    -6     5

0x1
ddb{2}> machine ddbcpu 3
Stopped at      x86_ipi_db+0x12:        leave
ddb{3}> call tsc_debug
-8336 -6457 -45527     0    -1     0    -2     4     0     5
   -9    -6    -4    -4     6     4     0    -3    -4     5
    3     6   -12    -1     1     1    -3     6    -4    -2
   -2     2     4    -3     0    -1     3     0     1     3
   -3     3    -1     4    -5    -2    -2    -9     6    -9
    0     1    -2    -6     8    -4    -2    -2     6     1
   -1     1    -6    -6     4    -5    -1     6    -1    -1
    3     5     0    -6     5    -4    -2    -6    -3    -4
   -5     2    -3    -3    -5    -3    -5 -5720     0     5
   -1    -3     3    -2     4    -6     8   -16    -6    -3
   -2     4     8    -3     3    -1     2    -8    -3   -19
   -8     3    -7    -9    -6    -3     1    -3    -6     7
    4     1     3     2    -4     7    -3     2     2    -4
  -10    -8   -14    -2     2    -3     3    -2     3    -3
    5     5    -6     9    -3   -12    -6     1   -10     7
   -6     5    -4     1     6     3     2     2    -6    -1
    6    -8    -5     7     3    -3    -4    -6     1    -5
    4    -6     2     6    -6     3    -8    -5    -6     0
   -5    -2   -13    -8     3     0   -17    -7    -9     1
    6   -12     3     6     3    -3     4    -1    -7     0
    2     0    -7   -10    -6     3     1     2   -19     4
    1   -18     1    -3    -6   -14     4     6     3    -4
   -7   -11    -1    -1     3     0     6     6    -8   -14
    3    -2     6    -5     0     1     0    -7     0     4
   -3   -16    -2    -4   -12    -4     6     0    -8    -4
   -4    -4    -3     0    -6   -13   -10   -15    -6     2
    0    -3     0    -8     4    -1    -1     5    -4    -1
   -7     2     1     1     3    -3    -1   -18     6     8
   -2     3    -6     0    -6    -2     2    -2    -7     1
   -6   -13    -4    -2    -1    -6     6    -5    -9   -14
    4     5    -4    -2    -9    -2    -2   -13     1   -18
   -1     2    -5     6    -6    -7    -9    -6     1     6
  -13    -4     3     0    -8    -6    -6   -10    -2    -9
    5     2     4     1     6    -5    -8    -6     2    -4
   -3    -5    -2    -6   -10     0     5    -2     8    -3
    8   -11   -11    -7    -5   -13   -19    -5   -14    -3
    3     2     1     3     6    -1    -9   -16     3    -7
    1    -3    -5     0    -7     6     4    -2    -2     4
    4    -6    -6     8    -6    -7    -5    -2     0     4
   -1     3     1     3    -6    -2    -4    -9     1     0
   -2     3     2   -16     4   -15   -11    -3     8     0
   -6    -3   -18    -7    -8     8    -8     6    -7    -4
   -8    -7    -9     0    -2     3     7    -2     1    -6
    2    -6     8    -1   -12    -8    -4     3   -13    -2
  -11     1    -2    -7    -3     0   -16    -8     4    -9
  -15    -8    -9     8     5     7    -9     5   -10    10
    1     6    -6     3    -6    -4     5     0    -3    -7
   -1    -4   -10    -2     0   -11     8    -8    -3   -11
    4    -6     1    -8    -1    -6     3    -1   -12    -7
   11    -1     0    -4   -13     0   -10     7    -2     0
   -6     4     0   -12    -9     6    -2    -5    -5    -7
   -1    -9    -5     3     3    -7     3   -16    -2   -10
    0    -2     6     4     4    -6    -9    -3    -6     4
   -5    -1     7   -11   -21    -9    -3    -1     4   -13
   -7     0    -3     0   -10    -7     8    -9     7     6
   -9   -14     5    -9    -7    -8    11    -6     1    -3
   -9     7     5     0   -12    -3    -4   -18     0     4
   -1     8    -8     9     4     0     5   -10   -10    -8
    1     8    -1     4     1    -3    -6    -6    -5    -1
  -12    -6    -8   -14   -10     2    -1     9     0    -9
    0    -8    -6    -5     1   -14    -6     5     1    -7
    3    -9     6    -4     3     0   -21     8     7     5
    0     0    -2     2     1    -7   -11     1    -7     2
   -3    -2     9     1     3    -1    -8     0   -18    -7
   -3     6     1     1    -8    -5    -1     2    -4    -6
  -10    -5   -20   -18     5    -7     2     5    -3    -3
   -6    -3    -3     4    -7    -2    -4     2    -6   -11
   -4   -15    -6    -5     2    -1   -10    -4    -6    -3
   -1     0    -6   -10     5    -5     2     2    -8     6
   -1     5    -5    -9    12     0    -6   -17     2    -4
    4   -11    -1    -8     0    -3   -11    -8     0    -6
    2    -1    -4    -9   -12     3     6   -10    -2    -6
  -13     1   -10     1   -13     5    -4     3   -11     4
   -8     4     4   -17     6   -12     3   -13     0    -3
   -7     4   -11    -1     1     3     5    -8    -3     0
    4    -8    -1     4   -13     2    -1     2     5    -6
   -6     4    -4    -5     1    -4     4     5    -2   -10
   -9     0   -14    -2    -7     1    -1   -14   -15     8
   -3     9    -3    -4    -8     0     2     5   -11   -13
   -5   -13    -3    -7     9    -3    -7    -6    -9    -7
   -8   -10    -1     6     2     2     3   -13    -6    -5
    3   -13     2    -6     4     1     0    -9     4   -11
  -15     0     1   -12    -1     2   -11     2    -1   -13
  -13    -5     3     9   -11    -8     2   -12    -2    -5
    0    -3    -2     1    -6    -2    -1     0    -3     2
    0    -9    -4     1    -2     3    -6     0    -4    -6
    2     1   -14    -4    -7   -23    -1    -4    -8    -8
    2    -4     1     6   -10     5    -9    -6     6    -1
    4    -2    -9     0    -5    -1     8     0     3     4
   -4    -7    -4     2   -15    -6     2     1    -6    -4
   -3    -3     3    -7    -2    -9     9    -2    -9    -4
    3    -8   -10    -3    -4     1    -4   -10    -1     3
   -1   -15     5     0     2    -6     4     6    -2     0
    2     5     3   -12    -5    -5    -2    -4    -4     5
   -8    -4    -6   -16    -1     4    -4    -1    -8     0
    6   -10     5     0     1    -3    -9     8     0   -11
   -3   -13    -1     3     3    -6    -6    -2     3     5
    4    -6    12   -17     1    -5    -5    -2     1    -3
   -7     5    -4     8    -5    -1    -5     8   -12     4
   -6     2    -5    -9     2    -2     5     3    -5    -8

0x1
ddb{3}>
----

I seems that we can fix the problem by comparing TSC more times and
choosing the minimum value.

The diff also includes a fix for the problem (use the minimum value of
1000 samplings).  With the diff, I tried "monotime" test program over
100 times, it didn't find any clock going back.


dmesg
----
OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 6425083904 (6127MB)
avail mem = 6215311360 (5927MB)
random: good seed from bootblocks
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
bios0: VMware, Inc. VMware7,1
acpi0 at bios0: ACPI 4.0
acpi0: sleep states S0 S1 S4 S5
acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
acpitimer0 at acpi0: 3579545 Hz, 24 bits
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
cpu0: 256KB 64b/line 8-way L2 cache
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
cpu0: apic clock running at 65MHz
cpu1 at mainbus0: apid 1 (application processor)
cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
cpu1: 256KB 64b/line 8-way L2 cache
cpu1: disabling user TSC (skew=-5310)
cpu1: smt 0, core 1, package 0
cpu2 at mainbus0: apid 2 (application processor)
cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
cpu2: 256KB 64b/line 8-way L2 cache
cpu2: disabling user TSC (skew=-5335)
cpu2: smt 0, core 2, package 0
cpu3 at mainbus0: apid 3 (application processor)
cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
cpu3: 256KB 64b/line 8-way L2 cache
cpu3: disabling user TSC (skew=-7386)
cpu3: smt 0, core 3, package 0
ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
acpimcfg0 at acpi0
acpimcfg0: addr 0xe0000000, bus 0-127
acpihpet0 at acpi0: 14318179 Hz
acpiprt0 at acpi0: bus 0 (PCI0)
acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
acpicmos0 at acpi0
"PNP0A05" at acpi0 not configured
acpiac0 at acpi0: AC unit online
acpicpu0 at acpi0: C1(@1 halt!)
acpicpu1 at acpi0: C1(@1 halt!)
acpicpu2 at acpi0: C1(@1 halt!)
acpicpu3 at acpi0: C1(@1 halt!)
cpu0: using Broadwell MDS workaround
pvbus0 at mainbus0: VMware
vmt0 at pvbus0
pci0 at mainbus0 bus 0
0:16:0: rom address conflict 0xffffc000/0x4000
pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
pci1 at ppb0 bus 1
pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
pciide0: channel 0 disabled (no drives)
atapiscsi0 at pciide0 channel 1 drive 0
scsibus1 at atapiscsi0: 2 targets
cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
"VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
"VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
mpi0: 0, firmware 1.3.41.32
scsibus2 at mpi0: 16 targets, initiator 7
sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
sd0: 16384MB, 512 bytes/sector, 33554432 sectors
sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
sd1: 81920MB, 512 bytes/sector, 167772160 sectors
mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
pci2 at ppb1 bus 2
ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
pci3 at ppb2 bus 3
vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
pci4 at ppb3 bus 4
ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
pci5 at ppb4 bus 5
ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
pci6 at ppb5 bus 6
ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
pci7 at ppb6 bus 7
ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
pci8 at ppb7 bus 8
ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
pci9 at ppb8 bus 9
ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
pci10 at ppb9 bus 10
ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
pci11 at ppb10 bus 11
ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
pci12 at ppb11 bus 12
ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
pci13 at ppb12 bus 13
ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
pci14 at ppb13 bus 14
ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
pci15 at ppb14 bus 15
ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
pci16 at ppb15 bus 16
ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
pci17 at ppb16 bus 17
ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
pci18 at ppb17 bus 18
ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
pci19 at ppb18 bus 19
ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
pci20 at ppb19 bus 20
ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
pci21 at ppb20 bus 21
ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
pci22 at ppb21 bus 22
ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
pci23 at ppb22 bus 23
ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
pci24 at ppb23 bus 24
ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
pci25 at ppb24 bus 25
ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
pci26 at ppb25 bus 26
ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
pci27 at ppb26 bus 27
ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
pci28 at ppb27 bus 28
ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
pci29 at ppb28 bus 29
ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
pci30 at ppb29 bus 30
ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
pci31 at ppb30 bus 31
ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
pci32 at ppb31 bus 32
ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
pci33 at ppb32 bus 33
ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
pci34 at ppb33 bus 34
isa0 at pcib0
isadma0 at isa0
fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com0: console
com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
pckbc0 at isa0 port 0x60/5 irq 1 irq 12
pckbd0 at pckbc0 (kbd slot)
wskbd0 at pckbd0 mux 1
pms0 at pckbc0 (aux slot)
wsmouse0 at pms0 mux 0
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
efifb0 at mainbus0: 1152x864, 32bpp
wsdisplay0 at efifb0 mux 1
wskbd0: connecting to wsdisplay0
wsdisplay0: screen 0-5 added (std, vt100 emulation)
vscsi0 at root
scsibus3 at vscsi0: 256 targets
softraid0 at root
scsibus4 at softraid0: 256 targets
root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
----

This happens on 2 ESXi hosts at least

- 1
  - ESXi 6.0.0, 3029758
  - Xeon E5-2620 x 2
- 2
  - ESXi 6.7.0 Update 3 (Build 14320388)
  - Xeon Silver 4208 x 2

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Paul Irofti-4
Hi,

Thank you for taking this to tech@ as requested!

I will reproduce here what I replied to Yasouka and Scott (which I think
proposed taking the minimum skew value) in private.

"First, thank you very much for the in-depth analysis. I would suggest
you take this to a public forum like tech@ so that we can keep the
discussion opened and civilized.

I remember when I wrote the CPU synchronization code, that I tried doing
sampling but it had some issues that now I don't remember of. So let us
try this on real hardware too. This is another argument for moving this
to tech@.

Second, why is taking the minimum value the optimal choice? I would
assume an average would be better. Basically if you have a sequency like
900, 900, 900, 900, 0, 900, 900, 900 you pick 0 which could lead to some
problems, right? Or am I missing something?"

So could people give the minimum skew approach a spin on real machines
to see if there are any issues popping up?

All the best,
Paul

On 3/24/21 10:40 AM, YASUOKA Masahiko wrote:

> Hi,
>
> I hit a problem which is caused by going back of monotonic time.  It
> happens on hosts on VMware ESXi.
>
> I wrote the program which repeats the problem.
>
>   % cc -o monotime monotime.c -lpthread
>   % ./monotime
>   194964 Starting
>   562210 Starting
>   483046 Starting
>   148865 Starting
>   148865 Back 991.808048665 => 991.007447931
>   562210 Back 991.808048885 => 991.007448224
>   483046 Back 991.808049115 => 991.007449172
>   148865 Stopped
>   562210 Stopped
>   483046 Stopped
>   194964 Stopped
>   % uname -a
>   OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
>   % sysctl kern.version
>   kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>       [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>   %
>
> monotime.c
> ----
> #include <sys/types.h>
> #include <sys/time.h>
> #include <stdio.h>
> #include <time.h>
> #include <unistd.h>
> #include <pthread.h>
> #include <stdlib.h>
>
> #define NTHREAD 4
> #define NTRY 50000
>
> void *
> start(void *dummy)
> {
> int i;
> struct timespec ts0, ts1;
>
> printf("%d Starting\n", (int)getthrid());
> clock_gettime(CLOCK_MONOTONIC, &ts0);
>
> for (i = 0; i < NTRY; i++) {
> clock_gettime(CLOCK_MONOTONIC, &ts1);
> if (timespeccmp(&ts0, &ts1, <=)) {
> ts0 = ts1;
> continue;
> }
> printf("%d Back %lld.%09lu => %lld.%09lu\n",
>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
>    ts1.tv_nsec);
>     break;
> }
> printf("%d Stopped\n", (int)getthrid());
>
> return (NULL);
> }
>
> int
> main(int argc, char *argv[])
> {
> int i, n = NTHREAD;
> pthread_t *threads;
>
> threads = calloc(n, sizeof(pthread_t));
>
> for (i = 0; i < n; i++)
> pthread_create(&threads[i], NULL, start, NULL);
> for (i = 0; i < n; i++)
> pthread_join(threads[i], NULL);
>
> }
> ----
>
> The machine has 4 vCPUs and showing the following message on boot.
>
>    cpu1: disabling user TSC (skew=-5310)
>    cpu2: disabling user TSC (skew=-5335)
>    cpu3: disabling user TSC (skew=-7386)
>
> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
> delayed against cpu0.
>
> Simply ignoring the skews by the following diff seems to workaround
> this problem.
>
> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> index 238a5a068e1..3b951a8b5a3 100644
> --- a/sys/arch/amd64/amd64/tsc.c
> +++ b/sys/arch/amd64/amd64/tsc.c
> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
>   u_int
>   tsc_get_timecount(struct timecounter *tc)
>   {
> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + return rdtsc_lfence();
>   }
>  
>   void
>
> So I supposed the skews are not calculated properly.  Also I found
> NetBSD changed the skew calculating so that it checks 1000 times and
> take the minimum value.
>
>    https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
>    https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
>
>
> I checked skews on the machine by the following debug code.
>
> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> index 238a5a068e1..83e835e4f82 100644
> --- a/sys/arch/amd64/amd64/tsc.c
> +++ b/sys/arch/amd64/amd64/tsc.c
> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
>   *aptscp = tsc_sync_val;
>   }
>  
> +#define TSC_SYNC_NTIMES 1000
> +
> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
> +
> +void
> +tsc_debug(void)
> +{
> + int i, cpuid = curcpu()->ci_cpuid;
> +
> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> + if (i % 10 == 0)
> + printf("%5d", tsc_difs[cpuid][i]);
> + else
> + printf(" %5d", tsc_difs[cpuid][i]);
> + if (i % 10 == 9)
> + printf("\n");
> + }
> + printf("\n");
> +}
> +
>   void
>   tsc_sync_bp(struct cpu_info *ci)
>   {
> + int i, mindif = INT_MAX, dif;
>   uint64_t bptsc, aptsc;
>  
> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
> - tsc_read_bp(ci, &bptsc, &aptsc);
> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> + tsc_read_bp(ci, &bptsc, &aptsc);
> + dif = bptsc - aptsc;
> + if (abs(dif) < abs(mindif))
> + mindif = dif;
> + tsc_difs[ci->ci_cpuid][i] = dif;
> + }
>  
>   /* Compute final value to adjust for skew. */
> - ci->ci_tsc_skew = bptsc - aptsc;
> + ci->ci_tsc_skew = mindif;
>   }
>  
>   /*
> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
>   void
>   tsc_sync_ap(struct cpu_info *ci)
>   {
> - tsc_post_ap(ci);
> - tsc_post_ap(ci);
> + int i;
> +
> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
> + tsc_post_ap(ci);
>   }
>  
>   void
>
> ----
> Stopped at      db_enter+0x10:  popq    %rbp
> ddb{0}> machine ddbcpu 1
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{1}> call tsc_debug
> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
>    -11    -9    -5    -3    -4    -3    -7     8    -5    -6
>     -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
>     -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
>     -9    -1    -8     1    -8     6    -5    -4     2    -2
>     -8    -3    -1    -5    -2    -2     1     2    -2    -9
>    -12     0    -9    -2    -2    -5    -2     1     2     0
>     -1     2    -2     6    -5    -1    -2    -4     2    -2
>      0    -9    -9    -6    -2     2     3    -6    -1     3
>      8     4    -2     2    -8     7     1     2    -2     1
>     -2    -6    -2     5     0     0    -4    -9     6    -2
>     -3    -6    -2   -12     1    -9    -2    -3   -10    10
>      2    -1    -3    -2     3     1     1    -5     3    -3
>     -5     1    -6    -2    -3     0     0     9     1     6
>      8    -6     5     4   -12    -1     4     2    -1    -1
>     -1     2     2     0    -5     1     2    -8     3     9
>      0     6    -3     4     6     0     8     6   -14    -1
>     -1     0    -6    -7     6   -10     7    -6    -5    -4
>      6   -12     4     3    -5     5     1    -6     3     0
>     -2     0     6    -9    -2    -1     1    -1     4     0
>      4    10   -13     1    -8    -2    -8    -3    -5    -3
>     -5    -5     1    -9    -9     0    -3    -1     2     6
>     -2     2    -3    -9    -9   -11    -7    -6    -4    -9
>     -4    -9    -3    -4     0    -5     0    -9   -12    -7
>     -6    -9     1    -5    -4   -12     7    -3   -12    -4
>     -5    -5    -6    -9    -7    -1     0     0    -1    -2
>     -6    -8     0     1    -8    -5    -2    -4     0    -1
>     -3   -10   -15    -3    -8   -11    -9    -9     2     0
>     -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
>      0     0     2    -2    -4     1    -6     0     0    -5
>     -2    -7    -5    -2    -2     1    -2    -6    -1    -7
>     -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
>     -4    -3    -4   -11     1    -9     0    -3     2    -9
>     -8     2    -1    -7    -5    -5    -9     2    -3    -5
>      0     5   -12     0    -5    -3    -6    -1   -13   -10
>     -9     0     0    -5    -7    -4    -3    -3    -3    -2
>     -2     3    -5    -3    -5    -1    -7    -4   -10     0
>     -3     0     2     1    -4    -1    -5    -3    -5    -6
>     -4    -8    -3     0    -1    -2   -13   -10    -9    -5
>    -11   -11    -4    -3     0     5    -2    -3    -6     0
>     -6    -9    -1    -4    -1     2    -2    -7    -9     0
>     -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
>     -8    -6    -2    -3    -9    -5    -9   -11   -10     1
>     -3    -6    -1    -1    -6     0     0    -8    -4     0
>     -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
>     -4     2    -2 -5012     5     2   -17     0     7    -5
>      0    -4    -3     6    -7    -1    -1     4    -6     3
>      0    -4    -9    -7   -11   -11     8    -7   -15   -10
>      3    -4     1   -17    -4     3   -17     0     4     3
>     -2     0    -3   -10    -2     1     3    -5   -12   -19
>      1     2     5     1    -9     4    -2    -3    -4     0
>     -1   -11    -3    -1    -9    -5     0    -8     7    -2
>     -6    -7     4    -5    -2    -1    -5     0    -5    -5
>    -14    -2    -8     0   -11     9   -10     2    -6   -17
>     -3    -5    -6     2     0     9   -14     0    -4    -7
>      6     2     2    -9    -9     5     5     0    -6     3
>    -12     5    -2   -13   -10    -5    -7     2   -11    -3
>     -6    -2   -13     1     8    -5   -14     2     4    -3
>    -13    -5   -11    -9   -10     4    -3    -1     9   -17
>    -11     2   -13    -2    -1    -9   -10     0    -5    -4
>      0    10    -8    -5    -8    -3   -14    -6     3   -15
>      1    -5     1   176    -8    -7    -7    -4    -1    -1
>     -8    -7    -4     1    -6    -9     1    -2    -9    -4
>     -4    -1    -7     0    -8    -3    -4    -3    -1    -2
>     -5    -6    -9     2    -6     0    -8    -5     0    -9
>    -10     0    -4     4    -6   -11    -3     2   -12     1
>     -2    -6    -6    -3    -7    -7     0    -9    -1    -9
>     -1    -8    -4    -3   -11     1     0     1    -2    -4
>    -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
>     -3    -4    -2    -4     1     0    -5    -2    -1     4
>     -9    -1    -4     1    -8   -11     0   -10    -4    -9
>     -5    -2    -2     4     0    -7    -4     1    -2     1
>     -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
>     -4    -9    -7    -5    -3     3    -5   -12    -3     0
>     -8    -4    -9    -5    -6     0     0    -1    -2    -6
>     -8   -12    -3     1     2    -6    -1    -7   -10    -9
>     -6    -8     0    -2    -3    -7    -3    -2     6    -3
>    -12     0     0    -7    -9    -6    -1    -5    -2    -9
>     -6     1     0    -3    -1    -1    -2     2    -2    -3
>     -7    -9    -1    -8    -4    -2     5    -5    -3   -10
>      2     6    -3     0    -6    -8    -9    -1    -1    -7
>     -8    -1    -1    -4    -4     7    -2   -10   -11    -6
>      2     2    -4     3    -2    -1    -3     0     0    -7
>     -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
>      0     1    -3     5    -3    -4    -1    -6    -9    -4
>     -6     0    -9    -6     0    -2     4    -2    -4   -10
>     -9    -4    -3    -9    -3    -6    -9    -8    -4     1
>     -5    -6    -5     1     0    -2    -3    -6    -5    -9
>     -4     1    -5    -4    -2    -4    -8    -3    -4     0
>      2    -5    -3    -7    -1    -2    -1    -9    -6   -15
>    -10    -6    -2    -7    -1    -3     3    -6    -6    -9
>    -10    -8    -9    -2    -3     0    -6     3    -4     4
>      3     3     8    -2    -2    -4     0    -3    -9    -3
>     -6    -4     3     2     1     1    -3    -7   -15    -1
>     -4    -6    -1    -2    -1   -12     2    -1    -4     1
>      2     3    -5     3    -3    -7    -6    -5     0     1
>      5   -13    -8     0    -5     2     0    -5    -3     6
>     -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
>    -10    -4   -10    -9    -2     1     0    -4    -3     0
>      1    -3    -1    -4    -7   -10   -13    -8    -1    -1
>
> 0x1
> ddb{1}> machine ddbcpu 2
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{2}> call tsc_debug
> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
>      3     3    -8    -3    -4     4     0    -8    -7    -5
>     -5     3    -7    -5    -4    -9    -7    -3     0     2
>     -5     2     1     3    -2     3     8    -6   -11     8
>      8    -5     1     5     0    -8     2     0     6     3
>    -14     7    -2    -1    -3     1    -5    -6     0     5
>      1    -1     0    -2    -5     2    -3     0    -3    -1
>     -5   -12    -4    -4    -9     4     0    -2    -2    -8
>      2     5     7    -2     0    -6   110    -8    -8    -4
>      0     5    -7    -3    -5    -4     9    -2    -2     3
>     -8    -2    -5     4    -3   217     0    -7    -7    -6
>      7   -10    -9    -3     3   -14     3    -5     5   -12
>      5    -8   -17    -5   286    -6     0    -3    -4    -2
>      1    -5    -5    -9    -6    -7    -3    -5     6     0
>      1    -1    -4    -2     2    -2    -2    -2    -5     2
>     12     3   -18    -8     6    -4    -3     6     2    -3
>     -7    -3     4    -5   -23     9     6     6    -6   -11
>      9    -1   -10 50505    -1     2     6   -11     2    -2
>     -4    -6   201     1     3     4    -9     6     0     1
>     -4     0    -1     3     4     1     6    -7    -5     4
>    -14    -3    -1    -8     5     6    -5     3    -7    -9
>     -7     1    -2     5    -2     0    -2    -9     4    -3
>     98    -5     7    -7     3     0    -5     0     9     2
>     -7    -5    -3   -12   -11   -11     6    -5    -7    -6
>    210     5    -3    -5    -4   -11    -6     0    -5    -9
>      3     0    -9     5     1     0     0    -7    -5   210
>      1    -6   -17    -8     0     1    -2    -8     1    -7
>     10    -8    -8    -9     4    -2    -4    -3   204     5
>     -9   -15     3    -1    -5     0   -12    -1     0     1
>     -1    -6    -5    -9    -1     4    -1    -1     0     1
>      4    -8   -13     1     0    -5    -6     0    -4     0
>      6    -2    -4    -8    -7   -12    -2    -2    -6    -8
>     -5     0    -8    -7   -11     0     6    -1    -8    -3
>      2     6    -6     0   -10   285    -1    -2    -8    -6
>     -6    -1    -5    -6     0    -5    -8    -5     1    -8
>     -1     1     4    -3    -4   188    -3    -3   -10     5
>      6     0    -7     4     1     2     0    -2    -2     2
>     -3    -1    -9   -12   201    -1    -7    -1     8     0
>      0     0    -5     0     7   -18     5     1    -2    15
>      5    -6     4   -10   272     0    -4    -3     2   -10
>     -7     7     3     4     1     6    -9    -8   -12    -2
>     -2    -2    -6     8     3    97    -1    -7     5     1
>     -7     4    -6    -9    -7    -2     0    -6     8   -13
>     -1     3    -9    -4   233    -2     0     0    -5    -5
>     -2     0     0     5    -7     6   -14     4    -6     5
>      4     3     3    -3   103    -2    -6   -11     2    -2
>     -3    -8     0    -1     1     0    -6     1     1   -10
>     -1     0    -1     0     0    -1    -6    -4    -4    -3
>      3     0    -5     0     2    -2     6     0   -13     3
>      1   -16    -2   -12   206    -4    -6    -5    -3     2
>     -8    -2    -9    -2     9     7    -1     1     3    -5
>      6     6    10     0    99    -2    -1    -2     0    -6
>     -8    -9     0     3     0   -11    -6     1    -4     9
>    -11   -11     2    -1   276    -7     2     4    -4    -3
>      4     2   -12     8     1    -4     0    -1    -1    -1
>      5    -8     0     6   232    -4     2    -2   -11     2
>     -6     0     4     6    -7     8    -6     3    -3    -9
>      0     1    -7     2    -3    -5    -3    -2    -8    -4
>    -14    -2     0     4    -4    -3    -4     9     3    -1
>     -5    -8     1     0   210     0    -6    -4     2     2
>      0    -3    -4     0     4   -12    10    -2    -3    -1
>      3     7    -3     6    -9   190     4     6    -2    11
>    -10    -2    -9     3     2     4    -4    -7    -9    -2
>    -10    12     1    -7     3    -1     0    -1   -11     6
>      6     0    -8     1     4     2    -2    -5     0     0
>      5    -5    -3    -5   205    -1    -3    -1     0    -4
>     -3    -7     3     0    -7    -5    -4    -3     7     1
>    -14    -2     0   -14     2     0     7    11    -2    -7
>      6    -6    -3    -4     0     4    -3    -4    -3    -7
>     -6     3    -4     0     4    -3    -6     3     4    -4
>     -6     7   -11     1   -10   -10   -12    -4    -3     6
>     -5    -6     5   212    -8     1    -4     3    -3    -8
>      0   -10     0     2     6    -3    -1   -13     1     6
>     -6     5    -4     0    -7    -4    -5    -6     1    -2
>      1   -10   -12    -3    -8     9   -11     0     1    -3
>     -1     1   186     2   -12     3    -4     0     0    -1
>     -5    -4     1    -1     4     5   -10     0    -4     1
>     -1    -6   270     0   -17     5     0     0    -4    -1
>      4     6     1     0    -6     6     5    -3     3    -2
>     -6    -7    18   -16     0     9     4     3    -1     6
>      4     1    -5     7   -11    -1    -6    -2     6    -2
>     -8   256    -5    -2     1    -1    -5    -3    -9     0
>     -1     3    -2   -11     4     3    -7    -3     3    -1
>     -5    -5     0    -4    -1    -3    -3     6    -3     3
>      3    -2   -11    -2    -3    11    -8     1     5    -7
>      5   -12    -3     8    -9    -5     7     5    -3     2
>     -7    -3    -6     2    -2    -1    -2    -9    -8    99
>      6    -2     9    -1    -4    -2     0    -2    -7    -5
>      0     1    -4    -8    -1    -2     2    -8     2   205
>     -3   -10    -1    -1    -2    -5     2     2     5    -2
>     -5    -6    -4     6     6    -6     4     1    -5     0
>     -7     3     1     0   -11    -7    -3     5    -5     5
>      1    -1     3    -5    -8     0    -1     0   183    -5
>      0     4    -1    -6   -11   -10     1   -18     3    -1
>     -5    -9    -2     2     2    -2     0    99    -7    -8
>     -1    -3    -5    -1    12    -3    -1     2     1     4
>      7     3   -14     2    -4     8    -9    -3    -8    -5
>      6    -6     5   -12     6    -1    -9    -4    -4     1
>     -6     0     0    -2    -3    -5    -9    -2    -9    -3
>      3   -16    -2    -1     0     9    -4     5    -6     5
>
> 0x1
> ddb{2}> machine ddbcpu 3
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{3}> call tsc_debug
> -8336 -6457 -45527     0    -1     0    -2     4     0     5
>     -9    -6    -4    -4     6     4     0    -3    -4     5
>      3     6   -12    -1     1     1    -3     6    -4    -2
>     -2     2     4    -3     0    -1     3     0     1     3
>     -3     3    -1     4    -5    -2    -2    -9     6    -9
>      0     1    -2    -6     8    -4    -2    -2     6     1
>     -1     1    -6    -6     4    -5    -1     6    -1    -1
>      3     5     0    -6     5    -4    -2    -6    -3    -4
>     -5     2    -3    -3    -5    -3    -5 -5720     0     5
>     -1    -3     3    -2     4    -6     8   -16    -6    -3
>     -2     4     8    -3     3    -1     2    -8    -3   -19
>     -8     3    -7    -9    -6    -3     1    -3    -6     7
>      4     1     3     2    -4     7    -3     2     2    -4
>    -10    -8   -14    -2     2    -3     3    -2     3    -3
>      5     5    -6     9    -3   -12    -6     1   -10     7
>     -6     5    -4     1     6     3     2     2    -6    -1
>      6    -8    -5     7     3    -3    -4    -6     1    -5
>      4    -6     2     6    -6     3    -8    -5    -6     0
>     -5    -2   -13    -8     3     0   -17    -7    -9     1
>      6   -12     3     6     3    -3     4    -1    -7     0
>      2     0    -7   -10    -6     3     1     2   -19     4
>      1   -18     1    -3    -6   -14     4     6     3    -4
>     -7   -11    -1    -1     3     0     6     6    -8   -14
>      3    -2     6    -5     0     1     0    -7     0     4
>     -3   -16    -2    -4   -12    -4     6     0    -8    -4
>     -4    -4    -3     0    -6   -13   -10   -15    -6     2
>      0    -3     0    -8     4    -1    -1     5    -4    -1
>     -7     2     1     1     3    -3    -1   -18     6     8
>     -2     3    -6     0    -6    -2     2    -2    -7     1
>     -6   -13    -4    -2    -1    -6     6    -5    -9   -14
>      4     5    -4    -2    -9    -2    -2   -13     1   -18
>     -1     2    -5     6    -6    -7    -9    -6     1     6
>    -13    -4     3     0    -8    -6    -6   -10    -2    -9
>      5     2     4     1     6    -5    -8    -6     2    -4
>     -3    -5    -2    -6   -10     0     5    -2     8    -3
>      8   -11   -11    -7    -5   -13   -19    -5   -14    -3
>      3     2     1     3     6    -1    -9   -16     3    -7
>      1    -3    -5     0    -7     6     4    -2    -2     4
>      4    -6    -6     8    -6    -7    -5    -2     0     4
>     -1     3     1     3    -6    -2    -4    -9     1     0
>     -2     3     2   -16     4   -15   -11    -3     8     0
>     -6    -3   -18    -7    -8     8    -8     6    -7    -4
>     -8    -7    -9     0    -2     3     7    -2     1    -6
>      2    -6     8    -1   -12    -8    -4     3   -13    -2
>    -11     1    -2    -7    -3     0   -16    -8     4    -9
>    -15    -8    -9     8     5     7    -9     5   -10    10
>      1     6    -6     3    -6    -4     5     0    -3    -7
>     -1    -4   -10    -2     0   -11     8    -8    -3   -11
>      4    -6     1    -8    -1    -6     3    -1   -12    -7
>     11    -1     0    -4   -13     0   -10     7    -2     0
>     -6     4     0   -12    -9     6    -2    -5    -5    -7
>     -1    -9    -5     3     3    -7     3   -16    -2   -10
>      0    -2     6     4     4    -6    -9    -3    -6     4
>     -5    -1     7   -11   -21    -9    -3    -1     4   -13
>     -7     0    -3     0   -10    -7     8    -9     7     6
>     -9   -14     5    -9    -7    -8    11    -6     1    -3
>     -9     7     5     0   -12    -3    -4   -18     0     4
>     -1     8    -8     9     4     0     5   -10   -10    -8
>      1     8    -1     4     1    -3    -6    -6    -5    -1
>    -12    -6    -8   -14   -10     2    -1     9     0    -9
>      0    -8    -6    -5     1   -14    -6     5     1    -7
>      3    -9     6    -4     3     0   -21     8     7     5
>      0     0    -2     2     1    -7   -11     1    -7     2
>     -3    -2     9     1     3    -1    -8     0   -18    -7
>     -3     6     1     1    -8    -5    -1     2    -4    -6
>    -10    -5   -20   -18     5    -7     2     5    -3    -3
>     -6    -3    -3     4    -7    -2    -4     2    -6   -11
>     -4   -15    -6    -5     2    -1   -10    -4    -6    -3
>     -1     0    -6   -10     5    -5     2     2    -8     6
>     -1     5    -5    -9    12     0    -6   -17     2    -4
>      4   -11    -1    -8     0    -3   -11    -8     0    -6
>      2    -1    -4    -9   -12     3     6   -10    -2    -6
>    -13     1   -10     1   -13     5    -4     3   -11     4
>     -8     4     4   -17     6   -12     3   -13     0    -3
>     -7     4   -11    -1     1     3     5    -8    -3     0
>      4    -8    -1     4   -13     2    -1     2     5    -6
>     -6     4    -4    -5     1    -4     4     5    -2   -10
>     -9     0   -14    -2    -7     1    -1   -14   -15     8
>     -3     9    -3    -4    -8     0     2     5   -11   -13
>     -5   -13    -3    -7     9    -3    -7    -6    -9    -7
>     -8   -10    -1     6     2     2     3   -13    -6    -5
>      3   -13     2    -6     4     1     0    -9     4   -11
>    -15     0     1   -12    -1     2   -11     2    -1   -13
>    -13    -5     3     9   -11    -8     2   -12    -2    -5
>      0    -3    -2     1    -6    -2    -1     0    -3     2
>      0    -9    -4     1    -2     3    -6     0    -4    -6
>      2     1   -14    -4    -7   -23    -1    -4    -8    -8
>      2    -4     1     6   -10     5    -9    -6     6    -1
>      4    -2    -9     0    -5    -1     8     0     3     4
>     -4    -7    -4     2   -15    -6     2     1    -6    -4
>     -3    -3     3    -7    -2    -9     9    -2    -9    -4
>      3    -8   -10    -3    -4     1    -4   -10    -1     3
>     -1   -15     5     0     2    -6     4     6    -2     0
>      2     5     3   -12    -5    -5    -2    -4    -4     5
>     -8    -4    -6   -16    -1     4    -4    -1    -8     0
>      6   -10     5     0     1    -3    -9     8     0   -11
>     -3   -13    -1     3     3    -6    -6    -2     3     5
>      4    -6    12   -17     1    -5    -5    -2     1    -3
>     -7     5    -4     8    -5    -1    -5     8   -12     4
>     -6     2    -5    -9     2    -2     5     3    -5    -8
>
> 0x1
> ddb{3}>
> ----
>
> I seems that we can fix the problem by comparing TSC more times and
> choosing the minimum value.
>
> The diff also includes a fix for the problem (use the minimum value of
> 1000 samplings).  With the diff, I tried "monotime" test program over
> 100 times, it didn't find any clock going back.
>
>
> dmesg
> ----
> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>      [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> real mem = 6425083904 (6127MB)
> avail mem = 6215311360 (5927MB)
> random: good seed from bootblocks
> mpath0 at root
> scsibus0 at mpath0: 256 targets
> mainbus0 at root
> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
> bios0: VMware, Inc. VMware7,1
> acpi0 at bios0: ACPI 4.0
> acpi0: sleep states S0 S1 S4 S5
> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu0: 256KB 64b/line 8-way L2 cache
> cpu0: smt 0, core 0, package 0
> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> cpu0: apic clock running at 65MHz
> cpu1 at mainbus0: apid 1 (application processor)
> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu1: 256KB 64b/line 8-way L2 cache
> cpu1: disabling user TSC (skew=-5310)
> cpu1: smt 0, core 1, package 0
> cpu2 at mainbus0: apid 2 (application processor)
> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu2: 256KB 64b/line 8-way L2 cache
> cpu2: disabling user TSC (skew=-5335)
> cpu2: smt 0, core 2, package 0
> cpu3 at mainbus0: apid 3 (application processor)
> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu3: 256KB 64b/line 8-way L2 cache
> cpu3: disabling user TSC (skew=-7386)
> cpu3: smt 0, core 3, package 0
> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
> acpimcfg0 at acpi0
> acpimcfg0: addr 0xe0000000, bus 0-127
> acpihpet0 at acpi0: 14318179 Hz
> acpiprt0 at acpi0: bus 0 (PCI0)
> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> acpicmos0 at acpi0
> "PNP0A05" at acpi0 not configured
> acpiac0 at acpi0: AC unit online
> acpicpu0 at acpi0: C1(@1 halt!)
> acpicpu1 at acpi0: C1(@1 halt!)
> acpicpu2 at acpi0: C1(@1 halt!)
> acpicpu3 at acpi0: C1(@1 halt!)
> cpu0: using Broadwell MDS workaround
> pvbus0 at mainbus0: VMware
> vmt0 at pvbus0
> pci0 at mainbus0 bus 0
> 0:16:0: rom address conflict 0xffffc000/0x4000
> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
> pci1 at ppb0 bus 1
> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
> pciide0: channel 0 disabled (no drives)
> atapiscsi0 at pciide0 channel 1 drive 0
> scsibus1 at atapiscsi0: 2 targets
> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
> mpi0: 0, firmware 1.3.41.32
> scsibus2 at mpi0: 16 targets, initiator 7
> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
> pci2 at ppb1 bus 2
> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
> pci3 at ppb2 bus 3
> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
> pci4 at ppb3 bus 4
> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
> pci5 at ppb4 bus 5
> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
> pci6 at ppb5 bus 6
> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
> pci7 at ppb6 bus 7
> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
> pci8 at ppb7 bus 8
> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
> pci9 at ppb8 bus 9
> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
> pci10 at ppb9 bus 10
> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
> pci11 at ppb10 bus 11
> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
> pci12 at ppb11 bus 12
> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
> pci13 at ppb12 bus 13
> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
> pci14 at ppb13 bus 14
> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
> pci15 at ppb14 bus 15
> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
> pci16 at ppb15 bus 16
> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
> pci17 at ppb16 bus 17
> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
> pci18 at ppb17 bus 18
> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
> pci19 at ppb18 bus 19
> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
> pci20 at ppb19 bus 20
> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
> pci21 at ppb20 bus 21
> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
> pci22 at ppb21 bus 22
> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
> pci23 at ppb22 bus 23
> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
> pci24 at ppb23 bus 24
> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
> pci25 at ppb24 bus 25
> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
> pci26 at ppb25 bus 26
> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
> pci27 at ppb26 bus 27
> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
> pci28 at ppb27 bus 28
> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
> pci29 at ppb28 bus 29
> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
> pci30 at ppb29 bus 30
> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
> pci31 at ppb30 bus 31
> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
> pci32 at ppb31 bus 32
> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
> pci33 at ppb32 bus 33
> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
> pci34 at ppb33 bus 34
> isa0 at pcib0
> isadma0 at isa0
> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> com0: console
> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> pckbd0 at pckbc0 (kbd slot)
> wskbd0 at pckbd0 mux 1
> pms0 at pckbc0 (aux slot)
> wsmouse0 at pms0 mux 0
> pcppi0 at isa0 port 0x61
> spkr0 at pcppi0
> efifb0 at mainbus0: 1152x864, 32bpp
> wsdisplay0 at efifb0 mux 1
> wskbd0: connecting to wsdisplay0
> wsdisplay0: screen 0-5 added (std, vt100 emulation)
> vscsi0 at root
> scsibus3 at vscsi0: 256 targets
> softraid0 at root
> scsibus4 at softraid0: 256 targets
> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
> ----
>
> This happens on 2 ESXi hosts at least
>
> - 1
>    - ESXi 6.0.0, 3029758
>    - Xeon E5-2620 x 2
> - 2
>    - ESXi 6.7.0 Update 3 (Build 14320388)
>    - Xeon Silver 4208 x 2
>

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

YASUOKA Masahiko-3
Hi,

> Second, why is taking the minimum value the optimal choice? I would
> assume an average would be better. Basically if you have a sequency
> like 900, 900, 900, 900, 0, 900, 900, 900 you pick 0 which could lead
> to some problems, right? Or am I missing something?"

Skews on VMware

>> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
>>    -11    -9    -5    -3    -4    -3    -7     8    -5    -6
>>     -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
>>     -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
>>     -9    -1    -8     1    -8     6    -5    -4     2    -2
>>     -8    -3    -1    -5    -2    -2     1     2    -2    -9
>>    -12     0    -9    -2    -2    -5    -2     1     2     0


First 3 seem to be storange.  Also there is such a value on middle of
sampling.

>>      9    -1   -10 50505    -1     2     6   -11     2    -2

I suppose such values should be excluded.

Also I did same test on my VAIO.  It seems more constant than VMware.
Full result is attached at last.

Is it possible that the calculation code is taking effects from the
CPU scheduler of its virtual supervisor?

Thanks,

On Wed, 24 Mar 2021 13:04:32 +0200
Paul Irofti <[hidden email]> wrote:

> Hi,
>
> Thank you for taking this to tech@ as requested!
>
> I will reproduce here what I replied to Yasouka and Scott (which I
> think proposed taking the minimum skew value) in private.
>
> "First, thank you very much for the in-depth analysis. I would suggest
> you take this to a public forum like tech@ so that we can keep the
> discussion opened and civilized.
>
> I remember when I wrote the CPU synchronization code, that I tried
> doing sampling but it had some issues that now I don't remember of. So
> let us try this on real hardware too. This is another argument for
> moving this to tech@.
>
> Second, why is taking the minimum value the optimal choice? I would
> assume an average would be better. Basically if you have a sequency
> like 900, 900, 900, 900, 0, 900, 900, 900 you pick 0 which could lead
> to some problems, right? Or am I missing something?"
>
> So could people give the minimum skew approach a spin on real machines
> to see if there are any issues popping up?
>
> All the best,
> Paul
>
> On 3/24/21 10:40 AM, YASUOKA Masahiko wrote:
>> Hi,
>> I hit a problem which is caused by going back of monotonic time.  It
>> happens on hosts on VMware ESXi.
>> I wrote the program which repeats the problem.
>>   % cc -o monotime monotime.c -lpthread
>>   % ./monotime
>>   194964 Starting
>>   562210 Starting
>>   483046 Starting
>>   148865 Starting
>>   148865 Back 991.808048665 => 991.007447931
>>   562210 Back 991.808048885 => 991.007448224
>>   483046 Back 991.808049115 => 991.007449172
>>   148865 Stopped
>>   562210 Stopped
>>   483046 Stopped
>>   194964 Stopped
>>   % uname -a
>>   OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
>>   % sysctl kern.version
>>   kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>>       [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>>   %
>> monotime.c
>> ----
>> #include <sys/types.h>
>> #include <sys/time.h>
>> #include <stdio.h>
>> #include <time.h>
>> #include <unistd.h>
>> #include <pthread.h>
>> #include <stdlib.h>
>> #define NTHREAD 4
>> #define NTRY 50000
>> void *
>> start(void *dummy)
>> {
>> int i;
>> struct timespec ts0, ts1;
>> printf("%d Starting\n", (int)getthrid());
>> clock_gettime(CLOCK_MONOTONIC, &ts0);
>> for (i = 0; i < NTRY; i++) {
>> clock_gettime(CLOCK_MONOTONIC, &ts1);
>> if (timespeccmp(&ts0, &ts1, <=)) {
>> ts0 = ts1;
>> continue;
>> }
>> printf("%d Back %lld.%09lu => %lld.%09lu\n",
>>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
>>    ts1.tv_nsec);
>>     break;
>> }
>> printf("%d Stopped\n", (int)getthrid());
>> return (NULL);
>> }
>> int
>> main(int argc, char *argv[])
>> {
>> int i, n = NTHREAD;
>> pthread_t *threads;
>> threads = calloc(n, sizeof(pthread_t));
>> for (i = 0; i < n; i++)
>> pthread_create(&threads[i], NULL, start, NULL);
>> for (i = 0; i < n; i++)
>> pthread_join(threads[i], NULL);
>> }
>> ----
>> The machine has 4 vCPUs and showing the following message on boot.
>>    cpu1: disabling user TSC (skew=-5310)
>>    cpu2: disabling user TSC (skew=-5335)
>>    cpu3: disabling user TSC (skew=-7386)
>> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
>> delayed against cpu0.
>> Simply ignoring the skews by the following diff seems to workaround
>> this problem.
>> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
>> index 238a5a068e1..3b951a8b5a3 100644
>> --- a/sys/arch/amd64/amd64/tsc.c
>> +++ b/sys/arch/amd64/amd64/tsc.c
>> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
>>   u_int
>>   tsc_get_timecount(struct timecounter *tc)
>>   {
>> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> + return rdtsc_lfence();
>>   }
>>     void
>> So I supposed the skews are not calculated properly.  Also I found
>> NetBSD changed the skew calculating so that it checks 1000 times and
>> take the minimum value.
>>    https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
>>    https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
>> I checked skews on the machine by the following debug code.
>> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
>> index 238a5a068e1..83e835e4f82 100644
>> --- a/sys/arch/amd64/amd64/tsc.c
>> +++ b/sys/arch/amd64/amd64/tsc.c
>> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t
>> *bptscp, uint64_t *aptscp)
>>   *aptscp = tsc_sync_val;
>>   }
>>   +#define TSC_SYNC_NTIMES 1000
>> +
>> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
>> +
>> +void
>> +tsc_debug(void)
>> +{
>> + int i, cpuid = curcpu()->ci_cpuid;
>> +
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
>> + if (i % 10 == 0)
>> + printf("%5d", tsc_difs[cpuid][i]);
>> + else
>> + printf(" %5d", tsc_difs[cpuid][i]);
>> + if (i % 10 == 9)
>> + printf("\n");
>> + }
>> + printf("\n");
>> +}
>> +
>>   void
>>   tsc_sync_bp(struct cpu_info *ci)
>>   {
>> + int i, mindif = INT_MAX, dif;
>>   uint64_t bptsc, aptsc;
>>   - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
>> - tsc_read_bp(ci, &bptsc, &aptsc);
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
>> + tsc_read_bp(ci, &bptsc, &aptsc);
>> + dif = bptsc - aptsc;
>> + if (abs(dif) < abs(mindif))
>> + mindif = dif;
>> + tsc_difs[ci->ci_cpuid][i] = dif;
>> + }
>>     /* Compute final value to adjust for skew. */
>> - ci->ci_tsc_skew = bptsc - aptsc;
>> + ci->ci_tsc_skew = mindif;
>>   }
>>     /*
>> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
>>   void
>>   tsc_sync_ap(struct cpu_info *ci)
>>   {
>> - tsc_post_ap(ci);
>> - tsc_post_ap(ci);
>> + int i;
>> +
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
>> + tsc_post_ap(ci);
>>   }
>>     void
>> ----
>> Stopped at      db_enter+0x10:  popq    %rbp
>> ddb{0}> machine ddbcpu 1
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{1}> call tsc_debug
>> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
>>    -11    -9    -5    -3    -4    -3    -7     8    -5    -6
>>     -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
>>     -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
>>     -9    -1    -8     1    -8     6    -5    -4     2    -2
>>     -8    -3    -1    -5    -2    -2     1     2    -2    -9
>>    -12     0    -9    -2    -2    -5    -2     1     2     0
>>     -1     2    -2     6    -5    -1    -2    -4     2    -2
>>      0    -9    -9    -6    -2     2     3    -6    -1     3
>>      8     4    -2     2    -8     7     1     2    -2     1
>>     -2    -6    -2     5     0     0    -4    -9     6    -2
>>     -3    -6    -2   -12     1    -9    -2    -3   -10    10
>>      2    -1    -3    -2     3     1     1    -5     3    -3
>>     -5     1    -6    -2    -3     0     0     9     1     6
>>      8    -6     5     4   -12    -1     4     2    -1    -1
>>     -1     2     2     0    -5     1     2    -8     3     9
>>      0     6    -3     4     6     0     8     6   -14    -1
>>     -1     0    -6    -7     6   -10     7    -6    -5    -4
>>      6   -12     4     3    -5     5     1    -6     3     0
>>     -2     0     6    -9    -2    -1     1    -1     4     0
>>      4    10   -13     1    -8    -2    -8    -3    -5    -3
>>     -5    -5     1    -9    -9     0    -3    -1     2     6
>>     -2     2    -3    -9    -9   -11    -7    -6    -4    -9
>>     -4    -9    -3    -4     0    -5     0    -9   -12    -7
>>     -6    -9     1    -5    -4   -12     7    -3   -12    -4
>>     -5    -5    -6    -9    -7    -1     0     0    -1    -2
>>     -6    -8     0     1    -8    -5    -2    -4     0    -1
>>     -3   -10   -15    -3    -8   -11    -9    -9     2     0
>>     -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
>>      0     0     2    -2    -4     1    -6     0     0    -5
>>     -2    -7    -5    -2    -2     1    -2    -6    -1    -7
>>     -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
>>     -4    -3    -4   -11     1    -9     0    -3     2    -9
>>     -8     2    -1    -7    -5    -5    -9     2    -3    -5
>>      0     5   -12     0    -5    -3    -6    -1   -13   -10
>>     -9     0     0    -5    -7    -4    -3    -3    -3    -2
>>     -2     3    -5    -3    -5    -1    -7    -4   -10     0
>>     -3     0     2     1    -4    -1    -5    -3    -5    -6
>>     -4    -8    -3     0    -1    -2   -13   -10    -9    -5
>>    -11   -11    -4    -3     0     5    -2    -3    -6     0
>>     -6    -9    -1    -4    -1     2    -2    -7    -9     0
>>     -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
>>     -8    -6    -2    -3    -9    -5    -9   -11   -10     1
>>     -3    -6    -1    -1    -6     0     0    -8    -4     0
>>     -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
>>     -4     2    -2 -5012     5     2   -17     0     7    -5
>>      0    -4    -3     6    -7    -1    -1     4    -6     3
>>      0    -4    -9    -7   -11   -11     8    -7   -15   -10
>>      3    -4     1   -17    -4     3   -17     0     4     3
>>     -2     0    -3   -10    -2     1     3    -5   -12   -19
>>      1     2     5     1    -9     4    -2    -3    -4     0
>>     -1   -11    -3    -1    -9    -5     0    -8     7    -2
>>     -6    -7     4    -5    -2    -1    -5     0    -5    -5
>>    -14    -2    -8     0   -11     9   -10     2    -6   -17
>>     -3    -5    -6     2     0     9   -14     0    -4    -7
>>      6     2     2    -9    -9     5     5     0    -6     3
>>    -12     5    -2   -13   -10    -5    -7     2   -11    -3
>>     -6    -2   -13     1     8    -5   -14     2     4    -3
>>    -13    -5   -11    -9   -10     4    -3    -1     9   -17
>>    -11     2   -13    -2    -1    -9   -10     0    -5    -4
>>      0    10    -8    -5    -8    -3   -14    -6     3   -15
>>      1    -5     1   176    -8    -7    -7    -4    -1    -1
>>     -8    -7    -4     1    -6    -9     1    -2    -9    -4
>>     -4    -1    -7     0    -8    -3    -4    -3    -1    -2
>>     -5    -6    -9     2    -6     0    -8    -5     0    -9
>>    -10     0    -4     4    -6   -11    -3     2   -12     1
>>     -2    -6    -6    -3    -7    -7     0    -9    -1    -9
>>     -1    -8    -4    -3   -11     1     0     1    -2    -4
>>    -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
>>     -3    -4    -2    -4     1     0    -5    -2    -1     4
>>     -9    -1    -4     1    -8   -11     0   -10    -4    -9
>>     -5    -2    -2     4     0    -7    -4     1    -2     1
>>     -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
>>     -4    -9    -7    -5    -3     3    -5   -12    -3     0
>>     -8    -4    -9    -5    -6     0     0    -1    -2    -6
>>     -8   -12    -3     1     2    -6    -1    -7   -10    -9
>>     -6    -8     0    -2    -3    -7    -3    -2     6    -3
>>    -12     0     0    -7    -9    -6    -1    -5    -2    -9
>>     -6     1     0    -3    -1    -1    -2     2    -2    -3
>>     -7    -9    -1    -8    -4    -2     5    -5    -3   -10
>>      2     6    -3     0    -6    -8    -9    -1    -1    -7
>>     -8    -1    -1    -4    -4     7    -2   -10   -11    -6
>>      2     2    -4     3    -2    -1    -3     0     0    -7
>>     -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
>>      0     1    -3     5    -3    -4    -1    -6    -9    -4
>>     -6     0    -9    -6     0    -2     4    -2    -4   -10
>>     -9    -4    -3    -9    -3    -6    -9    -8    -4     1
>>     -5    -6    -5     1     0    -2    -3    -6    -5    -9
>>     -4     1    -5    -4    -2    -4    -8    -3    -4     0
>>      2    -5    -3    -7    -1    -2    -1    -9    -6   -15
>>    -10    -6    -2    -7    -1    -3     3    -6    -6    -9
>>    -10    -8    -9    -2    -3     0    -6     3    -4     4
>>      3     3     8    -2    -2    -4     0    -3    -9    -3
>>     -6    -4     3     2     1     1    -3    -7   -15    -1
>>     -4    -6    -1    -2    -1   -12     2    -1    -4     1
>>      2     3    -5     3    -3    -7    -6    -5     0     1
>>      5   -13    -8     0    -5     2     0    -5    -3     6
>>     -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
>>    -10    -4   -10    -9    -2     1     0    -4    -3     0
>>      1    -3    -1    -4    -7   -10   -13    -8    -1    -1
>> 0x1
>> ddb{1}> machine ddbcpu 2
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{2}> call tsc_debug
>> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
>>      3     3    -8    -3    -4     4     0    -8    -7    -5
>>     -5     3    -7    -5    -4    -9    -7    -3     0     2
>>     -5     2     1     3    -2     3     8    -6   -11     8
>>      8    -5     1     5     0    -8     2     0     6     3
>>    -14     7    -2    -1    -3     1    -5    -6     0     5
>>      1    -1     0    -2    -5     2    -3     0    -3    -1
>>     -5   -12    -4    -4    -9     4     0    -2    -2    -8
>>      2     5     7    -2     0    -6   110    -8    -8    -4
>>      0     5    -7    -3    -5    -4     9    -2    -2     3
>>     -8    -2    -5     4    -3   217     0    -7    -7    -6
>>      7   -10    -9    -3     3   -14     3    -5     5   -12
>>      5    -8   -17    -5   286    -6     0    -3    -4    -2
>>      1    -5    -5    -9    -6    -7    -3    -5     6     0
>>      1    -1    -4    -2     2    -2    -2    -2    -5     2
>>     12     3   -18    -8     6    -4    -3     6     2    -3
>>     -7    -3     4    -5   -23     9     6     6    -6   -11
>>      9    -1   -10 50505    -1     2     6   -11     2    -2
>>     -4    -6   201     1     3     4    -9     6     0     1
>>     -4     0    -1     3     4     1     6    -7    -5     4
>>    -14    -3    -1    -8     5     6    -5     3    -7    -9
>>     -7     1    -2     5    -2     0    -2    -9     4    -3
>>     98    -5     7    -7     3     0    -5     0     9     2
>>     -7    -5    -3   -12   -11   -11     6    -5    -7    -6
>>    210     5    -3    -5    -4   -11    -6     0    -5    -9
>>      3     0    -9     5     1     0     0    -7    -5   210
>>      1    -6   -17    -8     0     1    -2    -8     1    -7
>>     10    -8    -8    -9     4    -2    -4    -3   204     5
>>     -9   -15     3    -1    -5     0   -12    -1     0     1
>>     -1    -6    -5    -9    -1     4    -1    -1     0     1
>>      4    -8   -13     1     0    -5    -6     0    -4     0
>>      6    -2    -4    -8    -7   -12    -2    -2    -6    -8
>>     -5     0    -8    -7   -11     0     6    -1    -8    -3
>>      2     6    -6     0   -10   285    -1    -2    -8    -6
>>     -6    -1    -5    -6     0    -5    -8    -5     1    -8
>>     -1     1     4    -3    -4   188    -3    -3   -10     5
>>      6     0    -7     4     1     2     0    -2    -2     2
>>     -3    -1    -9   -12   201    -1    -7    -1     8     0
>>      0     0    -5     0     7   -18     5     1    -2    15
>>      5    -6     4   -10   272     0    -4    -3     2   -10
>>     -7     7     3     4     1     6    -9    -8   -12    -2
>>     -2    -2    -6     8     3    97    -1    -7     5     1
>>     -7     4    -6    -9    -7    -2     0    -6     8   -13
>>     -1     3    -9    -4   233    -2     0     0    -5    -5
>>     -2     0     0     5    -7     6   -14     4    -6     5
>>      4     3     3    -3   103    -2    -6   -11     2    -2
>>     -3    -8     0    -1     1     0    -6     1     1   -10
>>     -1     0    -1     0     0    -1    -6    -4    -4    -3
>>      3     0    -5     0     2    -2     6     0   -13     3
>>      1   -16    -2   -12   206    -4    -6    -5    -3     2
>>     -8    -2    -9    -2     9     7    -1     1     3    -5
>>      6     6    10     0    99    -2    -1    -2     0    -6
>>     -8    -9     0     3     0   -11    -6     1    -4     9
>>    -11   -11     2    -1   276    -7     2     4    -4    -3
>>      4     2   -12     8     1    -4     0    -1    -1    -1
>>      5    -8     0     6   232    -4     2    -2   -11     2
>>     -6     0     4     6    -7     8    -6     3    -3    -9
>>      0     1    -7     2    -3    -5    -3    -2    -8    -4
>>    -14    -2     0     4    -4    -3    -4     9     3    -1
>>     -5    -8     1     0   210     0    -6    -4     2     2
>>      0    -3    -4     0     4   -12    10    -2    -3    -1
>>      3     7    -3     6    -9   190     4     6    -2    11
>>    -10    -2    -9     3     2     4    -4    -7    -9    -2
>>    -10    12     1    -7     3    -1     0    -1   -11     6
>>      6     0    -8     1     4     2    -2    -5     0     0
>>      5    -5    -3    -5   205    -1    -3    -1     0    -4
>>     -3    -7     3     0    -7    -5    -4    -3     7     1
>>    -14    -2     0   -14     2     0     7    11    -2    -7
>>      6    -6    -3    -4     0     4    -3    -4    -3    -7
>>     -6     3    -4     0     4    -3    -6     3     4    -4
>>     -6     7   -11     1   -10   -10   -12    -4    -3     6
>>     -5    -6     5   212    -8     1    -4     3    -3    -8
>>      0   -10     0     2     6    -3    -1   -13     1     6
>>     -6     5    -4     0    -7    -4    -5    -6     1    -2
>>      1   -10   -12    -3    -8     9   -11     0     1    -3
>>     -1     1   186     2   -12     3    -4     0     0    -1
>>     -5    -4     1    -1     4     5   -10     0    -4     1
>>     -1    -6   270     0   -17     5     0     0    -4    -1
>>      4     6     1     0    -6     6     5    -3     3    -2
>>     -6    -7    18   -16     0     9     4     3    -1     6
>>      4     1    -5     7   -11    -1    -6    -2     6    -2
>>     -8   256    -5    -2     1    -1    -5    -3    -9     0
>>     -1     3    -2   -11     4     3    -7    -3     3    -1
>>     -5    -5     0    -4    -1    -3    -3     6    -3     3
>>      3    -2   -11    -2    -3    11    -8     1     5    -7
>>      5   -12    -3     8    -9    -5     7     5    -3     2
>>     -7    -3    -6     2    -2    -1    -2    -9    -8    99
>>      6    -2     9    -1    -4    -2     0    -2    -7    -5
>>      0     1    -4    -8    -1    -2     2    -8     2   205
>>     -3   -10    -1    -1    -2    -5     2     2     5    -2
>>     -5    -6    -4     6     6    -6     4     1    -5     0
>>     -7     3     1     0   -11    -7    -3     5    -5     5
>>      1    -1     3    -5    -8     0    -1     0   183    -5
>>      0     4    -1    -6   -11   -10     1   -18     3    -1
>>     -5    -9    -2     2     2    -2     0    99    -7    -8
>>     -1    -3    -5    -1    12    -3    -1     2     1     4
>>      7     3   -14     2    -4     8    -9    -3    -8    -5
>>      6    -6     5   -12     6    -1    -9    -4    -4     1
>>     -6     0     0    -2    -3    -5    -9    -2    -9    -3
>>      3   -16    -2    -1     0     9    -4     5    -6     5
>> 0x1
>> ddb{2}> machine ddbcpu 3
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{3}> call tsc_debug
>> -8336 -6457 -45527     0    -1     0    -2     4     0     5
>>     -9    -6    -4    -4     6     4     0    -3    -4     5
>>      3     6   -12    -1     1     1    -3     6    -4    -2
>>     -2     2     4    -3     0    -1     3     0     1     3
>>     -3     3    -1     4    -5    -2    -2    -9     6    -9
>>      0     1    -2    -6     8    -4    -2    -2     6     1
>>     -1     1    -6    -6     4    -5    -1     6    -1    -1
>>      3     5     0    -6     5    -4    -2    -6    -3    -4
>>     -5     2    -3    -3    -5    -3    -5 -5720     0     5
>>     -1    -3     3    -2     4    -6     8   -16    -6    -3
>>     -2     4     8    -3     3    -1     2    -8    -3   -19
>>     -8     3    -7    -9    -6    -3     1    -3    -6     7
>>      4     1     3     2    -4     7    -3     2     2    -4
>>    -10    -8   -14    -2     2    -3     3    -2     3    -3
>>      5     5    -6     9    -3   -12    -6     1   -10     7
>>     -6     5    -4     1     6     3     2     2    -6    -1
>>      6    -8    -5     7     3    -3    -4    -6     1    -5
>>      4    -6     2     6    -6     3    -8    -5    -6     0
>>     -5    -2   -13    -8     3     0   -17    -7    -9     1
>>      6   -12     3     6     3    -3     4    -1    -7     0
>>      2     0    -7   -10    -6     3     1     2   -19     4
>>      1   -18     1    -3    -6   -14     4     6     3    -4
>>     -7   -11    -1    -1     3     0     6     6    -8   -14
>>      3    -2     6    -5     0     1     0    -7     0     4
>>     -3   -16    -2    -4   -12    -4     6     0    -8    -4
>>     -4    -4    -3     0    -6   -13   -10   -15    -6     2
>>      0    -3     0    -8     4    -1    -1     5    -4    -1
>>     -7     2     1     1     3    -3    -1   -18     6     8
>>     -2     3    -6     0    -6    -2     2    -2    -7     1
>>     -6   -13    -4    -2    -1    -6     6    -5    -9   -14
>>      4     5    -4    -2    -9    -2    -2   -13     1   -18
>>     -1     2    -5     6    -6    -7    -9    -6     1     6
>>    -13    -4     3     0    -8    -6    -6   -10    -2    -9
>>      5     2     4     1     6    -5    -8    -6     2    -4
>>     -3    -5    -2    -6   -10     0     5    -2     8    -3
>>      8   -11   -11    -7    -5   -13   -19    -5   -14    -3
>>      3     2     1     3     6    -1    -9   -16     3    -7
>>      1    -3    -5     0    -7     6     4    -2    -2     4
>>      4    -6    -6     8    -6    -7    -5    -2     0     4
>>     -1     3     1     3    -6    -2    -4    -9     1     0
>>     -2     3     2   -16     4   -15   -11    -3     8     0
>>     -6    -3   -18    -7    -8     8    -8     6    -7    -4
>>     -8    -7    -9     0    -2     3     7    -2     1    -6
>>      2    -6     8    -1   -12    -8    -4     3   -13    -2
>>    -11     1    -2    -7    -3     0   -16    -8     4    -9
>>    -15    -8    -9     8     5     7    -9     5   -10    10
>>      1     6    -6     3    -6    -4     5     0    -3    -7
>>     -1    -4   -10    -2     0   -11     8    -8    -3   -11
>>      4    -6     1    -8    -1    -6     3    -1   -12    -7
>>     11    -1     0    -4   -13     0   -10     7    -2     0
>>     -6     4     0   -12    -9     6    -2    -5    -5    -7
>>     -1    -9    -5     3     3    -7     3   -16    -2   -10
>>      0    -2     6     4     4    -6    -9    -3    -6     4
>>     -5    -1     7   -11   -21    -9    -3    -1     4   -13
>>     -7     0    -3     0   -10    -7     8    -9     7     6
>>     -9   -14     5    -9    -7    -8    11    -6     1    -3
>>     -9     7     5     0   -12    -3    -4   -18     0     4
>>     -1     8    -8     9     4     0     5   -10   -10    -8
>>      1     8    -1     4     1    -3    -6    -6    -5    -1
>>    -12    -6    -8   -14   -10     2    -1     9     0    -9
>>      0    -8    -6    -5     1   -14    -6     5     1    -7
>>      3    -9     6    -4     3     0   -21     8     7     5
>>      0     0    -2     2     1    -7   -11     1    -7     2
>>     -3    -2     9     1     3    -1    -8     0   -18    -7
>>     -3     6     1     1    -8    -5    -1     2    -4    -6
>>    -10    -5   -20   -18     5    -7     2     5    -3    -3
>>     -6    -3    -3     4    -7    -2    -4     2    -6   -11
>>     -4   -15    -6    -5     2    -1   -10    -4    -6    -3
>>     -1     0    -6   -10     5    -5     2     2    -8     6
>>     -1     5    -5    -9    12     0    -6   -17     2    -4
>>      4   -11    -1    -8     0    -3   -11    -8     0    -6
>>      2    -1    -4    -9   -12     3     6   -10    -2    -6
>>    -13     1   -10     1   -13     5    -4     3   -11     4
>>     -8     4     4   -17     6   -12     3   -13     0    -3
>>     -7     4   -11    -1     1     3     5    -8    -3     0
>>      4    -8    -1     4   -13     2    -1     2     5    -6
>>     -6     4    -4    -5     1    -4     4     5    -2   -10
>>     -9     0   -14    -2    -7     1    -1   -14   -15     8
>>     -3     9    -3    -4    -8     0     2     5   -11   -13
>>     -5   -13    -3    -7     9    -3    -7    -6    -9    -7
>>     -8   -10    -1     6     2     2     3   -13    -6    -5
>>      3   -13     2    -6     4     1     0    -9     4   -11
>>    -15     0     1   -12    -1     2   -11     2    -1   -13
>>    -13    -5     3     9   -11    -8     2   -12    -2    -5
>>      0    -3    -2     1    -6    -2    -1     0    -3     2
>>      0    -9    -4     1    -2     3    -6     0    -4    -6
>>      2     1   -14    -4    -7   -23    -1    -4    -8    -8
>>      2    -4     1     6   -10     5    -9    -6     6    -1
>>      4    -2    -9     0    -5    -1     8     0     3     4
>>     -4    -7    -4     2   -15    -6     2     1    -6    -4
>>     -3    -3     3    -7    -2    -9     9    -2    -9    -4
>>      3    -8   -10    -3    -4     1    -4   -10    -1     3
>>     -1   -15     5     0     2    -6     4     6    -2     0
>>      2     5     3   -12    -5    -5    -2    -4    -4     5
>>     -8    -4    -6   -16    -1     4    -4    -1    -8     0
>>      6   -10     5     0     1    -3    -9     8     0   -11
>>     -3   -13    -1     3     3    -6    -6    -2     3     5
>>      4    -6    12   -17     1    -5    -5    -2     1    -3
>>     -7     5    -4     8    -5    -1    -5     8   -12     4
>>     -6     2    -5    -9     2    -2     5     3    -5    -8
>> 0x1
>> ddb{3}>
>> ----
>> I seems that we can fix the problem by comparing TSC more times and
>> choosing the minimum value.
>> The diff also includes a fix for the problem (use the minimum value of
>> 1000 samplings).  With the diff, I tried "monotime" test program over
>> 100 times, it didn't find any clock going back.
>> dmesg
>> ----
>> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>>      [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>> real mem = 6425083904 (6127MB)
>> avail mem = 6215311360 (5927MB)
>> random: good seed from bootblocks
>> mpath0 at root
>> scsibus0 at mpath0: 256 targets
>> mainbus0 at root
>> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
>> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date
>> 06/25/2015
>> bios0: VMware, Inc. VMware7,1
>> acpi0 at bios0: ACPI 4.0
>> acpi0: sleep states S0 S1 S4 S5
>> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
>> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3)
>> S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3)
>> S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
>> acpitimer0 at acpi0: 3579545 Hz, 24 bits
>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
>> cpu0 at mainbus0: apid 0 (boot processor)
>> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
>> cpu0:
>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu0: 256KB 64b/line 8-way L2 cache
>> cpu0: smt 0, core 0, package 0
>> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
>> cpu0: apic clock running at 65MHz
>> cpu1 at mainbus0: apid 1 (application processor)
>> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
>> cpu1:
>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu1: 256KB 64b/line 8-way L2 cache
>> cpu1: disabling user TSC (skew=-5310)
>> cpu1: smt 0, core 1, package 0
>> cpu2 at mainbus0: apid 2 (application processor)
>> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
>> cpu2:
>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu2: 256KB 64b/line 8-way L2 cache
>> cpu2: disabling user TSC (skew=-5335)
>> cpu2: smt 0, core 2, package 0
>> cpu3 at mainbus0: apid 3 (application processor)
>> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
>> cpu3:
>> FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu3: 256KB 64b/line 8-way L2 cache
>> cpu3: disabling user TSC (skew=-7386)
>> cpu3: smt 0, core 3, package 0
>> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins,
>> remapped
>> acpimcfg0 at acpi0
>> acpimcfg0: addr 0xe0000000, bus 0-127
>> acpihpet0 at acpi0: 14318179 Hz
>> acpiprt0 at acpi0: bus 0 (PCI0)
>> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
>> acpicmos0 at acpi0
>> "PNP0A05" at acpi0 not configured
>> acpiac0 at acpi0: AC unit online
>> acpicpu0 at acpi0: C1(@1 halt!)
>> acpicpu1 at acpi0: C1(@1 halt!)
>> acpicpu2 at acpi0: C1(@1 halt!)
>> acpicpu3 at acpi0: C1(@1 halt!)
>> cpu0: using Broadwell MDS workaround
>> pvbus0 at mainbus0: VMware
>> vmt0 at pvbus0
>> pci0 at mainbus0 bus 0
>> 0:16:0: rom address conflict 0xffffc000/0x4000
>> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
>> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
>> pci1 at ppb0 bus 1
>> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
>> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA,
>> channel 0 configured to compatibility, channel 1 configured to
>> compatibility
>> pciide0: channel 0 disabled (no drives)
>> atapiscsi0 at pciide0 channel 1 drive 0
>> scsibus1 at atapiscsi0: 2 targets
>> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00>
>> removable
>> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
>> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus
>> disabled
>> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
>> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
>> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic
>> 4 int 17
>> mpi0: 0, firmware 1.3.41.32
>> scsibus2 at mpi0: 16 targets, initiator 7
>> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
>> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
>> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
>> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
>> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
>> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
>> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
>> pci2 at ppb1 bus 2
>> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
>> pci3 at ppb2 bus 3
>> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4
>> queues, address 00:0c:29:7d:49:9c
>> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
>> pci4 at ppb3 bus 4
>> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
>> pci5 at ppb4 bus 5
>> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
>> pci6 at ppb5 bus 6
>> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
>> pci7 at ppb6 bus 7
>> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
>> pci8 at ppb7 bus 8
>> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
>> pci9 at ppb8 bus 9
>> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
>> pci10 at ppb9 bus 10
>> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
>> pci11 at ppb10 bus 11
>> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
>> pci12 at ppb11 bus 12
>> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
>> pci13 at ppb12 bus 13
>> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
>> pci14 at ppb13 bus 14
>> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
>> pci15 at ppb14 bus 15
>> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
>> pci16 at ppb15 bus 16
>> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
>> pci17 at ppb16 bus 17
>> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
>> pci18 at ppb17 bus 18
>> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
>> pci19 at ppb18 bus 19
>> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
>> pci20 at ppb19 bus 20
>> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
>> pci21 at ppb20 bus 21
>> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
>> pci22 at ppb21 bus 22
>> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
>> pci23 at ppb22 bus 23
>> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
>> pci24 at ppb23 bus 24
>> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
>> pci25 at ppb24 bus 25
>> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
>> pci26 at ppb25 bus 26
>> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
>> pci27 at ppb26 bus 27
>> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
>> pci28 at ppb27 bus 28
>> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
>> pci29 at ppb28 bus 29
>> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
>> pci30 at ppb29 bus 30
>> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
>> pci31 at ppb30 bus 31
>> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
>> pci32 at ppb31 bus 32
>> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
>> pci33 at ppb32 bus 33
>> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
>> pci34 at ppb33 bus 34
>> isa0 at pcib0
>> isadma0 at isa0
>> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
>> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
>> com0: console
>> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
>> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
>> pckbd0 at pckbc0 (kbd slot)
>> wskbd0 at pckbd0 mux 1
>> pms0 at pckbc0 (aux slot)
>> wsmouse0 at pms0 mux 0
>> pcppi0 at isa0 port 0x61
>> spkr0 at pcppi0
>> efifb0 at mainbus0: 1152x864, 32bpp
>> wsdisplay0 at efifb0 mux 1
>> wskbd0: connecting to wsdisplay0
>> wsdisplay0: screen 0-5 added (std, vt100 emulation)
>> vscsi0 at root
>> scsibus3 at vscsi0: 256 targets
>> softraid0 at root
>> scsibus4 at softraid0: 256 targets
>> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
>> ----
>> This happens on 2 ESXi hosts at least
>> - 1
>>    - ESXi 6.0.0, 3029758
>>    - Xeon E5-2620 x 2
>> - 2
>>    - ESXi 6.7.0 Update 3 (Build 14320388)
>>    - Xeon Silver 4208 x 2
>>
>

ddb{1}>   -12    -3    -2     1    -2     1     0     0     0    -1
   -1     0     1     1     2    -2     0    -3     1     0
    1     3     2     1    -2     0     1     0     2     0
    1     0    -1     0     2     0     0     1     1     0
    1    -1     0     1     0     0    -2     0     0     0
   -1    -2    -4    -1    -3    -1    -3    -1    -1    -2
   -3    -1     0     1     0     0    -3    -2    -1     1
   -1     1    -4    -1    -1    -2    -1    -1    -4    -2
   -1    -2    -1    -1    -4    -3     0    -2    -1    -1
   -2    -2     0    -1    -1     1    -3    -1     0    -1
    0    -2    -2    -2     1    -1    -1    -2    -2    -2
   -1    -2    -1    -2    -3    -1    -1    -2     0    -2
   -3    -2    -1    -2    -1    -1    -2    -2     1    -1
    0    -2    -3    -2     1    -1     0    -1    -3    -2
    0    -1    -1    -2    -3    -1     0     0    -1    -1
   -3    -2    -1     0    -1    -1    -4    -1     0     0
   -1    -1    -3    -1    -1    -1     0     0    -2    -2
    0    -2    -1     1    -4    -2     0    -2    -1     1
   -4    -2     0     0    -1     0    -3    -1    -1    -2
    0    -3    -3    -1     0    -1    -1     1    -2    -2
   -1    -2    -1    -1    -2    -3    -1     0    -1    -1
   -2    -2     0    -1    -1     0    -2    -2    -1    -2
   -1    -3    -3    -1     1    -2    -1     0    -3    -2
    0    -1    -1    -2    -2    -1     0    -1    -1    -2
   -1    -1    -2    -2    -2    -1    -2     0     1    -3
   -1    -2    -1    -1    -1    -2    -2    -1    -1    -1
    0    -1    -2    -2    -1    -1     0    -3    -2    -2
   -1    -1     0    -3    -1    -1    -2    -1     0    -2
   -1    -1    -1     1     0    -2    -2    -1     0     0
   -2    -2    -3     0    -1    -1     1    -2    -3     1
   -2    -1     0    -2    -1    -1    -1     1     0    -3
   -2    -1    -2     1     0    -2    -2    -2    -2    -1
    0    -3    -2    -2    -1    -1     1    -2    -1    -1
    0    -1     1    -3    -2    -2    -1    -1     0    -3
   -3    -2    -2    -1     0    -2    -1    -2    -1     1
    0    -2    -2    -2    -1     0     0    -2    -1    -2
   -1     0     0    -3    -3    -1    -2    -2     0    -2
   -2    -2    -2    -1     1    -2    -2    -1    -1    -1
    0    -2    -2    -1    -1    -1     1    -2    -2    -1
   -1     0     0    -3    -1    -1    -1     1     0    -1
   -2     0    -2     1    -2    -1    -2    -2    -3    -1
    0     1    -3    -2    -3    -3    -1     0    -1    -1
    0    -2    -2    -1     0     0    -2    -2    -2     1
   -2    -1    -2     2     0    -1    -1    -1     0    -2
   -1     0    -2     0    -1    -3    -1     0    -1    -2
   -1    -3    -2    -1    -1    -1    -1    -2    -2     1
   -2    -2    -1    -3    -2    -1    -3    -2    -2    -4
   -2    -1    -2    -2    -1    -3    -2     1    -2    -2
    0    -2    -1    -1    -2    -1    -1    -2    -1     0
   -2    -1    -1    -2    -1     0    -1     0     0    -2
   -1     1    -2     0    -1    -2    -1    -1    -1    -1
    0    -2    -1    -1    -2    -1     0    -1    -2     1
   -1     0    -1    -2    -2    -1    -1    -1    -1    -3
   -2    -1    -1     0    -1    -2    -2     1    -1    -1
    0    -2    -2    -1    -1    -1     0    -2    -2    -1
   -2    -1     0    -2    -2    -1    -2     0    -2    -3
    0    -1    -2    -1     0    -3    -1     0    -2    -2
   -1     0    -1    -1     0     0    -1    -2    -1     0
    1     0    -3    -3     0    -1    -3     0     2     2
   -1     0     0     0     1     0    -1    -3     0    -2
   -2    -2     0    -2    -2    -1    -1     0     0    -1
    0    -1    -2    -2     0     0    -2    -3    -1     1
    0    -2    -1    -1     0    -3    -2    -1     0    -1
    0    -3    -2    -1     2     0     0    -2    -3     0
    0    -1     1    -2    -3     0     0    -1     0    -2
   -2    -1    -1     0     0    -3    -3    -1     0     0
    0    -3    -3    -1     0     1     0    -2    -3    -3
    0     0    -1    -1    -2     1     1     1     0    -2
    1     1     0    -2    -1    -1    -2    -1     1    -1
   -3    -1    -3     0    -1     0    -2    -2    -1    -1
   -1    -1    -2    -2    -1    -1    -1    -2     0    -2
   -3     0    -1    -1    -2    -2    -2     0    -2    -1
   -1    -1    -3    -1    -2    -1    -2    -3    -1     0
    0    -1    -1    -2    -1    -1    -1    -2    -1    -2
   -3    -1    -1     0    -2    -1    -2    -1    -1    -3
   -2    -1    -1     1    -2    -1    -1    -1     0     1
   -3    -3    -2    -1    -2     0    -3    -2    -2     0
   -2     0    -3    -2    -1    -2     1     1    -2    -2
   -3    -1     0    -2    -2    -4    -2    -1    -2    -1
   -3    -2    -2     0     0     0    -3    -3    -2     0
    0     0    -3    -4    -2     0     0     0    -3    -2
   -1    -1    -1     1    -3    -3    -2    -1    -2    -1
   -3    -3    -1    -1    -2    -1    -3    -2    -1     0
    0    -1    -1    -4    -2    -1     0     0    -2    -3
   -2     0     0    -1    -3    -3    -1    -1    -2     0
   -3    -3    -2    -2    -1     0    -2    -3    -1    -2
    1     0    -2    -3    -1    -2     0     0    -2    -1
   -1    -1     0    -1    -2    -3    -2    -1    -1    -1
   -3    -3    -2    -1     1    -1    -2    -2    -1    -2
    1     0    -3    -3    -1    -1     0     0    -3    -3
   -2    -1    -1     0    -2    -4    -2    -2    -1    -1
   -3    -2    -1     0     0     0    -2    -2    -1     0
    0     0    -3    -3    -1    -2    -1     0    -3    -1
   -1    -1    -1    -1    -3    -3    -1    -1     0    -2
   -2    -3     0    -1    -1    -2    -2    -1     0    -2
   -1    -1    -3    -2     0    -2    -1    -1    -2    -1
    0    -1    -2    -1    -1    -1     0    -1    -2    -2
   -2    -1     1    -3    -2    -2    -2    -1     1    -2
   -2    -2    -2    -1     0    -2    -2    -1    -1    -1
    1    -2    -1    -2    -1     0     0    -2    -2    -3

0x1
ddb{1}> Stopped at x86_ipi_db+0x12: leave
ddb{2}>   -63     0     0     1    -1    -1    -2     0    -2    -3
    1    -2    -2     0    -1     1     2    -1     0    -1
   -1    -3     0     0     0    -1    -1    -1     0     1
    0    -3     0     1     1    -1    -2     1     0    -3
   -3    -1    -2    -2    -1    -1    -1    -3     1     0
   -1    -2     0     0     0     0    -1    -2    -2    -3
   -1    -1     0    -2    -3     0    -3    -3    -1    -1
   -1     0    -3    -1    -3    -1    -1     0     0    -2
   -2    -2    -1    -1     0    -2    -2    -1    -1    -1
   -1     0     0     0    -3    -1    -1    -1    -1     0
   -2    -2    -2    -2    -1    -1     1     0     1     1
   -1    -2    -1    -1    -1    -1     0    -2     1    -2
   -2    -1    -2    -1     0     0    -1    -1     1    -1
    1     0     1    -4     0     0    -1     1     0    -1
    0    -4    -3    -1    -2    -2     2     1     0    -1
   -4    -1    -2    -1     0    -2    -3    -1    -2    -1
   -1    -1    -3    -1    -3    -1    -2    -3    -2    -1
    0     0    -1    -2    -2    -2    -1    -1    -1    -2
    0    -3    -1    -1    -2     0    -2    -2     0    -1
   -1    -1    -1     0    -1     0    -1     1    -1    -1
   -1    -2     1     0     1     2     0    -1     0     0
   -1    -1     1    -2     0    -1     0    -2    -2     0
    0     0    -2     0     0     0     0    -2     0    -2
    1    -1     1    -2     0    -1     0     0     0    -1
    1     0     0     0     0    -1     1     1     0     1
    1    -1     0    -3    -1     1    -1    -4    -2    -1
   -2    -1     0     0    -1    -1    -3    -3    -1    -1
    1     1     0     1    -1    -1    -1    -2    -1    -1
    0    -4     0     0    -2    -1     0     0    -3    -1
   -2    -2     1     0     0     0     1    -3     0     0
    0     1    -1     0    -2    -3    -2     0    -2    -1
    2     1    -1     0    -2    -2     0    -2     0    -2
   -1    -3    -3    -4    -1    -2    -2    -3    -1     0
    0    -1    -3    -1    -3    -1     0    -1    -2    -1
    1     1     1     0     0     0     0    -1     0    -1
   -2     0     0     0     0    -1     1    -1    -2    -2
   -2    -2     0     0     0    -1    -2     0    -2    -3
   -1     0    -2     0    -1     0    -1    -1    -1     0
   -1     1     0    -3     0     0     0    -3    -3    -1
   -3    -3    -2    -2    -4    -3    -1    -4     0    -1
   -2    -2    -1    -1     0     2    -2    -1     0    -2
   -4     0     0    -1    -2    -3    -1    -2     0    -2
   -1     0    -1    -2    -2    -1    -3    -1    -2    -1
   -1    -2    -1    -2    -3     0    -2    -3     1     0
   -1    -1    -1    -1    -1    -2     0    -1     0     0
   -1    -1     0     1     0    -1     0    -1     0    -1
   -1    -1     0    -1    -3    -1    -2    -4    -4    -1
   -1    -1    -1    -1     0    -3    -1     1    -1     0
   -2     1    -1    -1    -3    -2    -3    -2    -3    -2
   -1    -1     0    -1    -2    -2     1     0     1     0
   -3    -3     0    -4    -3    -1    -2    -1    -3    -2
   -1    -1    -1     0    -1     0    -1    -2    -1     0
   -2     0    -1    -1    -1    -1    -1     0    -2     0
   -1    -2     0     0    -1     0     0     1     1    -2
    0     0    -2     1    -1    -1    -1    -1     0     1
   -1    -1    -1    -1     0     0     0    -2    -2    -1
   -2    -2    -1    -2    -2    -2    -1     1    -3    -1
    1    -2    -3    -1    -1    -2    -2    -2     0     0
    0     0     0     1    -2    -2    -1    -1    -3     0
    0     0     0     0     0    -1    -3    -2    -2    -3
   -1    -1    -1    -2    -2    -1    -2    -2     1    -2
   -3     0     1    -1     0    -1     0    -1    -1     2
    0    -2     1     1     0     0     1     1    -1    -1
    1     0    -1     1     0    -1    -1     0     1     1
    0    -1     0    -1     0     0     0     1     0     1
   -1    -3    -2    -1    -1    -2    -3    -5    -4    -1
   -2    -1    -1     0    -1    -3    -1    -2    -2    -2
   -2    -1    -1    -3     1    -1    -2     0    -1    -1
    0    -1     0    -2     0     0    -2     1     0     0
    0     0     0     0     0    -2    -1    -2    -3    -2
   -1    -1    -1     0     2    -2     1     1    -3     0
    0     0     0     0     0    -1    -3    -3    -1    -3
   -1     0    -1    -2     0    -3    -1    -2    -1     0
   -1    -3    -1    -2    -1    -1     0    -3    -2    -3
   -2    -4    -2    -2    -2    -1    -1    -2    -3    -1
   -1     0    -2    -4    -3    -2    -2    -2    -2    -2
   -2     0     0    -1     1     0     0     0     0    -2
    2     0     1     0     1     0    -3    -3     0     0
   -3    -2    -2    -2    -4    -2    -1     0    -1    -3
    0    -1    -4    -2    -1    -2    -2    -4     0    -1
    0    -1    -3    -3    -3    -1    -2    -1    -1    -3
   -2    -2    -2    -2    -1     0    -1     0     0    -1
   -2    -3    -3    -1     1    -2     1     1    -1     1
   -1    -2    -3    -2     0     2    -3     0    -1     0
    2    -1     0    -2    -2     0    -1    -2    -1     0
    0     0     0     0    -2     0    -3     1     1     0
    0     0     1     1     0    -3    -1     0    -1    -2
   -3    -2    -2    -1     0    -1    -1    -1    -4    -5
   -1    -4    -2     0    -1    -1    -1    -2    -2     1
   -2     0    -2    -1    -2     0    -1    -1    -1    -1
   -1    -1    -2    -1     0    -2    -2     1    -1     0
    0    -1    -3    -2    -3    -3    -1    -2     0     0
    0    -2    -2     0    -1    -1    -1    -1    -1    -2
   -1    -3    -1    -1    -1     1     1     1     1    -1
    0    -1    -1     2     0    -2    -1    -1     0    -1
    0     0    -2     1    -1     0    -1     1     1     0
    0     0     1    -1    -1     0     1    -1     0     1
    1     1     0     1    -3    -1    -2     0    -1    -1
   -1     0     0    -3     0    -1    -1    -3    -2    -2
   -2    -1    -2    -3    -3    -3     0    -1    -1    -1

0x1
ddb{2}> Stopped at x86_ipi_db+0x12: leave
ddb{3}>   -65     1     0    -1     0     2     0     2     2     4
    2     1     1     1     1     1     3     2     2     3
    2     4     2     1     1     0     1     2     2    -1
    0    -1     1     0     1     0    -1    -1    -1     1
   -1     1     1     2     0     0     0     0     1     0
   -1    -1     1     1     1     0     0     0     0     0
    1     1     0     0     0     1     2    -1     1     0
   -1     0    -1     0     0     1     1     0     0    -1
    0     2     0     0    -1     0     1     0     0     0
    1     1     0     1     2     1     0    -1     1     1
    0    -1    -1     0     1     0     2     0     0     0
    0     0     1     0     0     0     1     0     1    -1
    1     1    -1    -1    -1     0    -1     1     1     1
   -1    -1     0     1     1     1     0     0    -2    -1
    1     1     0    -1     1     0    -1     0     1     1
    0    -1     0     1    -1     1     0     1     0     0
    0     1    -1    -1     1     2     1    -1     0    -1
    1     1     0    -1    -2    -1     0     1     2     1
    0     0     0    -1     0     1     1     0     0     0
   -2    -1     0     0     1     2    -2     0    -1     1
    1     0     0     0     0     0     1     1     0     1
   -1     1     1     1     1    -1     0     1     1     0
    2     2     0     1     0     1     2    -1     1     0
    1     1     0    -2    -1     0     1     1     0    -2
   -1     0     1    -1    -1     0    -1    -1     1     1
    0     0     1     0    -1     0     3     0     2    -1
    0     0     0     0     0    -2     0    -1    -1    -2
   -1     1    -2     0     0     1     0     0    -1    -1
    1     0     1     0     0    -1     1     0     1     0
    1     0     0     1     1     1     0     1     0     0
    1     0     0     0     1     0     0     0    -1     1
    2    -1     0    -1     0     1     0     1     2     1
    0    -1     0     2     1     0    -1     0    -2     1
   -1     0     1     0     1     1     0     1     1     1
    0     0    -1     0     1     2    -1     0     1     1
    1    -2     1     0     0    -1     0    -1     1     2
    0    -1     0    -1     0     1     0     0    -1    -1
    1     0    -1    -1     0    -2     0     1     1     0
   -1     1     0     1     1     0    -1    -1     1     0
    0     0     0    -1     0     2     1    -1    -1     1
    1     2     0     0     1     1     0     0     1     0
    0     0     2     0     1     0     1     1     1     0
   -1     0     2     1     1     1     0     1     1     0
   -1     1     2     1     1     1     0     0     0     2
    1     0     0    -1     0    -1    -1     1     0     1
   -1     0     0     0     1     0     1     2     1     1
    1     0     0     1     1    -1     0     1     2     0
    0     2     2     0     1     1     0     0     0     0
    1     0     0     0     0     2     0     1     0    -1
    0    -2     1     0     1    -1     0     1     0     0
   -1     0     0     0    -2     0    -1    -2    -1     1
    1     1     0    -1     1     2     1     2    -1     0
    1     0     1     1     0     1    -1     0     1     0
   -1     1     1     2     0    -1     1     1     1    -1
    0     0     1     0    -1     0     0     1     0     1
    0    -1     1     2     1     0    -1     0     1     1
   -1     1     1     1     1     1     2     1    -1     1
   -1     0     0     1     2    -1     0     1     0     0
    0     1     0     0     1    -1     0     0     1    -1
    0     0     1     1     1     0     0     0     1     1
    0     0     0    -1     0     0     1     2     1    -2
    0    -1     1     2    -1    -1    -1    -1    -2     0
    1     1     1     0    -1     0     1     0    -1    -2
    0     1    -1     0    -1    -1     0     0     0     0
   -1     0     1     0     0     1     1    -1     1     1
    0    -1     0     1     1    -2    -1     0     1     2
    2     1    -1    -1     0     2     0     0    -1    -1
    0    -1     2     2     1     0     1     1     0     1
    2     0    -1     0     0     1     0     1     1     0
    0     0     2     1     0     0     0     1    -1     1
    2     1     0    -1     0     2     1    -1    -1     1
    0     0     0    -1    -1     0     0    -1    -1     0
   -1     0     1     2    -1     0     0     1     0    -1
   -1     0    -1    -2    -1     0     1     2     0    -2
   -1     4     1    -1     0     0     1     0     1     0
    1     0    -1     1     3    -1     1     1     2     1
    0     0     1     2     1     0     1    -1     1     0
   -1     1     1     1     0    -1     1     1     1     0
    0     1     0    -1     0     1     1     1     0     0
    0     1     1     0    -1     0     2     0     0    -1
    0     0     0     0     0    -1     1    -1     0     1
    0     0    -1     0     1     0    -1     0     1     1
    1     1    -2    -2     1     0    -1     0     0     1
   -1     1     0     1     2    -1    -2     0     0     0
   -1     0     0     1     1     0     2     1     1     0
    1     0     1     1     0     0     0     1     2     0
    0     0     0    -1     1     1     3     1     0    -1
    0     0     0     0    -2    -1     1     0     1     0
    0    -1     1     0    -1    -2     0     1     0     1
    1     0     0    -1     0     1     0    -1    -1     1
    1     0     2     0    -1     0     1     1    -1    -1
    0     0     0     0     1    -2     1     0     1     0
    1     0    -1     1     1     0     0    -1    -1     1
    1     0     0     0     2     0     2     0     0     0
    0     2     0     0     0     0     1     1     1     1
    0     2    -1     0     2     0     0     0     1     1
    0     1     0    -1    -2    -1     0    -1     0     1
   -2     0     2     0     0    -1    -2    -1     0     0
    0     0     0     1     1    -2     0    -1     1     1
    0    -2     0     0     1    -2    -2    -1     0     0

0x1
ddb{3}>

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
In reply to this post by YASUOKA Masahiko-3
On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:

> Hi,
>
> I hit a problem which is caused by going back of monotonic time.  It
> happens on hosts on VMware ESXi.
>
> I wrote the program which repeats the problem.
>
>  % cc -o monotime monotime.c -lpthread
>  % ./monotime
>  194964 Starting
>  562210 Starting
>  483046 Starting
>  148865 Starting
>  148865 Back 991.808048665 => 991.007447931
>  562210 Back 991.808048885 => 991.007448224
>  483046 Back 991.808049115 => 991.007449172
>  148865 Stopped
>  562210 Stopped
>  483046 Stopped
>  194964 Stopped
>  % uname -a
>  OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
>  % sysctl kern.version
>  kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>      [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>  %
>
> monotime.c
> ----
> #include <sys/types.h>
> #include <sys/time.h>
> #include <stdio.h>
> #include <time.h>
> #include <unistd.h>
> #include <pthread.h>
> #include <stdlib.h>
>
> #define NTHREAD 4
> #define NTRY 50000
>
> void *
> start(void *dummy)
> {
> int i;
> struct timespec ts0, ts1;
>
> printf("%d Starting\n", (int)getthrid());
> clock_gettime(CLOCK_MONOTONIC, &ts0);
>
> for (i = 0; i < NTRY; i++) {
> clock_gettime(CLOCK_MONOTONIC, &ts1);
> if (timespeccmp(&ts0, &ts1, <=)) {
> ts0 = ts1;
> continue;
> }
> printf("%d Back %lld.%09lu => %lld.%09lu\n",
>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
>    ts1.tv_nsec);
>     break;
> }
> printf("%d Stopped\n", (int)getthrid());
>
> return (NULL);
> }
>
> int
> main(int argc, char *argv[])
> {
> int i, n = NTHREAD;
> pthread_t *threads;
>
> threads = calloc(n, sizeof(pthread_t));
>
> for (i = 0; i < n; i++)
> pthread_create(&threads[i], NULL, start, NULL);
> for (i = 0; i < n; i++)
> pthread_join(threads[i], NULL);
>
> }
> ----
>
> The machine has 4 vCPUs and showing the following message on boot.
>
>   cpu1: disabling user TSC (skew=-5310)
>   cpu2: disabling user TSC (skew=-5335)
>   cpu3: disabling user TSC (skew=-7386)
>
> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
> delayed against cpu0.
>
> Simply ignoring the skews by the following diff seems to workaround
> this problem.
>
> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> index 238a5a068e1..3b951a8b5a3 100644
> --- a/sys/arch/amd64/amd64/tsc.c
> +++ b/sys/arch/amd64/amd64/tsc.c
> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
>  u_int
>  tsc_get_timecount(struct timecounter *tc)
>  {
> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + return rdtsc_lfence();
>  }
>  
>  void
>
> So I supposed the skews are not calculated properly.  Also I found
> NetBSD changed the skew calculating so that it checks 1000 times and
> take the minimum value.
>
>   https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
>   https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
>
>
> I checked skews on the machine by the following debug code.
>
> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> index 238a5a068e1..83e835e4f82 100644
> --- a/sys/arch/amd64/amd64/tsc.c
> +++ b/sys/arch/amd64/amd64/tsc.c
> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
>   *aptscp = tsc_sync_val;
>  }
>  
> +#define TSC_SYNC_NTIMES 1000
> +
> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
> +
> +void
> +tsc_debug(void)
> +{
> + int i, cpuid = curcpu()->ci_cpuid;
> +
> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> + if (i % 10 == 0)
> + printf("%5d", tsc_difs[cpuid][i]);
> + else
> + printf(" %5d", tsc_difs[cpuid][i]);
> + if (i % 10 == 9)
> + printf("\n");
> + }
> + printf("\n");
> +}
> +
>  void
>  tsc_sync_bp(struct cpu_info *ci)
>  {
> + int i, mindif = INT_MAX, dif;
>   uint64_t bptsc, aptsc;
>  
> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
> - tsc_read_bp(ci, &bptsc, &aptsc);
> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> + tsc_read_bp(ci, &bptsc, &aptsc);
> + dif = bptsc - aptsc;
> + if (abs(dif) < abs(mindif))
> + mindif = dif;
> + tsc_difs[ci->ci_cpuid][i] = dif;
> + }
>  
>   /* Compute final value to adjust for skew. */
> - ci->ci_tsc_skew = bptsc - aptsc;
> + ci->ci_tsc_skew = mindif;
>  }
>  
>  /*
> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
>  void
>  tsc_sync_ap(struct cpu_info *ci)
>  {
> - tsc_post_ap(ci);
> - tsc_post_ap(ci);
> + int i;
> +
> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
> + tsc_post_ap(ci);
>  }
>  
>  void
>
> ----
> Stopped at      db_enter+0x10:  popq    %rbp
> ddb{0}> machine ddbcpu 1
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{1}> call tsc_debug
> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
>   -11    -9    -5    -3    -4    -3    -7     8    -5    -6
>    -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
>    -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
>    -9    -1    -8     1    -8     6    -5    -4     2    -2
>    -8    -3    -1    -5    -2    -2     1     2    -2    -9
>   -12     0    -9    -2    -2    -5    -2     1     2     0
>    -1     2    -2     6    -5    -1    -2    -4     2    -2
>     0    -9    -9    -6    -2     2     3    -6    -1     3
>     8     4    -2     2    -8     7     1     2    -2     1
>    -2    -6    -2     5     0     0    -4    -9     6    -2
>    -3    -6    -2   -12     1    -9    -2    -3   -10    10
>     2    -1    -3    -2     3     1     1    -5     3    -3
>    -5     1    -6    -2    -3     0     0     9     1     6
>     8    -6     5     4   -12    -1     4     2    -1    -1
>    -1     2     2     0    -5     1     2    -8     3     9
>     0     6    -3     4     6     0     8     6   -14    -1
>    -1     0    -6    -7     6   -10     7    -6    -5    -4
>     6   -12     4     3    -5     5     1    -6     3     0
>    -2     0     6    -9    -2    -1     1    -1     4     0
>     4    10   -13     1    -8    -2    -8    -3    -5    -3
>    -5    -5     1    -9    -9     0    -3    -1     2     6
>    -2     2    -3    -9    -9   -11    -7    -6    -4    -9
>    -4    -9    -3    -4     0    -5     0    -9   -12    -7
>    -6    -9     1    -5    -4   -12     7    -3   -12    -4
>    -5    -5    -6    -9    -7    -1     0     0    -1    -2
>    -6    -8     0     1    -8    -5    -2    -4     0    -1
>    -3   -10   -15    -3    -8   -11    -9    -9     2     0
>    -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
>     0     0     2    -2    -4     1    -6     0     0    -5
>    -2    -7    -5    -2    -2     1    -2    -6    -1    -7
>    -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
>    -4    -3    -4   -11     1    -9     0    -3     2    -9
>    -8     2    -1    -7    -5    -5    -9     2    -3    -5
>     0     5   -12     0    -5    -3    -6    -1   -13   -10
>    -9     0     0    -5    -7    -4    -3    -3    -3    -2
>    -2     3    -5    -3    -5    -1    -7    -4   -10     0
>    -3     0     2     1    -4    -1    -5    -3    -5    -6
>    -4    -8    -3     0    -1    -2   -13   -10    -9    -5
>   -11   -11    -4    -3     0     5    -2    -3    -6     0
>    -6    -9    -1    -4    -1     2    -2    -7    -9     0
>    -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
>    -8    -6    -2    -3    -9    -5    -9   -11   -10     1
>    -3    -6    -1    -1    -6     0     0    -8    -4     0
>    -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
>    -4     2    -2 -5012     5     2   -17     0     7    -5
>     0    -4    -3     6    -7    -1    -1     4    -6     3
>     0    -4    -9    -7   -11   -11     8    -7   -15   -10
>     3    -4     1   -17    -4     3   -17     0     4     3
>    -2     0    -3   -10    -2     1     3    -5   -12   -19
>     1     2     5     1    -9     4    -2    -3    -4     0
>    -1   -11    -3    -1    -9    -5     0    -8     7    -2
>    -6    -7     4    -5    -2    -1    -5     0    -5    -5
>   -14    -2    -8     0   -11     9   -10     2    -6   -17
>    -3    -5    -6     2     0     9   -14     0    -4    -7
>     6     2     2    -9    -9     5     5     0    -6     3
>   -12     5    -2   -13   -10    -5    -7     2   -11    -3
>    -6    -2   -13     1     8    -5   -14     2     4    -3
>   -13    -5   -11    -9   -10     4    -3    -1     9   -17
>   -11     2   -13    -2    -1    -9   -10     0    -5    -4
>     0    10    -8    -5    -8    -3   -14    -6     3   -15
>     1    -5     1   176    -8    -7    -7    -4    -1    -1
>    -8    -7    -4     1    -6    -9     1    -2    -9    -4
>    -4    -1    -7     0    -8    -3    -4    -3    -1    -2
>    -5    -6    -9     2    -6     0    -8    -5     0    -9
>   -10     0    -4     4    -6   -11    -3     2   -12     1
>    -2    -6    -6    -3    -7    -7     0    -9    -1    -9
>    -1    -8    -4    -3   -11     1     0     1    -2    -4
>   -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
>    -3    -4    -2    -4     1     0    -5    -2    -1     4
>    -9    -1    -4     1    -8   -11     0   -10    -4    -9
>    -5    -2    -2     4     0    -7    -4     1    -2     1
>    -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
>    -4    -9    -7    -5    -3     3    -5   -12    -3     0
>    -8    -4    -9    -5    -6     0     0    -1    -2    -6
>    -8   -12    -3     1     2    -6    -1    -7   -10    -9
>    -6    -8     0    -2    -3    -7    -3    -2     6    -3
>   -12     0     0    -7    -9    -6    -1    -5    -2    -9
>    -6     1     0    -3    -1    -1    -2     2    -2    -3
>    -7    -9    -1    -8    -4    -2     5    -5    -3   -10
>     2     6    -3     0    -6    -8    -9    -1    -1    -7
>    -8    -1    -1    -4    -4     7    -2   -10   -11    -6
>     2     2    -4     3    -2    -1    -3     0     0    -7
>    -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
>     0     1    -3     5    -3    -4    -1    -6    -9    -4
>    -6     0    -9    -6     0    -2     4    -2    -4   -10
>    -9    -4    -3    -9    -3    -6    -9    -8    -4     1
>    -5    -6    -5     1     0    -2    -3    -6    -5    -9
>    -4     1    -5    -4    -2    -4    -8    -3    -4     0
>     2    -5    -3    -7    -1    -2    -1    -9    -6   -15
>   -10    -6    -2    -7    -1    -3     3    -6    -6    -9
>   -10    -8    -9    -2    -3     0    -6     3    -4     4
>     3     3     8    -2    -2    -4     0    -3    -9    -3
>    -6    -4     3     2     1     1    -3    -7   -15    -1
>    -4    -6    -1    -2    -1   -12     2    -1    -4     1
>     2     3    -5     3    -3    -7    -6    -5     0     1
>     5   -13    -8     0    -5     2     0    -5    -3     6
>    -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
>   -10    -4   -10    -9    -2     1     0    -4    -3     0
>     1    -3    -1    -4    -7   -10   -13    -8    -1    -1
>
> 0x1
> ddb{1}> machine ddbcpu 2
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{2}> call tsc_debug
> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
>     3     3    -8    -3    -4     4     0    -8    -7    -5
>    -5     3    -7    -5    -4    -9    -7    -3     0     2
>    -5     2     1     3    -2     3     8    -6   -11     8
>     8    -5     1     5     0    -8     2     0     6     3
>   -14     7    -2    -1    -3     1    -5    -6     0     5
>     1    -1     0    -2    -5     2    -3     0    -3    -1
>    -5   -12    -4    -4    -9     4     0    -2    -2    -8
>     2     5     7    -2     0    -6   110    -8    -8    -4
>     0     5    -7    -3    -5    -4     9    -2    -2     3
>    -8    -2    -5     4    -3   217     0    -7    -7    -6
>     7   -10    -9    -3     3   -14     3    -5     5   -12
>     5    -8   -17    -5   286    -6     0    -3    -4    -2
>     1    -5    -5    -9    -6    -7    -3    -5     6     0
>     1    -1    -4    -2     2    -2    -2    -2    -5     2
>    12     3   -18    -8     6    -4    -3     6     2    -3
>    -7    -3     4    -5   -23     9     6     6    -6   -11
>     9    -1   -10 50505    -1     2     6   -11     2    -2
>    -4    -6   201     1     3     4    -9     6     0     1
>    -4     0    -1     3     4     1     6    -7    -5     4
>   -14    -3    -1    -8     5     6    -5     3    -7    -9
>    -7     1    -2     5    -2     0    -2    -9     4    -3
>    98    -5     7    -7     3     0    -5     0     9     2
>    -7    -5    -3   -12   -11   -11     6    -5    -7    -6
>   210     5    -3    -5    -4   -11    -6     0    -5    -9
>     3     0    -9     5     1     0     0    -7    -5   210
>     1    -6   -17    -8     0     1    -2    -8     1    -7
>    10    -8    -8    -9     4    -2    -4    -3   204     5
>    -9   -15     3    -1    -5     0   -12    -1     0     1
>    -1    -6    -5    -9    -1     4    -1    -1     0     1
>     4    -8   -13     1     0    -5    -6     0    -4     0
>     6    -2    -4    -8    -7   -12    -2    -2    -6    -8
>    -5     0    -8    -7   -11     0     6    -1    -8    -3
>     2     6    -6     0   -10   285    -1    -2    -8    -6
>    -6    -1    -5    -6     0    -5    -8    -5     1    -8
>    -1     1     4    -3    -4   188    -3    -3   -10     5
>     6     0    -7     4     1     2     0    -2    -2     2
>    -3    -1    -9   -12   201    -1    -7    -1     8     0
>     0     0    -5     0     7   -18     5     1    -2    15
>     5    -6     4   -10   272     0    -4    -3     2   -10
>    -7     7     3     4     1     6    -9    -8   -12    -2
>    -2    -2    -6     8     3    97    -1    -7     5     1
>    -7     4    -6    -9    -7    -2     0    -6     8   -13
>    -1     3    -9    -4   233    -2     0     0    -5    -5
>    -2     0     0     5    -7     6   -14     4    -6     5
>     4     3     3    -3   103    -2    -6   -11     2    -2
>    -3    -8     0    -1     1     0    -6     1     1   -10
>    -1     0    -1     0     0    -1    -6    -4    -4    -3
>     3     0    -5     0     2    -2     6     0   -13     3
>     1   -16    -2   -12   206    -4    -6    -5    -3     2
>    -8    -2    -9    -2     9     7    -1     1     3    -5
>     6     6    10     0    99    -2    -1    -2     0    -6
>    -8    -9     0     3     0   -11    -6     1    -4     9
>   -11   -11     2    -1   276    -7     2     4    -4    -3
>     4     2   -12     8     1    -4     0    -1    -1    -1
>     5    -8     0     6   232    -4     2    -2   -11     2
>    -6     0     4     6    -7     8    -6     3    -3    -9
>     0     1    -7     2    -3    -5    -3    -2    -8    -4
>   -14    -2     0     4    -4    -3    -4     9     3    -1
>    -5    -8     1     0   210     0    -6    -4     2     2
>     0    -3    -4     0     4   -12    10    -2    -3    -1
>     3     7    -3     6    -9   190     4     6    -2    11
>   -10    -2    -9     3     2     4    -4    -7    -9    -2
>   -10    12     1    -7     3    -1     0    -1   -11     6
>     6     0    -8     1     4     2    -2    -5     0     0
>     5    -5    -3    -5   205    -1    -3    -1     0    -4
>    -3    -7     3     0    -7    -5    -4    -3     7     1
>   -14    -2     0   -14     2     0     7    11    -2    -7
>     6    -6    -3    -4     0     4    -3    -4    -3    -7
>    -6     3    -4     0     4    -3    -6     3     4    -4
>    -6     7   -11     1   -10   -10   -12    -4    -3     6
>    -5    -6     5   212    -8     1    -4     3    -3    -8
>     0   -10     0     2     6    -3    -1   -13     1     6
>    -6     5    -4     0    -7    -4    -5    -6     1    -2
>     1   -10   -12    -3    -8     9   -11     0     1    -3
>    -1     1   186     2   -12     3    -4     0     0    -1
>    -5    -4     1    -1     4     5   -10     0    -4     1
>    -1    -6   270     0   -17     5     0     0    -4    -1
>     4     6     1     0    -6     6     5    -3     3    -2
>    -6    -7    18   -16     0     9     4     3    -1     6
>     4     1    -5     7   -11    -1    -6    -2     6    -2
>    -8   256    -5    -2     1    -1    -5    -3    -9     0
>    -1     3    -2   -11     4     3    -7    -3     3    -1
>    -5    -5     0    -4    -1    -3    -3     6    -3     3
>     3    -2   -11    -2    -3    11    -8     1     5    -7
>     5   -12    -3     8    -9    -5     7     5    -3     2
>    -7    -3    -6     2    -2    -1    -2    -9    -8    99
>     6    -2     9    -1    -4    -2     0    -2    -7    -5
>     0     1    -4    -8    -1    -2     2    -8     2   205
>    -3   -10    -1    -1    -2    -5     2     2     5    -2
>    -5    -6    -4     6     6    -6     4     1    -5     0
>    -7     3     1     0   -11    -7    -3     5    -5     5
>     1    -1     3    -5    -8     0    -1     0   183    -5
>     0     4    -1    -6   -11   -10     1   -18     3    -1
>    -5    -9    -2     2     2    -2     0    99    -7    -8
>    -1    -3    -5    -1    12    -3    -1     2     1     4
>     7     3   -14     2    -4     8    -9    -3    -8    -5
>     6    -6     5   -12     6    -1    -9    -4    -4     1
>    -6     0     0    -2    -3    -5    -9    -2    -9    -3
>     3   -16    -2    -1     0     9    -4     5    -6     5
>
> 0x1
> ddb{2}> machine ddbcpu 3
> Stopped at      x86_ipi_db+0x12:        leave
> ddb{3}> call tsc_debug
> -8336 -6457 -45527     0    -1     0    -2     4     0     5
>    -9    -6    -4    -4     6     4     0    -3    -4     5
>     3     6   -12    -1     1     1    -3     6    -4    -2
>    -2     2     4    -3     0    -1     3     0     1     3
>    -3     3    -1     4    -5    -2    -2    -9     6    -9
>     0     1    -2    -6     8    -4    -2    -2     6     1
>    -1     1    -6    -6     4    -5    -1     6    -1    -1
>     3     5     0    -6     5    -4    -2    -6    -3    -4
>    -5     2    -3    -3    -5    -3    -5 -5720     0     5
>    -1    -3     3    -2     4    -6     8   -16    -6    -3
>    -2     4     8    -3     3    -1     2    -8    -3   -19
>    -8     3    -7    -9    -6    -3     1    -3    -6     7
>     4     1     3     2    -4     7    -3     2     2    -4
>   -10    -8   -14    -2     2    -3     3    -2     3    -3
>     5     5    -6     9    -3   -12    -6     1   -10     7
>    -6     5    -4     1     6     3     2     2    -6    -1
>     6    -8    -5     7     3    -3    -4    -6     1    -5
>     4    -6     2     6    -6     3    -8    -5    -6     0
>    -5    -2   -13    -8     3     0   -17    -7    -9     1
>     6   -12     3     6     3    -3     4    -1    -7     0
>     2     0    -7   -10    -6     3     1     2   -19     4
>     1   -18     1    -3    -6   -14     4     6     3    -4
>    -7   -11    -1    -1     3     0     6     6    -8   -14
>     3    -2     6    -5     0     1     0    -7     0     4
>    -3   -16    -2    -4   -12    -4     6     0    -8    -4
>    -4    -4    -3     0    -6   -13   -10   -15    -6     2
>     0    -3     0    -8     4    -1    -1     5    -4    -1
>    -7     2     1     1     3    -3    -1   -18     6     8
>    -2     3    -6     0    -6    -2     2    -2    -7     1
>    -6   -13    -4    -2    -1    -6     6    -5    -9   -14
>     4     5    -4    -2    -9    -2    -2   -13     1   -18
>    -1     2    -5     6    -6    -7    -9    -6     1     6
>   -13    -4     3     0    -8    -6    -6   -10    -2    -9
>     5     2     4     1     6    -5    -8    -6     2    -4
>    -3    -5    -2    -6   -10     0     5    -2     8    -3
>     8   -11   -11    -7    -5   -13   -19    -5   -14    -3
>     3     2     1     3     6    -1    -9   -16     3    -7
>     1    -3    -5     0    -7     6     4    -2    -2     4
>     4    -6    -6     8    -6    -7    -5    -2     0     4
>    -1     3     1     3    -6    -2    -4    -9     1     0
>    -2     3     2   -16     4   -15   -11    -3     8     0
>    -6    -3   -18    -7    -8     8    -8     6    -7    -4
>    -8    -7    -9     0    -2     3     7    -2     1    -6
>     2    -6     8    -1   -12    -8    -4     3   -13    -2
>   -11     1    -2    -7    -3     0   -16    -8     4    -9
>   -15    -8    -9     8     5     7    -9     5   -10    10
>     1     6    -6     3    -6    -4     5     0    -3    -7
>    -1    -4   -10    -2     0   -11     8    -8    -3   -11
>     4    -6     1    -8    -1    -6     3    -1   -12    -7
>    11    -1     0    -4   -13     0   -10     7    -2     0
>    -6     4     0   -12    -9     6    -2    -5    -5    -7
>    -1    -9    -5     3     3    -7     3   -16    -2   -10
>     0    -2     6     4     4    -6    -9    -3    -6     4
>    -5    -1     7   -11   -21    -9    -3    -1     4   -13
>    -7     0    -3     0   -10    -7     8    -9     7     6
>    -9   -14     5    -9    -7    -8    11    -6     1    -3
>    -9     7     5     0   -12    -3    -4   -18     0     4
>    -1     8    -8     9     4     0     5   -10   -10    -8
>     1     8    -1     4     1    -3    -6    -6    -5    -1
>   -12    -6    -8   -14   -10     2    -1     9     0    -9
>     0    -8    -6    -5     1   -14    -6     5     1    -7
>     3    -9     6    -4     3     0   -21     8     7     5
>     0     0    -2     2     1    -7   -11     1    -7     2
>    -3    -2     9     1     3    -1    -8     0   -18    -7
>    -3     6     1     1    -8    -5    -1     2    -4    -6
>   -10    -5   -20   -18     5    -7     2     5    -3    -3
>    -6    -3    -3     4    -7    -2    -4     2    -6   -11
>    -4   -15    -6    -5     2    -1   -10    -4    -6    -3
>    -1     0    -6   -10     5    -5     2     2    -8     6
>    -1     5    -5    -9    12     0    -6   -17     2    -4
>     4   -11    -1    -8     0    -3   -11    -8     0    -6
>     2    -1    -4    -9   -12     3     6   -10    -2    -6
>   -13     1   -10     1   -13     5    -4     3   -11     4
>    -8     4     4   -17     6   -12     3   -13     0    -3
>    -7     4   -11    -1     1     3     5    -8    -3     0
>     4    -8    -1     4   -13     2    -1     2     5    -6
>    -6     4    -4    -5     1    -4     4     5    -2   -10
>    -9     0   -14    -2    -7     1    -1   -14   -15     8
>    -3     9    -3    -4    -8     0     2     5   -11   -13
>    -5   -13    -3    -7     9    -3    -7    -6    -9    -7
>    -8   -10    -1     6     2     2     3   -13    -6    -5
>     3   -13     2    -6     4     1     0    -9     4   -11
>   -15     0     1   -12    -1     2   -11     2    -1   -13
>   -13    -5     3     9   -11    -8     2   -12    -2    -5
>     0    -3    -2     1    -6    -2    -1     0    -3     2
>     0    -9    -4     1    -2     3    -6     0    -4    -6
>     2     1   -14    -4    -7   -23    -1    -4    -8    -8
>     2    -4     1     6   -10     5    -9    -6     6    -1
>     4    -2    -9     0    -5    -1     8     0     3     4
>    -4    -7    -4     2   -15    -6     2     1    -6    -4
>    -3    -3     3    -7    -2    -9     9    -2    -9    -4
>     3    -8   -10    -3    -4     1    -4   -10    -1     3
>    -1   -15     5     0     2    -6     4     6    -2     0
>     2     5     3   -12    -5    -5    -2    -4    -4     5
>    -8    -4    -6   -16    -1     4    -4    -1    -8     0
>     6   -10     5     0     1    -3    -9     8     0   -11
>    -3   -13    -1     3     3    -6    -6    -2     3     5
>     4    -6    12   -17     1    -5    -5    -2     1    -3
>    -7     5    -4     8    -5    -1    -5     8   -12     4
>    -6     2    -5    -9     2    -2     5     3    -5    -8
>
> 0x1
> ddb{3}>
> ----
>
> I seems that we can fix the problem by comparing TSC more times and
> choosing the minimum value.
>
> The diff also includes a fix for the problem (use the minimum value of
> 1000 samplings).  With the diff, I tried "monotime" test program over
> 100 times, it didn't find any clock going back.
>
>
> dmesg
> ----
> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>     [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> real mem = 6425083904 (6127MB)
> avail mem = 6215311360 (5927MB)
> random: good seed from bootblocks
> mpath0 at root
> scsibus0 at mpath0: 256 targets
> mainbus0 at root
> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
> bios0: VMware, Inc. VMware7,1
> acpi0 at bios0: ACPI 4.0
> acpi0: sleep states S0 S1 S4 S5
> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu0: 256KB 64b/line 8-way L2 cache
> cpu0: smt 0, core 0, package 0
> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> cpu0: apic clock running at 65MHz
> cpu1 at mainbus0: apid 1 (application processor)
> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu1: 256KB 64b/line 8-way L2 cache
> cpu1: disabling user TSC (skew=-5310)
> cpu1: smt 0, core 1, package 0
> cpu2 at mainbus0: apid 2 (application processor)
> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu2: 256KB 64b/line 8-way L2 cache
> cpu2: disabling user TSC (skew=-5335)
> cpu2: smt 0, core 2, package 0
> cpu3 at mainbus0: apid 3 (application processor)
> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> cpu3: 256KB 64b/line 8-way L2 cache
> cpu3: disabling user TSC (skew=-7386)
> cpu3: smt 0, core 3, package 0
> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
> acpimcfg0 at acpi0
> acpimcfg0: addr 0xe0000000, bus 0-127
> acpihpet0 at acpi0: 14318179 Hz
> acpiprt0 at acpi0: bus 0 (PCI0)
> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> acpicmos0 at acpi0
> "PNP0A05" at acpi0 not configured
> acpiac0 at acpi0: AC unit online
> acpicpu0 at acpi0: C1(@1 halt!)
> acpicpu1 at acpi0: C1(@1 halt!)
> acpicpu2 at acpi0: C1(@1 halt!)
> acpicpu3 at acpi0: C1(@1 halt!)
> cpu0: using Broadwell MDS workaround
> pvbus0 at mainbus0: VMware
> vmt0 at pvbus0
> pci0 at mainbus0 bus 0
> 0:16:0: rom address conflict 0xffffc000/0x4000
> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
> pci1 at ppb0 bus 1
> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
> pciide0: channel 0 disabled (no drives)
> atapiscsi0 at pciide0 channel 1 drive 0
> scsibus1 at atapiscsi0: 2 targets
> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
> mpi0: 0, firmware 1.3.41.32
> scsibus2 at mpi0: 16 targets, initiator 7
> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
> pci2 at ppb1 bus 2
> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
> pci3 at ppb2 bus 3
> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
> pci4 at ppb3 bus 4
> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
> pci5 at ppb4 bus 5
> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
> pci6 at ppb5 bus 6
> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
> pci7 at ppb6 bus 7
> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
> pci8 at ppb7 bus 8
> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
> pci9 at ppb8 bus 9
> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
> pci10 at ppb9 bus 10
> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
> pci11 at ppb10 bus 11
> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
> pci12 at ppb11 bus 12
> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
> pci13 at ppb12 bus 13
> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
> pci14 at ppb13 bus 14
> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
> pci15 at ppb14 bus 15
> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
> pci16 at ppb15 bus 16
> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
> pci17 at ppb16 bus 17
> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
> pci18 at ppb17 bus 18
> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
> pci19 at ppb18 bus 19
> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
> pci20 at ppb19 bus 20
> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
> pci21 at ppb20 bus 21
> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
> pci22 at ppb21 bus 22
> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
> pci23 at ppb22 bus 23
> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
> pci24 at ppb23 bus 24
> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
> pci25 at ppb24 bus 25
> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
> pci26 at ppb25 bus 26
> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
> pci27 at ppb26 bus 27
> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
> pci28 at ppb27 bus 28
> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
> pci29 at ppb28 bus 29
> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
> pci30 at ppb29 bus 30
> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
> pci31 at ppb30 bus 31
> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
> pci32 at ppb31 bus 32
> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
> pci33 at ppb32 bus 33
> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
> pci34 at ppb33 bus 34
> isa0 at pcib0
> isadma0 at isa0
> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> com0: console
> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> pckbd0 at pckbc0 (kbd slot)
> wskbd0 at pckbd0 mux 1
> pms0 at pckbc0 (aux slot)
> wsmouse0 at pms0 mux 0
> pcppi0 at isa0 port 0x61
> spkr0 at pcppi0
> efifb0 at mainbus0: 1152x864, 32bpp
> wsdisplay0 at efifb0 mux 1
> wskbd0: connecting to wsdisplay0
> wsdisplay0: screen 0-5 added (std, vt100 emulation)
> vscsi0 at root
> scsibus3 at vscsi0: 256 targets
> softraid0 at root
> scsibus4 at softraid0: 256 targets
> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
> ----
>
> This happens on 2 ESXi hosts at least
>
> - 1
>   - ESXi 6.0.0, 3029758
>   - Xeon E5-2620 x 2
> - 2
>   - ESXi 6.7.0 Update 3 (Build 14320388)
>   - Xeon Silver 4208 x 2
>

This broke the monotonic clock on my Ryzen 5 2500U.

Note: userland TSC has never worked on this device.

$ ./monotime
320678 Starting
351995 Starting
387215 Starting
505501 Starting
387215 Stopped
505501 Back 213.019672364 => 212.599096325
505501 Stopped
351995 Stopped
320678 Stopped

OpenBSD 6.9-beta (GENERIC.MP) #10: Wed Mar 24 09:03:54 EDT 2021
    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 16762552320 (15986MB)
avail mem = 16238886912 (15486MB)
random: good seed from bootblocks
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 3.1 @ 0x986eb000 (62 entries)
bios0: vendor LENOVO version "R0UET78W (1.58 )" date 11/17/2020
bios0: LENOVO 20KUCTO1WW
acpi0 at bios0: ACPI 5.0
acpi0: sleep states S0 S3 S4 S5
acpi0: tables DSDT FACP SSDT SSDT CRAT CDIT SSDT TPM2 UEFI MSDM BATB HPET APIC MCFG SBST WSMT VFCT IVRS FPDT SSDT SSDT SSDT BGRT UEFI SSDT
acpi0: wakeup devices GPP0(S3) GPP1(S3) GPP2(S3) GPP3(S3) GPP4(S3) GPP5(S3) GPP6(S3) GP17(S3) XHC0(S3) XHC1(S3) GP18(S3) LID_(S3) SLPB(S3)
acpitimer0 at acpi0: 3579545 Hz, 32 bits
acpihpet0 at acpi0: 14318180 Hz
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.57 MHz, 17-11-00
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu0: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu0: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu0: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
cpu0: apic clock running at 24MHz
cpu0: mwait min=64, max=64, C-substates=1.1, IBE
cpu1 at mainbus0: apid 1 (application processor)
cpu1: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu1: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu1: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu1: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu1: disabling user TSC (skew=1459148152)
cpu1: smt 1, core 0, package 0
cpu2 at mainbus0: apid 2 (application processor)
cpu2: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu2: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu2: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu2: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu2: disabling user TSC (skew=1459148192)
cpu2: smt 0, core 1, package 0
cpu3 at mainbus0: apid 3 (application processor)
cpu3: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu3: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu3: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu3: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu3: disabling user TSC (skew=1459148152)
cpu3: smt 1, core 1, package 0
cpu4 at mainbus0: apid 4 (application processor)
cpu4: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu4: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu4: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu4: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu4: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu4: disabling user TSC (skew=1459148182)
cpu4: smt 0, core 2, package 0
cpu5 at mainbus0: apid 5 (application processor)
cpu5: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu5: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu5: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu5: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu5: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu5: disabling user TSC (skew=1459148152)
cpu5: smt 1, core 2, package 0
cpu6 at mainbus0: apid 6 (application processor)
cpu6: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu6: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu6: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu6: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu6: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu6: disabling user TSC (skew=1459148192)
cpu6: smt 0, core 3, package 0
cpu7 at mainbus0: apid 7 (application processor)
cpu7: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.26 MHz, 17-11-00
cpu7: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES
cpu7: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache
cpu7: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu7: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative
cpu7: disabling user TSC (skew=1459148152)
cpu7: smt 1, core 3, package 0
ioapic0 at mainbus0: apid 32 pa 0xfec00000, version 21, 24 pins, can't remap
ioapic1 at mainbus0: apid 33 pa 0xfec01000, version 21, 32 pins, can't remap
acpimcfg0 at acpi0
acpimcfg0: addr 0xf8000000, bus 0-63
acpiprt0 at acpi0: bus 0 (PCI0)
acpiprt1 at acpi0: bus 1 (GPP0)
acpiprt2 at acpi0: bus 2 (GPP1)
acpiprt3 at acpi0: bus 3 (GPP2)
acpiprt4 at acpi0: bus -1 (GPP3)
acpiprt5 at acpi0: bus -1 (GPP4)
acpiprt6 at acpi0: bus 4 (GPP5)
acpiprt7 at acpi0: bus -1 (GPP6)
acpiprt8 at acpi0: bus 5 (GP17)
acpiprt9 at acpi0: bus 6 (GP18)
acpiec0 at acpi0
acpibtn0 at acpi0: PWRB
acpipci0 at acpi0 PCI0: 0x00000010 0x00000011 0x00000000
acpicmos0 at acpi0
acpibat0 at acpi0: BAT0 model "01AV448" serial  2798 type LiP oem "Celxpert"
acpiac0 at acpi0: AC unit online
acpithinkpad0 at acpi0: version 2.0
"SMB0001" at acpi0 not configured
acpibtn1 at acpi0: LID_
acpibtn2 at acpi0: SLPB
"PNP0C14" at acpi0 not configured
"PNP0C14" at acpi0 not configured
"PNP0C14" at acpi0 not configured
"STM7304" at acpi0 not configured
"USBC000" at acpi0 not configured
acpicpu0 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu1 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu2 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu3 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu4 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu5 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu6 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpicpu7 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS
acpipwrres0 at acpi0: P0ST, resource for SATA
acpipwrres1 at acpi0: P3ST, resource for SATA
acpivideo0 at acpi0: VGA_
acpivout0 at acpivideo0: LCD_
cpu0: 1996 MHz: speeds: 2000 1700 1600 MHz
pci0 at mainbus0 bus 0
ksmn0 at pci0 dev 0 function 0 "AMD 17h/1xh Root Complex" rev 0x00
"AMD 17h/1xh IOMMU" rev 0x00 at pci0 dev 0 function 2 not configured
pchb0 at pci0 dev 1 function 0 "AMD 17h PCIE" rev 0x00
ppb0 at pci0 dev 1 function 1 "AMD 17h/1xh PCIE" rev 0x00: msi
pci1 at ppb0 bus 1
ppb1 at pci0 dev 1 function 2 "AMD 17h/1xh PCIE" rev 0x00: msi
pci2 at ppb1 bus 2
re0 at pci2 dev 0 function 0 "Realtek 8168" rev 0x10: RTL8168GU/8111GU (0x5080), msi, address e8:6a:64:f0:f8:14
rgephy0 at re0 phy 7: RTL8251 PHY, rev. 0
ppb2 at pci0 dev 1 function 3 "AMD 17h/1xh PCIE" rev 0x00: msi
pci3 at ppb2 bus 3
sdhc0 at pci3 dev 0 function 0 "O2 Micro 0Z8621 SD/MMC" rev 0x01: apic 33 int 8
sdhc0: SDHC 4.0, 50 MHz base clock
sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, ddr52, dma
ppb3 at pci0 dev 1 function 6 "AMD 17h/1xh PCIE" rev 0x00: msi
pci4 at ppb3 bus 4
iwm0 at pci4 dev 0 function 0 "Intel Dual Band Wireless-AC 8265" rev 0x78, msi
pchb1 at pci0 dev 8 function 0 "AMD 17h PCIE" rev 0x00
ppb4 at pci0 dev 8 function 1 "AMD 17h/1xh PCIE" rev 0x00
pci5 at ppb4 bus 5
amdgpu0 at pci5 dev 0 function 0 "ATI Radeon Vega" rev 0xc4
drm0 at amdgpu0
amdgpu0: msi
azalia0 at pci5 dev 0 function 1 "ATI Radeon Vega HD Audio" rev 0x00: msi
azalia0: no supported codecs
ccp0 at pci5 dev 0 function 2 "AMD 17h/1xh Crypto" rev 0x00
xhci0 at pci5 dev 0 function 3 "AMD 17h/1xh xHCI" rev 0x00: msi, xHCI 1.10
usb0 at xhci0: USB revision 3.0
uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
xhci1 at pci5 dev 0 function 4 "AMD 17h/1xh xHCI" rev 0x00: msi, xHCI 1.10
usb1 at xhci1: USB revision 3.0
uhub1 at usb1 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1
azalia1 at pci5 dev 0 function 6 "AMD 17h/1xh HD Audio" rev 0x00: apic 33 int 30
azalia1: codecs: Conexant/0x5111
audio0 at azalia1
ppb5 at pci0 dev 8 function 2 "AMD 17h/1xh PCIE" rev 0x00
pci6 at ppb5 bus 6
ahci0 at pci6 dev 0 function 0 "AMD FCH AHCI" rev 0x61: msi, AHCI 1.3.1
ahci0: port 0: 6.0Gb/s
scsibus1 at ahci0: 32 targets
sd0 at scsibus1 targ 0 lun 0: <ATA, CT500MX500SSD1, M3CR> naa.500a0751e13ebe2f
sd0: 476940MB, 512 bytes/sector, 976773168 sectors, thin
piixpm0 at pci0 dev 20 function 0 "AMD FCH SMBus" rev 0x61: SMI
iic0 at piixpm0
spdmem0 at iic0 addr 0x50: 8GB DDR4 SDRAM PC4-19200 SO-DIMM
spdmem1 at iic0 addr 0x52: 8GB DDR4 SDRAM PC4-19200 SO-DIMM
iic1 at piixpm0
pcib0 at pci0 dev 20 function 3 "AMD FCH LPC" rev 0x51
pchb2 at pci0 dev 24 function 0 "AMD 17h/1xh Data Fabric" rev 0x00
pchb3 at pci0 dev 24 function 1 "AMD 17h/1xh Data Fabric" rev 0x00
pchb4 at pci0 dev 24 function 2 "AMD 17h/1xh Data Fabric" rev 0x00
pchb5 at pci0 dev 24 function 3 "AMD 17h/1xh Data Fabric" rev 0x00
pchb6 at pci0 dev 24 function 4 "AMD 17h/1xh Data Fabric" rev 0x00
pchb7 at pci0 dev 24 function 5 "AMD 17h/1xh Data Fabric" rev 0x00
pchb8 at pci0 dev 24 function 6 "AMD 17h/1xh Data Fabric" rev 0x00
pchb9 at pci0 dev 24 function 7 "AMD 17h/1xh Data Fabric" rev 0x00
isa0 at pcib0
isadma0 at isa0
pckbc0 at isa0 port 0x60/5 irq 1 irq 12
pckbd0 at pckbc0 (kbd slot)
wskbd0 at pckbd0: console keyboard
pms0 at pckbc0 (aux slot)
wsmouse0 at pms0 mux 0
wsmouse1 at pms0 mux 0
pms0: Synaptics clickpad, firmware 8.16, 0x1e2b1 0x940300 0x373740 0xf020a3 0x12e800
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
vmm0 at mainbus0: SVM/RVI
efifb at mainbus0 not configured
uaudio0 at uhub0 port 3 configuration 1 interface 1 "Plantronics Plantronics Headset" rev 1.10/0.04 addr 2
uaudio0: class v1, full-speed, sync, channels: 2 play, 2 rec, 9 ctls
audio1 at uaudio0
uhidev0 at uhub0 port 3 configuration 1 interface 3 "Plantronics Plantronics Headset" rev 1.10/0.04 addr 2
uhidev0: iclass 3/0
uhid0 at uhidev0: input=2, output=0, feature=0
uvideo0 at uhub1 port 2 configuration 1 interface 0 "Azurewave Integrated Camera" rev 2.01/17.11 addr 2
video0 at uvideo0
vscsi0 at root
scsibus2 at vscsi0: 256 targets
softraid0 at root
scsibus3 at softraid0: 256 targets
root on sd0a (3a85b6926424009b.a) swap on sd0b dump on sd0b
iwm0: hw rev 0x230, fw ver 34.0.1, address a0:51:0b:ed:56:de
amdgpu0: RAVEN 8 CU rev 0x01
amdgpu0: 1920x1080, 32bpp
wsdisplay0 at amdgpu0 mux 1: console (std, vt100 emulation), using wskbd0
wsdisplay0: screen 1-5 added (std, vt100 emulation)

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
> On Mar 24, 2021, at 8:29 AM, Josh Rickmar <[hidden email]> wrote:
>
> On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:
>> Hi,
>>
>> I hit a problem which is caused by going back of monotonic time.  It
>> happens on hosts on VMware ESXi.
>>
>> I wrote the program which repeats the problem.
>>
>> % cc -o monotime monotime.c -lpthread
>> % ./monotime
>> 194964 Starting
>> 562210 Starting
>> 483046 Starting
>> 148865 Starting
>> 148865 Back 991.808048665 => 991.007447931
>> 562210 Back 991.808048885 => 991.007448224
>> 483046 Back 991.808049115 => 991.007449172
>> 148865 Stopped
>> 562210 Stopped
>> 483046 Stopped
>> 194964 Stopped
>> % uname -a
>> OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
>> % sysctl kern.version
>> kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>>     [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>> %
>>
>> monotime.c
>> ----
>> #include <sys/types.h>
>> #include <sys/time.h>
>> #include <stdio.h>
>> #include <time.h>
>> #include <unistd.h>
>> #include <pthread.h>
>> #include <stdlib.h>
>>
>> #define NTHREAD 4
>> #define NTRY 50000
>>
>> void *
>> start(void *dummy)
>> {
>> int i;
>> struct timespec ts0, ts1;
>>
>> printf("%d Starting\n", (int)getthrid());
>> clock_gettime(CLOCK_MONOTONIC, &ts0);
>>
>> for (i = 0; i < NTRY; i++) {
>> clock_gettime(CLOCK_MONOTONIC, &ts1);
>> if (timespeccmp(&ts0, &ts1, <=)) {
>> ts0 = ts1;
>> continue;
>> }
>> printf("%d Back %lld.%09lu => %lld.%09lu\n",
>>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
>>    ts1.tv_nsec);
>>     break;
>> }
>> printf("%d Stopped\n", (int)getthrid());
>>
>> return (NULL);
>> }
>>
>> int
>> main(int argc, char *argv[])
>> {
>> int i, n = NTHREAD;
>> pthread_t *threads;
>>
>> threads = calloc(n, sizeof(pthread_t));
>>
>> for (i = 0; i < n; i++)
>> pthread_create(&threads[i], NULL, start, NULL);
>> for (i = 0; i < n; i++)
>> pthread_join(threads[i], NULL);
>>
>> }
>> ----
>>
>> The machine has 4 vCPUs and showing the following message on boot.
>>
>>  cpu1: disabling user TSC (skew=-5310)
>>  cpu2: disabling user TSC (skew=-5335)
>>  cpu3: disabling user TSC (skew=-7386)
>>
>> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
>> delayed against cpu0.
>>
>> Simply ignoring the skews by the following diff seems to workaround
>> this problem.
>>
>> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
>> index 238a5a068e1..3b951a8b5a3 100644
>> --- a/sys/arch/amd64/amd64/tsc.c
>> +++ b/sys/arch/amd64/amd64/tsc.c
>> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
>> u_int
>> tsc_get_timecount(struct timecounter *tc)
>> {
>> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> + return rdtsc_lfence();
>> }
>>
>> void
>>
>> So I supposed the skews are not calculated properly.  Also I found
>> NetBSD changed the skew calculating so that it checks 1000 times and
>> take the minimum value.
>>
>>  https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
>>  https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
>>
>>
>> I checked skews on the machine by the following debug code.
>>
>> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
>> index 238a5a068e1..83e835e4f82 100644
>> --- a/sys/arch/amd64/amd64/tsc.c
>> +++ b/sys/arch/amd64/amd64/tsc.c
>> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
>> *aptscp = tsc_sync_val;
>> }
>>
>> +#define TSC_SYNC_NTIMES 1000
>> +
>> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
>> +
>> +void
>> +tsc_debug(void)
>> +{
>> + int i, cpuid = curcpu()->ci_cpuid;
>> +
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
>> + if (i % 10 == 0)
>> + printf("%5d", tsc_difs[cpuid][i]);
>> + else
>> + printf(" %5d", tsc_difs[cpuid][i]);
>> + if (i % 10 == 9)
>> + printf("\n");
>> + }
>> + printf("\n");
>> +}
>> +
>> void
>> tsc_sync_bp(struct cpu_info *ci)
>> {
>> + int i, mindif = INT_MAX, dif;
>> uint64_t bptsc, aptsc;
>>
>> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
>> - tsc_read_bp(ci, &bptsc, &aptsc);
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
>> + tsc_read_bp(ci, &bptsc, &aptsc);
>> + dif = bptsc - aptsc;
>> + if (abs(dif) < abs(mindif))
>> + mindif = dif;
>> + tsc_difs[ci->ci_cpuid][i] = dif;
>> + }
>>
>> /* Compute final value to adjust for skew. */
>> - ci->ci_tsc_skew = bptsc - aptsc;
>> + ci->ci_tsc_skew = mindif;
>> }
>>
>> /*
>> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
>> void
>> tsc_sync_ap(struct cpu_info *ci)
>> {
>> - tsc_post_ap(ci);
>> - tsc_post_ap(ci);
>> + int i;
>> +
>> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
>> + tsc_post_ap(ci);
>> }
>>
>> void
>>
>> ----
>> Stopped at      db_enter+0x10:  popq    %rbp
>> ddb{0}> machine ddbcpu 1
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{1}> call tsc_debug
>> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
>>  -11    -9    -5    -3    -4    -3    -7     8    -5    -6
>>   -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
>>   -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
>>   -9    -1    -8     1    -8     6    -5    -4     2    -2
>>   -8    -3    -1    -5    -2    -2     1     2    -2    -9
>>  -12     0    -9    -2    -2    -5    -2     1     2     0
>>   -1     2    -2     6    -5    -1    -2    -4     2    -2
>>    0    -9    -9    -6    -2     2     3    -6    -1     3
>>    8     4    -2     2    -8     7     1     2    -2     1
>>   -2    -6    -2     5     0     0    -4    -9     6    -2
>>   -3    -6    -2   -12     1    -9    -2    -3   -10    10
>>    2    -1    -3    -2     3     1     1    -5     3    -3
>>   -5     1    -6    -2    -3     0     0     9     1     6
>>    8    -6     5     4   -12    -1     4     2    -1    -1
>>   -1     2     2     0    -5     1     2    -8     3     9
>>    0     6    -3     4     6     0     8     6   -14    -1
>>   -1     0    -6    -7     6   -10     7    -6    -5    -4
>>    6   -12     4     3    -5     5     1    -6     3     0
>>   -2     0     6    -9    -2    -1     1    -1     4     0
>>    4    10   -13     1    -8    -2    -8    -3    -5    -3
>>   -5    -5     1    -9    -9     0    -3    -1     2     6
>>   -2     2    -3    -9    -9   -11    -7    -6    -4    -9
>>   -4    -9    -3    -4     0    -5     0    -9   -12    -7
>>   -6    -9     1    -5    -4   -12     7    -3   -12    -4
>>   -5    -5    -6    -9    -7    -1     0     0    -1    -2
>>   -6    -8     0     1    -8    -5    -2    -4     0    -1
>>   -3   -10   -15    -3    -8   -11    -9    -9     2     0
>>   -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
>>    0     0     2    -2    -4     1    -6     0     0    -5
>>   -2    -7    -5    -2    -2     1    -2    -6    -1    -7
>>   -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
>>   -4    -3    -4   -11     1    -9     0    -3     2    -9
>>   -8     2    -1    -7    -5    -5    -9     2    -3    -5
>>    0     5   -12     0    -5    -3    -6    -1   -13   -10
>>   -9     0     0    -5    -7    -4    -3    -3    -3    -2
>>   -2     3    -5    -3    -5    -1    -7    -4   -10     0
>>   -3     0     2     1    -4    -1    -5    -3    -5    -6
>>   -4    -8    -3     0    -1    -2   -13   -10    -9    -5
>>  -11   -11    -4    -3     0     5    -2    -3    -6     0
>>   -6    -9    -1    -4    -1     2    -2    -7    -9     0
>>   -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
>>   -8    -6    -2    -3    -9    -5    -9   -11   -10     1
>>   -3    -6    -1    -1    -6     0     0    -8    -4     0
>>   -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
>>   -4     2    -2 -5012     5     2   -17     0     7    -5
>>    0    -4    -3     6    -7    -1    -1     4    -6     3
>>    0    -4    -9    -7   -11   -11     8    -7   -15   -10
>>    3    -4     1   -17    -4     3   -17     0     4     3
>>   -2     0    -3   -10    -2     1     3    -5   -12   -19
>>    1     2     5     1    -9     4    -2    -3    -4     0
>>   -1   -11    -3    -1    -9    -5     0    -8     7    -2
>>   -6    -7     4    -5    -2    -1    -5     0    -5    -5
>>  -14    -2    -8     0   -11     9   -10     2    -6   -17
>>   -3    -5    -6     2     0     9   -14     0    -4    -7
>>    6     2     2    -9    -9     5     5     0    -6     3
>>  -12     5    -2   -13   -10    -5    -7     2   -11    -3
>>   -6    -2   -13     1     8    -5   -14     2     4    -3
>>  -13    -5   -11    -9   -10     4    -3    -1     9   -17
>>  -11     2   -13    -2    -1    -9   -10     0    -5    -4
>>    0    10    -8    -5    -8    -3   -14    -6     3   -15
>>    1    -5     1   176    -8    -7    -7    -4    -1    -1
>>   -8    -7    -4     1    -6    -9     1    -2    -9    -4
>>   -4    -1    -7     0    -8    -3    -4    -3    -1    -2
>>   -5    -6    -9     2    -6     0    -8    -5     0    -9
>>  -10     0    -4     4    -6   -11    -3     2   -12     1
>>   -2    -6    -6    -3    -7    -7     0    -9    -1    -9
>>   -1    -8    -4    -3   -11     1     0     1    -2    -4
>>  -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
>>   -3    -4    -2    -4     1     0    -5    -2    -1     4
>>   -9    -1    -4     1    -8   -11     0   -10    -4    -9
>>   -5    -2    -2     4     0    -7    -4     1    -2     1
>>   -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
>>   -4    -9    -7    -5    -3     3    -5   -12    -3     0
>>   -8    -4    -9    -5    -6     0     0    -1    -2    -6
>>   -8   -12    -3     1     2    -6    -1    -7   -10    -9
>>   -6    -8     0    -2    -3    -7    -3    -2     6    -3
>>  -12     0     0    -7    -9    -6    -1    -5    -2    -9
>>   -6     1     0    -3    -1    -1    -2     2    -2    -3
>>   -7    -9    -1    -8    -4    -2     5    -5    -3   -10
>>    2     6    -3     0    -6    -8    -9    -1    -1    -7
>>   -8    -1    -1    -4    -4     7    -2   -10   -11    -6
>>    2     2    -4     3    -2    -1    -3     0     0    -7
>>   -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
>>    0     1    -3     5    -3    -4    -1    -6    -9    -4
>>   -6     0    -9    -6     0    -2     4    -2    -4   -10
>>   -9    -4    -3    -9    -3    -6    -9    -8    -4     1
>>   -5    -6    -5     1     0    -2    -3    -6    -5    -9
>>   -4     1    -5    -4    -2    -4    -8    -3    -4     0
>>    2    -5    -3    -7    -1    -2    -1    -9    -6   -15
>>  -10    -6    -2    -7    -1    -3     3    -6    -6    -9
>>  -10    -8    -9    -2    -3     0    -6     3    -4     4
>>    3     3     8    -2    -2    -4     0    -3    -9    -3
>>   -6    -4     3     2     1     1    -3    -7   -15    -1
>>   -4    -6    -1    -2    -1   -12     2    -1    -4     1
>>    2     3    -5     3    -3    -7    -6    -5     0     1
>>    5   -13    -8     0    -5     2     0    -5    -3     6
>>   -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
>>  -10    -4   -10    -9    -2     1     0    -4    -3     0
>>    1    -3    -1    -4    -7   -10   -13    -8    -1    -1
>>
>> 0x1
>> ddb{1}> machine ddbcpu 2
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{2}> call tsc_debug
>> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
>>    3     3    -8    -3    -4     4     0    -8    -7    -5
>>   -5     3    -7    -5    -4    -9    -7    -3     0     2
>>   -5     2     1     3    -2     3     8    -6   -11     8
>>    8    -5     1     5     0    -8     2     0     6     3
>>  -14     7    -2    -1    -3     1    -5    -6     0     5
>>    1    -1     0    -2    -5     2    -3     0    -3    -1
>>   -5   -12    -4    -4    -9     4     0    -2    -2    -8
>>    2     5     7    -2     0    -6   110    -8    -8    -4
>>    0     5    -7    -3    -5    -4     9    -2    -2     3
>>   -8    -2    -5     4    -3   217     0    -7    -7    -6
>>    7   -10    -9    -3     3   -14     3    -5     5   -12
>>    5    -8   -17    -5   286    -6     0    -3    -4    -2
>>    1    -5    -5    -9    -6    -7    -3    -5     6     0
>>    1    -1    -4    -2     2    -2    -2    -2    -5     2
>>   12     3   -18    -8     6    -4    -3     6     2    -3
>>   -7    -3     4    -5   -23     9     6     6    -6   -11
>>    9    -1   -10 50505    -1     2     6   -11     2    -2
>>   -4    -6   201     1     3     4    -9     6     0     1
>>   -4     0    -1     3     4     1     6    -7    -5     4
>>  -14    -3    -1    -8     5     6    -5     3    -7    -9
>>   -7     1    -2     5    -2     0    -2    -9     4    -3
>>   98    -5     7    -7     3     0    -5     0     9     2
>>   -7    -5    -3   -12   -11   -11     6    -5    -7    -6
>>  210     5    -3    -5    -4   -11    -6     0    -5    -9
>>    3     0    -9     5     1     0     0    -7    -5   210
>>    1    -6   -17    -8     0     1    -2    -8     1    -7
>>   10    -8    -8    -9     4    -2    -4    -3   204     5
>>   -9   -15     3    -1    -5     0   -12    -1     0     1
>>   -1    -6    -5    -9    -1     4    -1    -1     0     1
>>    4    -8   -13     1     0    -5    -6     0    -4     0
>>    6    -2    -4    -8    -7   -12    -2    -2    -6    -8
>>   -5     0    -8    -7   -11     0     6    -1    -8    -3
>>    2     6    -6     0   -10   285    -1    -2    -8    -6
>>   -6    -1    -5    -6     0    -5    -8    -5     1    -8
>>   -1     1     4    -3    -4   188    -3    -3   -10     5
>>    6     0    -7     4     1     2     0    -2    -2     2
>>   -3    -1    -9   -12   201    -1    -7    -1     8     0
>>    0     0    -5     0     7   -18     5     1    -2    15
>>    5    -6     4   -10   272     0    -4    -3     2   -10
>>   -7     7     3     4     1     6    -9    -8   -12    -2
>>   -2    -2    -6     8     3    97    -1    -7     5     1
>>   -7     4    -6    -9    -7    -2     0    -6     8   -13
>>   -1     3    -9    -4   233    -2     0     0    -5    -5
>>   -2     0     0     5    -7     6   -14     4    -6     5
>>    4     3     3    -3   103    -2    -6   -11     2    -2
>>   -3    -8     0    -1     1     0    -6     1     1   -10
>>   -1     0    -1     0     0    -1    -6    -4    -4    -3
>>    3     0    -5     0     2    -2     6     0   -13     3
>>    1   -16    -2   -12   206    -4    -6    -5    -3     2
>>   -8    -2    -9    -2     9     7    -1     1     3    -5
>>    6     6    10     0    99    -2    -1    -2     0    -6
>>   -8    -9     0     3     0   -11    -6     1    -4     9
>>  -11   -11     2    -1   276    -7     2     4    -4    -3
>>    4     2   -12     8     1    -4     0    -1    -1    -1
>>    5    -8     0     6   232    -4     2    -2   -11     2
>>   -6     0     4     6    -7     8    -6     3    -3    -9
>>    0     1    -7     2    -3    -5    -3    -2    -8    -4
>>  -14    -2     0     4    -4    -3    -4     9     3    -1
>>   -5    -8     1     0   210     0    -6    -4     2     2
>>    0    -3    -4     0     4   -12    10    -2    -3    -1
>>    3     7    -3     6    -9   190     4     6    -2    11
>>  -10    -2    -9     3     2     4    -4    -7    -9    -2
>>  -10    12     1    -7     3    -1     0    -1   -11     6
>>    6     0    -8     1     4     2    -2    -5     0     0
>>    5    -5    -3    -5   205    -1    -3    -1     0    -4
>>   -3    -7     3     0    -7    -5    -4    -3     7     1
>>  -14    -2     0   -14     2     0     7    11    -2    -7
>>    6    -6    -3    -4     0     4    -3    -4    -3    -7
>>   -6     3    -4     0     4    -3    -6     3     4    -4
>>   -6     7   -11     1   -10   -10   -12    -4    -3     6
>>   -5    -6     5   212    -8     1    -4     3    -3    -8
>>    0   -10     0     2     6    -3    -1   -13     1     6
>>   -6     5    -4     0    -7    -4    -5    -6     1    -2
>>    1   -10   -12    -3    -8     9   -11     0     1    -3
>>   -1     1   186     2   -12     3    -4     0     0    -1
>>   -5    -4     1    -1     4     5   -10     0    -4     1
>>   -1    -6   270     0   -17     5     0     0    -4    -1
>>    4     6     1     0    -6     6     5    -3     3    -2
>>   -6    -7    18   -16     0     9     4     3    -1     6
>>    4     1    -5     7   -11    -1    -6    -2     6    -2
>>   -8   256    -5    -2     1    -1    -5    -3    -9     0
>>   -1     3    -2   -11     4     3    -7    -3     3    -1
>>   -5    -5     0    -4    -1    -3    -3     6    -3     3
>>    3    -2   -11    -2    -3    11    -8     1     5    -7
>>    5   -12    -3     8    -9    -5     7     5    -3     2
>>   -7    -3    -6     2    -2    -1    -2    -9    -8    99
>>    6    -2     9    -1    -4    -2     0    -2    -7    -5
>>    0     1    -4    -8    -1    -2     2    -8     2   205
>>   -3   -10    -1    -1    -2    -5     2     2     5    -2
>>   -5    -6    -4     6     6    -6     4     1    -5     0
>>   -7     3     1     0   -11    -7    -3     5    -5     5
>>    1    -1     3    -5    -8     0    -1     0   183    -5
>>    0     4    -1    -6   -11   -10     1   -18     3    -1
>>   -5    -9    -2     2     2    -2     0    99    -7    -8
>>   -1    -3    -5    -1    12    -3    -1     2     1     4
>>    7     3   -14     2    -4     8    -9    -3    -8    -5
>>    6    -6     5   -12     6    -1    -9    -4    -4     1
>>   -6     0     0    -2    -3    -5    -9    -2    -9    -3
>>    3   -16    -2    -1     0     9    -4     5    -6     5
>>
>> 0x1
>> ddb{2}> machine ddbcpu 3
>> Stopped at      x86_ipi_db+0x12:        leave
>> ddb{3}> call tsc_debug
>> -8336 -6457 -45527     0    -1     0    -2     4     0     5
>>   -9    -6    -4    -4     6     4     0    -3    -4     5
>>    3     6   -12    -1     1     1    -3     6    -4    -2
>>   -2     2     4    -3     0    -1     3     0     1     3
>>   -3     3    -1     4    -5    -2    -2    -9     6    -9
>>    0     1    -2    -6     8    -4    -2    -2     6     1
>>   -1     1    -6    -6     4    -5    -1     6    -1    -1
>>    3     5     0    -6     5    -4    -2    -6    -3    -4
>>   -5     2    -3    -3    -5    -3    -5 -5720     0     5
>>   -1    -3     3    -2     4    -6     8   -16    -6    -3
>>   -2     4     8    -3     3    -1     2    -8    -3   -19
>>   -8     3    -7    -9    -6    -3     1    -3    -6     7
>>    4     1     3     2    -4     7    -3     2     2    -4
>>  -10    -8   -14    -2     2    -3     3    -2     3    -3
>>    5     5    -6     9    -3   -12    -6     1   -10     7
>>   -6     5    -4     1     6     3     2     2    -6    -1
>>    6    -8    -5     7     3    -3    -4    -6     1    -5
>>    4    -6     2     6    -6     3    -8    -5    -6     0
>>   -5    -2   -13    -8     3     0   -17    -7    -9     1
>>    6   -12     3     6     3    -3     4    -1    -7     0
>>    2     0    -7   -10    -6     3     1     2   -19     4
>>    1   -18     1    -3    -6   -14     4     6     3    -4
>>   -7   -11    -1    -1     3     0     6     6    -8   -14
>>    3    -2     6    -5     0     1     0    -7     0     4
>>   -3   -16    -2    -4   -12    -4     6     0    -8    -4
>>   -4    -4    -3     0    -6   -13   -10   -15    -6     2
>>    0    -3     0    -8     4    -1    -1     5    -4    -1
>>   -7     2     1     1     3    -3    -1   -18     6     8
>>   -2     3    -6     0    -6    -2     2    -2    -7     1
>>   -6   -13    -4    -2    -1    -6     6    -5    -9   -14
>>    4     5    -4    -2    -9    -2    -2   -13     1   -18
>>   -1     2    -5     6    -6    -7    -9    -6     1     6
>>  -13    -4     3     0    -8    -6    -6   -10    -2    -9
>>    5     2     4     1     6    -5    -8    -6     2    -4
>>   -3    -5    -2    -6   -10     0     5    -2     8    -3
>>    8   -11   -11    -7    -5   -13   -19    -5   -14    -3
>>    3     2     1     3     6    -1    -9   -16     3    -7
>>    1    -3    -5     0    -7     6     4    -2    -2     4
>>    4    -6    -6     8    -6    -7    -5    -2     0     4
>>   -1     3     1     3    -6    -2    -4    -9     1     0
>>   -2     3     2   -16     4   -15   -11    -3     8     0
>>   -6    -3   -18    -7    -8     8    -8     6    -7    -4
>>   -8    -7    -9     0    -2     3     7    -2     1    -6
>>    2    -6     8    -1   -12    -8    -4     3   -13    -2
>>  -11     1    -2    -7    -3     0   -16    -8     4    -9
>>  -15    -8    -9     8     5     7    -9     5   -10    10
>>    1     6    -6     3    -6    -4     5     0    -3    -7
>>   -1    -4   -10    -2     0   -11     8    -8    -3   -11
>>    4    -6     1    -8    -1    -6     3    -1   -12    -7
>>   11    -1     0    -4   -13     0   -10     7    -2     0
>>   -6     4     0   -12    -9     6    -2    -5    -5    -7
>>   -1    -9    -5     3     3    -7     3   -16    -2   -10
>>    0    -2     6     4     4    -6    -9    -3    -6     4
>>   -5    -1     7   -11   -21    -9    -3    -1     4   -13
>>   -7     0    -3     0   -10    -7     8    -9     7     6
>>   -9   -14     5    -9    -7    -8    11    -6     1    -3
>>   -9     7     5     0   -12    -3    -4   -18     0     4
>>   -1     8    -8     9     4     0     5   -10   -10    -8
>>    1     8    -1     4     1    -3    -6    -6    -5    -1
>>  -12    -6    -8   -14   -10     2    -1     9     0    -9
>>    0    -8    -6    -5     1   -14    -6     5     1    -7
>>    3    -9     6    -4     3     0   -21     8     7     5
>>    0     0    -2     2     1    -7   -11     1    -7     2
>>   -3    -2     9     1     3    -1    -8     0   -18    -7
>>   -3     6     1     1    -8    -5    -1     2    -4    -6
>>  -10    -5   -20   -18     5    -7     2     5    -3    -3
>>   -6    -3    -3     4    -7    -2    -4     2    -6   -11
>>   -4   -15    -6    -5     2    -1   -10    -4    -6    -3
>>   -1     0    -6   -10     5    -5     2     2    -8     6
>>   -1     5    -5    -9    12     0    -6   -17     2    -4
>>    4   -11    -1    -8     0    -3   -11    -8     0    -6
>>    2    -1    -4    -9   -12     3     6   -10    -2    -6
>>  -13     1   -10     1   -13     5    -4     3   -11     4
>>   -8     4     4   -17     6   -12     3   -13     0    -3
>>   -7     4   -11    -1     1     3     5    -8    -3     0
>>    4    -8    -1     4   -13     2    -1     2     5    -6
>>   -6     4    -4    -5     1    -4     4     5    -2   -10
>>   -9     0   -14    -2    -7     1    -1   -14   -15     8
>>   -3     9    -3    -4    -8     0     2     5   -11   -13
>>   -5   -13    -3    -7     9    -3    -7    -6    -9    -7
>>   -8   -10    -1     6     2     2     3   -13    -6    -5
>>    3   -13     2    -6     4     1     0    -9     4   -11
>>  -15     0     1   -12    -1     2   -11     2    -1   -13
>>  -13    -5     3     9   -11    -8     2   -12    -2    -5
>>    0    -3    -2     1    -6    -2    -1     0    -3     2
>>    0    -9    -4     1    -2     3    -6     0    -4    -6
>>    2     1   -14    -4    -7   -23    -1    -4    -8    -8
>>    2    -4     1     6   -10     5    -9    -6     6    -1
>>    4    -2    -9     0    -5    -1     8     0     3     4
>>   -4    -7    -4     2   -15    -6     2     1    -6    -4
>>   -3    -3     3    -7    -2    -9     9    -2    -9    -4
>>    3    -8   -10    -3    -4     1    -4   -10    -1     3
>>   -1   -15     5     0     2    -6     4     6    -2     0
>>    2     5     3   -12    -5    -5    -2    -4    -4     5
>>   -8    -4    -6   -16    -1     4    -4    -1    -8     0
>>    6   -10     5     0     1    -3    -9     8     0   -11
>>   -3   -13    -1     3     3    -6    -6    -2     3     5
>>    4    -6    12   -17     1    -5    -5    -2     1    -3
>>   -7     5    -4     8    -5    -1    -5     8   -12     4
>>   -6     2    -5    -9     2    -2     5     3    -5    -8
>>
>> 0x1
>> ddb{3}>
>> ----
>>
>> I seems that we can fix the problem by comparing TSC more times and
>> choosing the minimum value.
>>
>> The diff also includes a fix for the problem (use the minimum value of
>> 1000 samplings).  With the diff, I tried "monotime" test program over
>> 100 times, it didn't find any clock going back.
>>
>>
>> dmesg
>> ----
>> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
>>    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>> real mem = 6425083904 (6127MB)
>> avail mem = 6215311360 (5927MB)
>> random: good seed from bootblocks
>> mpath0 at root
>> scsibus0 at mpath0: 256 targets
>> mainbus0 at root
>> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
>> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
>> bios0: VMware, Inc. VMware7,1
>> acpi0 at bios0: ACPI 4.0
>> acpi0: sleep states S0 S1 S4 S5
>> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
>> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
>> acpitimer0 at acpi0: 3579545 Hz, 24 bits
>> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
>> cpu0 at mainbus0: apid 0 (boot processor)
>> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
>> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu0: 256KB 64b/line 8-way L2 cache
>> cpu0: smt 0, core 0, package 0
>> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
>> cpu0: apic clock running at 65MHz
>> cpu1 at mainbus0: apid 1 (application processor)
>> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
>> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu1: 256KB 64b/line 8-way L2 cache
>> cpu1: disabling user TSC (skew=-5310)
>> cpu1: smt 0, core 1, package 0
>> cpu2 at mainbus0: apid 2 (application processor)
>> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
>> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu2: 256KB 64b/line 8-way L2 cache
>> cpu2: disabling user TSC (skew=-5335)
>> cpu2: smt 0, core 2, package 0
>> cpu3 at mainbus0: apid 3 (application processor)
>> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
>> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
>> cpu3: 256KB 64b/line 8-way L2 cache
>> cpu3: disabling user TSC (skew=-7386)
>> cpu3: smt 0, core 3, package 0
>> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
>> acpimcfg0 at acpi0
>> acpimcfg0: addr 0xe0000000, bus 0-127
>> acpihpet0 at acpi0: 14318179 Hz
>> acpiprt0 at acpi0: bus 0 (PCI0)
>> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
>> acpicmos0 at acpi0
>> "PNP0A05" at acpi0 not configured
>> acpiac0 at acpi0: AC unit online
>> acpicpu0 at acpi0: C1(@1 halt!)
>> acpicpu1 at acpi0: C1(@1 halt!)
>> acpicpu2 at acpi0: C1(@1 halt!)
>> acpicpu3 at acpi0: C1(@1 halt!)
>> cpu0: using Broadwell MDS workaround
>> pvbus0 at mainbus0: VMware
>> vmt0 at pvbus0
>> pci0 at mainbus0 bus 0
>> 0:16:0: rom address conflict 0xffffc000/0x4000
>> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
>> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
>> pci1 at ppb0 bus 1
>> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
>> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
>> pciide0: channel 0 disabled (no drives)
>> atapiscsi0 at pciide0 channel 1 drive 0
>> scsibus1 at atapiscsi0: 2 targets
>> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
>> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
>> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
>> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
>> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
>> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
>> mpi0: 0, firmware 1.3.41.32
>> scsibus2 at mpi0: 16 targets, initiator 7
>> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
>> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
>> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
>> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
>> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
>> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
>> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
>> pci2 at ppb1 bus 2
>> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
>> pci3 at ppb2 bus 3
>> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
>> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
>> pci4 at ppb3 bus 4
>> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
>> pci5 at ppb4 bus 5
>> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
>> pci6 at ppb5 bus 6
>> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
>> pci7 at ppb6 bus 7
>> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
>> pci8 at ppb7 bus 8
>> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
>> pci9 at ppb8 bus 9
>> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
>> pci10 at ppb9 bus 10
>> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
>> pci11 at ppb10 bus 11
>> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
>> pci12 at ppb11 bus 12
>> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
>> pci13 at ppb12 bus 13
>> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
>> pci14 at ppb13 bus 14
>> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
>> pci15 at ppb14 bus 15
>> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
>> pci16 at ppb15 bus 16
>> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
>> pci17 at ppb16 bus 17
>> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
>> pci18 at ppb17 bus 18
>> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
>> pci19 at ppb18 bus 19
>> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
>> pci20 at ppb19 bus 20
>> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
>> pci21 at ppb20 bus 21
>> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
>> pci22 at ppb21 bus 22
>> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
>> pci23 at ppb22 bus 23
>> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
>> pci24 at ppb23 bus 24
>> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
>> pci25 at ppb24 bus 25
>> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
>> pci26 at ppb25 bus 26
>> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
>> pci27 at ppb26 bus 27
>> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
>> pci28 at ppb27 bus 28
>> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
>> pci29 at ppb28 bus 29
>> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
>> pci30 at ppb29 bus 30
>> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
>> pci31 at ppb30 bus 31
>> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
>> pci32 at ppb31 bus 32
>> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
>> pci33 at ppb32 bus 33
>> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
>> pci34 at ppb33 bus 34
>> isa0 at pcib0
>> isadma0 at isa0
>> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
>> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
>> com0: console
>> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
>> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
>> pckbd0 at pckbc0 (kbd slot)
>> wskbd0 at pckbd0 mux 1
>> pms0 at pckbc0 (aux slot)
>> wsmouse0 at pms0 mux 0
>> pcppi0 at isa0 port 0x61
>> spkr0 at pcppi0
>> efifb0 at mainbus0: 1152x864, 32bpp
>> wsdisplay0 at efifb0 mux 1
>> wskbd0: connecting to wsdisplay0
>> wsdisplay0: screen 0-5 added (std, vt100 emulation)
>> vscsi0 at root
>> scsibus3 at vscsi0: 256 targets
>> softraid0 at root
>> scsibus4 at softraid0: 256 targets
>> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
>> ----
>>
>> This happens on 2 ESXi hosts at least
>>
>> - 1
>>  - ESXi 6.0.0, 3029758
>>  - Xeon E5-2620 x 2
>> - 2
>>  - ESXi 6.7.0 Update 3 (Build 14320388)
>>  - Xeon Silver 4208 x 2
>>
>
> This broke the monotonic clock on my Ryzen 5 2500U.
>
> Note: userland TSC has never worked on this device.
>
> $ ./monotime
> 320678 Starting
> 351995 Starting
> 387215 Starting
> 505501 Starting
> 387215 Stopped
> 505501 Back 213.019672364 => 212.599096325
> 505501 Stopped
> 351995 Stopped
> 320678 Stopped

Which diff did you apply?  Yasuoka provided two diffs.

In any case, ignore this diff:

> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> index 238a5a068e1..3b951a8b5a3 100644
> --- a/sys/arch/amd64/amd64/tsc.c
> +++ b/sys/arch/amd64/amd64/tsc.c
> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> u_int
> tsc_get_timecount(struct timecounter *tc)
> {
> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> + return rdtsc_lfence();
> }
>
> void


We don't want to discard the skews, that's wrong.

The reason it "fixes" Yasuoka's problem is because the real skews
on the ESXi VMs in question are probably close to zero but our
synchronization algorithm is picking huge (wrong) skews due to
some other variable interfering with our measurement.
Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
On Thu, Mar 25, 2021 at 01:18:04PM -0500, Scott Cheloha wrote:

> > On Mar 24, 2021, at 8:29 AM, Josh Rickmar <[hidden email]> wrote:
> >
> > On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:
> >> Hi,
> >>
> >> I hit a problem which is caused by going back of monotonic time.  It
> >> happens on hosts on VMware ESXi.
> >>
> >> I wrote the program which repeats the problem.
> >>
> >> % cc -o monotime monotime.c -lpthread
> >> % ./monotime
> >> 194964 Starting
> >> 562210 Starting
> >> 483046 Starting
> >> 148865 Starting
> >> 148865 Back 991.808048665 => 991.007447931
> >> 562210 Back 991.808048885 => 991.007448224
> >> 483046 Back 991.808049115 => 991.007449172
> >> 148865 Stopped
> >> 562210 Stopped
> >> 483046 Stopped
> >> 194964 Stopped
> >> % uname -a
> >> OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
> >> % sysctl kern.version
> >> kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
> >>     [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> >> %
> >>
> >> monotime.c
> >> ----
> >> #include <sys/types.h>
> >> #include <sys/time.h>
> >> #include <stdio.h>
> >> #include <time.h>
> >> #include <unistd.h>
> >> #include <pthread.h>
> >> #include <stdlib.h>
> >>
> >> #define NTHREAD 4
> >> #define NTRY 50000
> >>
> >> void *
> >> start(void *dummy)
> >> {
> >> int i;
> >> struct timespec ts0, ts1;
> >>
> >> printf("%d Starting\n", (int)getthrid());
> >> clock_gettime(CLOCK_MONOTONIC, &ts0);
> >>
> >> for (i = 0; i < NTRY; i++) {
> >> clock_gettime(CLOCK_MONOTONIC, &ts1);
> >> if (timespeccmp(&ts0, &ts1, <=)) {
> >> ts0 = ts1;
> >> continue;
> >> }
> >> printf("%d Back %lld.%09lu => %lld.%09lu\n",
> >>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
> >>    ts1.tv_nsec);
> >>     break;
> >> }
> >> printf("%d Stopped\n", (int)getthrid());
> >>
> >> return (NULL);
> >> }
> >>
> >> int
> >> main(int argc, char *argv[])
> >> {
> >> int i, n = NTHREAD;
> >> pthread_t *threads;
> >>
> >> threads = calloc(n, sizeof(pthread_t));
> >>
> >> for (i = 0; i < n; i++)
> >> pthread_create(&threads[i], NULL, start, NULL);
> >> for (i = 0; i < n; i++)
> >> pthread_join(threads[i], NULL);
> >>
> >> }
> >> ----
> >>
> >> The machine has 4 vCPUs and showing the following message on boot.
> >>
> >>  cpu1: disabling user TSC (skew=-5310)
> >>  cpu2: disabling user TSC (skew=-5335)
> >>  cpu3: disabling user TSC (skew=-7386)
> >>
> >> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
> >> delayed against cpu0.
> >>
> >> Simply ignoring the skews by the following diff seems to workaround
> >> this problem.
> >>
> >> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> >> index 238a5a068e1..3b951a8b5a3 100644
> >> --- a/sys/arch/amd64/amd64/tsc.c
> >> +++ b/sys/arch/amd64/amd64/tsc.c
> >> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> >> u_int
> >> tsc_get_timecount(struct timecounter *tc)
> >> {
> >> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> + return rdtsc_lfence();
> >> }
> >>
> >> void
> >>
> >> So I supposed the skews are not calculated properly.  Also I found
> >> NetBSD changed the skew calculating so that it checks 1000 times and
> >> take the minimum value.
> >>
> >>  https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
> >>  https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
> >>
> >>
> >> I checked skews on the machine by the following debug code.
> >>
> >> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> >> index 238a5a068e1..83e835e4f82 100644
> >> --- a/sys/arch/amd64/amd64/tsc.c
> >> +++ b/sys/arch/amd64/amd64/tsc.c
> >> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
> >> *aptscp = tsc_sync_val;
> >> }
> >>
> >> +#define TSC_SYNC_NTIMES 1000
> >> +
> >> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
> >> +
> >> +void
> >> +tsc_debug(void)
> >> +{
> >> + int i, cpuid = curcpu()->ci_cpuid;
> >> +
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> >> + if (i % 10 == 0)
> >> + printf("%5d", tsc_difs[cpuid][i]);
> >> + else
> >> + printf(" %5d", tsc_difs[cpuid][i]);
> >> + if (i % 10 == 9)
> >> + printf("\n");
> >> + }
> >> + printf("\n");
> >> +}
> >> +
> >> void
> >> tsc_sync_bp(struct cpu_info *ci)
> >> {
> >> + int i, mindif = INT_MAX, dif;
> >> uint64_t bptsc, aptsc;
> >>
> >> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
> >> - tsc_read_bp(ci, &bptsc, &aptsc);
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> >> + tsc_read_bp(ci, &bptsc, &aptsc);
> >> + dif = bptsc - aptsc;
> >> + if (abs(dif) < abs(mindif))
> >> + mindif = dif;
> >> + tsc_difs[ci->ci_cpuid][i] = dif;
> >> + }
> >>
> >> /* Compute final value to adjust for skew. */
> >> - ci->ci_tsc_skew = bptsc - aptsc;
> >> + ci->ci_tsc_skew = mindif;
> >> }
> >>
> >> /*
> >> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
> >> void
> >> tsc_sync_ap(struct cpu_info *ci)
> >> {
> >> - tsc_post_ap(ci);
> >> - tsc_post_ap(ci);
> >> + int i;
> >> +
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
> >> + tsc_post_ap(ci);
> >> }
> >>
> >> void
> >>
> >> ----
> >> Stopped at      db_enter+0x10:  popq    %rbp
> >> ddb{0}> machine ddbcpu 1
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{1}> call tsc_debug
> >> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
> >>  -11    -9    -5    -3    -4    -3    -7     8    -5    -6
> >>   -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
> >>   -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
> >>   -9    -1    -8     1    -8     6    -5    -4     2    -2
> >>   -8    -3    -1    -5    -2    -2     1     2    -2    -9
> >>  -12     0    -9    -2    -2    -5    -2     1     2     0
> >>   -1     2    -2     6    -5    -1    -2    -4     2    -2
> >>    0    -9    -9    -6    -2     2     3    -6    -1     3
> >>    8     4    -2     2    -8     7     1     2    -2     1
> >>   -2    -6    -2     5     0     0    -4    -9     6    -2
> >>   -3    -6    -2   -12     1    -9    -2    -3   -10    10
> >>    2    -1    -3    -2     3     1     1    -5     3    -3
> >>   -5     1    -6    -2    -3     0     0     9     1     6
> >>    8    -6     5     4   -12    -1     4     2    -1    -1
> >>   -1     2     2     0    -5     1     2    -8     3     9
> >>    0     6    -3     4     6     0     8     6   -14    -1
> >>   -1     0    -6    -7     6   -10     7    -6    -5    -4
> >>    6   -12     4     3    -5     5     1    -6     3     0
> >>   -2     0     6    -9    -2    -1     1    -1     4     0
> >>    4    10   -13     1    -8    -2    -8    -3    -5    -3
> >>   -5    -5     1    -9    -9     0    -3    -1     2     6
> >>   -2     2    -3    -9    -9   -11    -7    -6    -4    -9
> >>   -4    -9    -3    -4     0    -5     0    -9   -12    -7
> >>   -6    -9     1    -5    -4   -12     7    -3   -12    -4
> >>   -5    -5    -6    -9    -7    -1     0     0    -1    -2
> >>   -6    -8     0     1    -8    -5    -2    -4     0    -1
> >>   -3   -10   -15    -3    -8   -11    -9    -9     2     0
> >>   -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
> >>    0     0     2    -2    -4     1    -6     0     0    -5
> >>   -2    -7    -5    -2    -2     1    -2    -6    -1    -7
> >>   -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
> >>   -4    -3    -4   -11     1    -9     0    -3     2    -9
> >>   -8     2    -1    -7    -5    -5    -9     2    -3    -5
> >>    0     5   -12     0    -5    -3    -6    -1   -13   -10
> >>   -9     0     0    -5    -7    -4    -3    -3    -3    -2
> >>   -2     3    -5    -3    -5    -1    -7    -4   -10     0
> >>   -3     0     2     1    -4    -1    -5    -3    -5    -6
> >>   -4    -8    -3     0    -1    -2   -13   -10    -9    -5
> >>  -11   -11    -4    -3     0     5    -2    -3    -6     0
> >>   -6    -9    -1    -4    -1     2    -2    -7    -9     0
> >>   -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
> >>   -8    -6    -2    -3    -9    -5    -9   -11   -10     1
> >>   -3    -6    -1    -1    -6     0     0    -8    -4     0
> >>   -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
> >>   -4     2    -2 -5012     5     2   -17     0     7    -5
> >>    0    -4    -3     6    -7    -1    -1     4    -6     3
> >>    0    -4    -9    -7   -11   -11     8    -7   -15   -10
> >>    3    -4     1   -17    -4     3   -17     0     4     3
> >>   -2     0    -3   -10    -2     1     3    -5   -12   -19
> >>    1     2     5     1    -9     4    -2    -3    -4     0
> >>   -1   -11    -3    -1    -9    -5     0    -8     7    -2
> >>   -6    -7     4    -5    -2    -1    -5     0    -5    -5
> >>  -14    -2    -8     0   -11     9   -10     2    -6   -17
> >>   -3    -5    -6     2     0     9   -14     0    -4    -7
> >>    6     2     2    -9    -9     5     5     0    -6     3
> >>  -12     5    -2   -13   -10    -5    -7     2   -11    -3
> >>   -6    -2   -13     1     8    -5   -14     2     4    -3
> >>  -13    -5   -11    -9   -10     4    -3    -1     9   -17
> >>  -11     2   -13    -2    -1    -9   -10     0    -5    -4
> >>    0    10    -8    -5    -8    -3   -14    -6     3   -15
> >>    1    -5     1   176    -8    -7    -7    -4    -1    -1
> >>   -8    -7    -4     1    -6    -9     1    -2    -9    -4
> >>   -4    -1    -7     0    -8    -3    -4    -3    -1    -2
> >>   -5    -6    -9     2    -6     0    -8    -5     0    -9
> >>  -10     0    -4     4    -6   -11    -3     2   -12     1
> >>   -2    -6    -6    -3    -7    -7     0    -9    -1    -9
> >>   -1    -8    -4    -3   -11     1     0     1    -2    -4
> >>  -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
> >>   -3    -4    -2    -4     1     0    -5    -2    -1     4
> >>   -9    -1    -4     1    -8   -11     0   -10    -4    -9
> >>   -5    -2    -2     4     0    -7    -4     1    -2     1
> >>   -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
> >>   -4    -9    -7    -5    -3     3    -5   -12    -3     0
> >>   -8    -4    -9    -5    -6     0     0    -1    -2    -6
> >>   -8   -12    -3     1     2    -6    -1    -7   -10    -9
> >>   -6    -8     0    -2    -3    -7    -3    -2     6    -3
> >>  -12     0     0    -7    -9    -6    -1    -5    -2    -9
> >>   -6     1     0    -3    -1    -1    -2     2    -2    -3
> >>   -7    -9    -1    -8    -4    -2     5    -5    -3   -10
> >>    2     6    -3     0    -6    -8    -9    -1    -1    -7
> >>   -8    -1    -1    -4    -4     7    -2   -10   -11    -6
> >>    2     2    -4     3    -2    -1    -3     0     0    -7
> >>   -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
> >>    0     1    -3     5    -3    -4    -1    -6    -9    -4
> >>   -6     0    -9    -6     0    -2     4    -2    -4   -10
> >>   -9    -4    -3    -9    -3    -6    -9    -8    -4     1
> >>   -5    -6    -5     1     0    -2    -3    -6    -5    -9
> >>   -4     1    -5    -4    -2    -4    -8    -3    -4     0
> >>    2    -5    -3    -7    -1    -2    -1    -9    -6   -15
> >>  -10    -6    -2    -7    -1    -3     3    -6    -6    -9
> >>  -10    -8    -9    -2    -3     0    -6     3    -4     4
> >>    3     3     8    -2    -2    -4     0    -3    -9    -3
> >>   -6    -4     3     2     1     1    -3    -7   -15    -1
> >>   -4    -6    -1    -2    -1   -12     2    -1    -4     1
> >>    2     3    -5     3    -3    -7    -6    -5     0     1
> >>    5   -13    -8     0    -5     2     0    -5    -3     6
> >>   -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
> >>  -10    -4   -10    -9    -2     1     0    -4    -3     0
> >>    1    -3    -1    -4    -7   -10   -13    -8    -1    -1
> >>
> >> 0x1
> >> ddb{1}> machine ddbcpu 2
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{2}> call tsc_debug
> >> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
> >>    3     3    -8    -3    -4     4     0    -8    -7    -5
> >>   -5     3    -7    -5    -4    -9    -7    -3     0     2
> >>   -5     2     1     3    -2     3     8    -6   -11     8
> >>    8    -5     1     5     0    -8     2     0     6     3
> >>  -14     7    -2    -1    -3     1    -5    -6     0     5
> >>    1    -1     0    -2    -5     2    -3     0    -3    -1
> >>   -5   -12    -4    -4    -9     4     0    -2    -2    -8
> >>    2     5     7    -2     0    -6   110    -8    -8    -4
> >>    0     5    -7    -3    -5    -4     9    -2    -2     3
> >>   -8    -2    -5     4    -3   217     0    -7    -7    -6
> >>    7   -10    -9    -3     3   -14     3    -5     5   -12
> >>    5    -8   -17    -5   286    -6     0    -3    -4    -2
> >>    1    -5    -5    -9    -6    -7    -3    -5     6     0
> >>    1    -1    -4    -2     2    -2    -2    -2    -5     2
> >>   12     3   -18    -8     6    -4    -3     6     2    -3
> >>   -7    -3     4    -5   -23     9     6     6    -6   -11
> >>    9    -1   -10 50505    -1     2     6   -11     2    -2
> >>   -4    -6   201     1     3     4    -9     6     0     1
> >>   -4     0    -1     3     4     1     6    -7    -5     4
> >>  -14    -3    -1    -8     5     6    -5     3    -7    -9
> >>   -7     1    -2     5    -2     0    -2    -9     4    -3
> >>   98    -5     7    -7     3     0    -5     0     9     2
> >>   -7    -5    -3   -12   -11   -11     6    -5    -7    -6
> >>  210     5    -3    -5    -4   -11    -6     0    -5    -9
> >>    3     0    -9     5     1     0     0    -7    -5   210
> >>    1    -6   -17    -8     0     1    -2    -8     1    -7
> >>   10    -8    -8    -9     4    -2    -4    -3   204     5
> >>   -9   -15     3    -1    -5     0   -12    -1     0     1
> >>   -1    -6    -5    -9    -1     4    -1    -1     0     1
> >>    4    -8   -13     1     0    -5    -6     0    -4     0
> >>    6    -2    -4    -8    -7   -12    -2    -2    -6    -8
> >>   -5     0    -8    -7   -11     0     6    -1    -8    -3
> >>    2     6    -6     0   -10   285    -1    -2    -8    -6
> >>   -6    -1    -5    -6     0    -5    -8    -5     1    -8
> >>   -1     1     4    -3    -4   188    -3    -3   -10     5
> >>    6     0    -7     4     1     2     0    -2    -2     2
> >>   -3    -1    -9   -12   201    -1    -7    -1     8     0
> >>    0     0    -5     0     7   -18     5     1    -2    15
> >>    5    -6     4   -10   272     0    -4    -3     2   -10
> >>   -7     7     3     4     1     6    -9    -8   -12    -2
> >>   -2    -2    -6     8     3    97    -1    -7     5     1
> >>   -7     4    -6    -9    -7    -2     0    -6     8   -13
> >>   -1     3    -9    -4   233    -2     0     0    -5    -5
> >>   -2     0     0     5    -7     6   -14     4    -6     5
> >>    4     3     3    -3   103    -2    -6   -11     2    -2
> >>   -3    -8     0    -1     1     0    -6     1     1   -10
> >>   -1     0    -1     0     0    -1    -6    -4    -4    -3
> >>    3     0    -5     0     2    -2     6     0   -13     3
> >>    1   -16    -2   -12   206    -4    -6    -5    -3     2
> >>   -8    -2    -9    -2     9     7    -1     1     3    -5
> >>    6     6    10     0    99    -2    -1    -2     0    -6
> >>   -8    -9     0     3     0   -11    -6     1    -4     9
> >>  -11   -11     2    -1   276    -7     2     4    -4    -3
> >>    4     2   -12     8     1    -4     0    -1    -1    -1
> >>    5    -8     0     6   232    -4     2    -2   -11     2
> >>   -6     0     4     6    -7     8    -6     3    -3    -9
> >>    0     1    -7     2    -3    -5    -3    -2    -8    -4
> >>  -14    -2     0     4    -4    -3    -4     9     3    -1
> >>   -5    -8     1     0   210     0    -6    -4     2     2
> >>    0    -3    -4     0     4   -12    10    -2    -3    -1
> >>    3     7    -3     6    -9   190     4     6    -2    11
> >>  -10    -2    -9     3     2     4    -4    -7    -9    -2
> >>  -10    12     1    -7     3    -1     0    -1   -11     6
> >>    6     0    -8     1     4     2    -2    -5     0     0
> >>    5    -5    -3    -5   205    -1    -3    -1     0    -4
> >>   -3    -7     3     0    -7    -5    -4    -3     7     1
> >>  -14    -2     0   -14     2     0     7    11    -2    -7
> >>    6    -6    -3    -4     0     4    -3    -4    -3    -7
> >>   -6     3    -4     0     4    -3    -6     3     4    -4
> >>   -6     7   -11     1   -10   -10   -12    -4    -3     6
> >>   -5    -6     5   212    -8     1    -4     3    -3    -8
> >>    0   -10     0     2     6    -3    -1   -13     1     6
> >>   -6     5    -4     0    -7    -4    -5    -6     1    -2
> >>    1   -10   -12    -3    -8     9   -11     0     1    -3
> >>   -1     1   186     2   -12     3    -4     0     0    -1
> >>   -5    -4     1    -1     4     5   -10     0    -4     1
> >>   -1    -6   270     0   -17     5     0     0    -4    -1
> >>    4     6     1     0    -6     6     5    -3     3    -2
> >>   -6    -7    18   -16     0     9     4     3    -1     6
> >>    4     1    -5     7   -11    -1    -6    -2     6    -2
> >>   -8   256    -5    -2     1    -1    -5    -3    -9     0
> >>   -1     3    -2   -11     4     3    -7    -3     3    -1
> >>   -5    -5     0    -4    -1    -3    -3     6    -3     3
> >>    3    -2   -11    -2    -3    11    -8     1     5    -7
> >>    5   -12    -3     8    -9    -5     7     5    -3     2
> >>   -7    -3    -6     2    -2    -1    -2    -9    -8    99
> >>    6    -2     9    -1    -4    -2     0    -2    -7    -5
> >>    0     1    -4    -8    -1    -2     2    -8     2   205
> >>   -3   -10    -1    -1    -2    -5     2     2     5    -2
> >>   -5    -6    -4     6     6    -6     4     1    -5     0
> >>   -7     3     1     0   -11    -7    -3     5    -5     5
> >>    1    -1     3    -5    -8     0    -1     0   183    -5
> >>    0     4    -1    -6   -11   -10     1   -18     3    -1
> >>   -5    -9    -2     2     2    -2     0    99    -7    -8
> >>   -1    -3    -5    -1    12    -3    -1     2     1     4
> >>    7     3   -14     2    -4     8    -9    -3    -8    -5
> >>    6    -6     5   -12     6    -1    -9    -4    -4     1
> >>   -6     0     0    -2    -3    -5    -9    -2    -9    -3
> >>    3   -16    -2    -1     0     9    -4     5    -6     5
> >>
> >> 0x1
> >> ddb{2}> machine ddbcpu 3
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{3}> call tsc_debug
> >> -8336 -6457 -45527     0    -1     0    -2     4     0     5
> >>   -9    -6    -4    -4     6     4     0    -3    -4     5
> >>    3     6   -12    -1     1     1    -3     6    -4    -2
> >>   -2     2     4    -3     0    -1     3     0     1     3
> >>   -3     3    -1     4    -5    -2    -2    -9     6    -9
> >>    0     1    -2    -6     8    -4    -2    -2     6     1
> >>   -1     1    -6    -6     4    -5    -1     6    -1    -1
> >>    3     5     0    -6     5    -4    -2    -6    -3    -4
> >>   -5     2    -3    -3    -5    -3    -5 -5720     0     5
> >>   -1    -3     3    -2     4    -6     8   -16    -6    -3
> >>   -2     4     8    -3     3    -1     2    -8    -3   -19
> >>   -8     3    -7    -9    -6    -3     1    -3    -6     7
> >>    4     1     3     2    -4     7    -3     2     2    -4
> >>  -10    -8   -14    -2     2    -3     3    -2     3    -3
> >>    5     5    -6     9    -3   -12    -6     1   -10     7
> >>   -6     5    -4     1     6     3     2     2    -6    -1
> >>    6    -8    -5     7     3    -3    -4    -6     1    -5
> >>    4    -6     2     6    -6     3    -8    -5    -6     0
> >>   -5    -2   -13    -8     3     0   -17    -7    -9     1
> >>    6   -12     3     6     3    -3     4    -1    -7     0
> >>    2     0    -7   -10    -6     3     1     2   -19     4
> >>    1   -18     1    -3    -6   -14     4     6     3    -4
> >>   -7   -11    -1    -1     3     0     6     6    -8   -14
> >>    3    -2     6    -5     0     1     0    -7     0     4
> >>   -3   -16    -2    -4   -12    -4     6     0    -8    -4
> >>   -4    -4    -3     0    -6   -13   -10   -15    -6     2
> >>    0    -3     0    -8     4    -1    -1     5    -4    -1
> >>   -7     2     1     1     3    -3    -1   -18     6     8
> >>   -2     3    -6     0    -6    -2     2    -2    -7     1
> >>   -6   -13    -4    -2    -1    -6     6    -5    -9   -14
> >>    4     5    -4    -2    -9    -2    -2   -13     1   -18
> >>   -1     2    -5     6    -6    -7    -9    -6     1     6
> >>  -13    -4     3     0    -8    -6    -6   -10    -2    -9
> >>    5     2     4     1     6    -5    -8    -6     2    -4
> >>   -3    -5    -2    -6   -10     0     5    -2     8    -3
> >>    8   -11   -11    -7    -5   -13   -19    -5   -14    -3
> >>    3     2     1     3     6    -1    -9   -16     3    -7
> >>    1    -3    -5     0    -7     6     4    -2    -2     4
> >>    4    -6    -6     8    -6    -7    -5    -2     0     4
> >>   -1     3     1     3    -6    -2    -4    -9     1     0
> >>   -2     3     2   -16     4   -15   -11    -3     8     0
> >>   -6    -3   -18    -7    -8     8    -8     6    -7    -4
> >>   -8    -7    -9     0    -2     3     7    -2     1    -6
> >>    2    -6     8    -1   -12    -8    -4     3   -13    -2
> >>  -11     1    -2    -7    -3     0   -16    -8     4    -9
> >>  -15    -8    -9     8     5     7    -9     5   -10    10
> >>    1     6    -6     3    -6    -4     5     0    -3    -7
> >>   -1    -4   -10    -2     0   -11     8    -8    -3   -11
> >>    4    -6     1    -8    -1    -6     3    -1   -12    -7
> >>   11    -1     0    -4   -13     0   -10     7    -2     0
> >>   -6     4     0   -12    -9     6    -2    -5    -5    -7
> >>   -1    -9    -5     3     3    -7     3   -16    -2   -10
> >>    0    -2     6     4     4    -6    -9    -3    -6     4
> >>   -5    -1     7   -11   -21    -9    -3    -1     4   -13
> >>   -7     0    -3     0   -10    -7     8    -9     7     6
> >>   -9   -14     5    -9    -7    -8    11    -6     1    -3
> >>   -9     7     5     0   -12    -3    -4   -18     0     4
> >>   -1     8    -8     9     4     0     5   -10   -10    -8
> >>    1     8    -1     4     1    -3    -6    -6    -5    -1
> >>  -12    -6    -8   -14   -10     2    -1     9     0    -9
> >>    0    -8    -6    -5     1   -14    -6     5     1    -7
> >>    3    -9     6    -4     3     0   -21     8     7     5
> >>    0     0    -2     2     1    -7   -11     1    -7     2
> >>   -3    -2     9     1     3    -1    -8     0   -18    -7
> >>   -3     6     1     1    -8    -5    -1     2    -4    -6
> >>  -10    -5   -20   -18     5    -7     2     5    -3    -3
> >>   -6    -3    -3     4    -7    -2    -4     2    -6   -11
> >>   -4   -15    -6    -5     2    -1   -10    -4    -6    -3
> >>   -1     0    -6   -10     5    -5     2     2    -8     6
> >>   -1     5    -5    -9    12     0    -6   -17     2    -4
> >>    4   -11    -1    -8     0    -3   -11    -8     0    -6
> >>    2    -1    -4    -9   -12     3     6   -10    -2    -6
> >>  -13     1   -10     1   -13     5    -4     3   -11     4
> >>   -8     4     4   -17     6   -12     3   -13     0    -3
> >>   -7     4   -11    -1     1     3     5    -8    -3     0
> >>    4    -8    -1     4   -13     2    -1     2     5    -6
> >>   -6     4    -4    -5     1    -4     4     5    -2   -10
> >>   -9     0   -14    -2    -7     1    -1   -14   -15     8
> >>   -3     9    -3    -4    -8     0     2     5   -11   -13
> >>   -5   -13    -3    -7     9    -3    -7    -6    -9    -7
> >>   -8   -10    -1     6     2     2     3   -13    -6    -5
> >>    3   -13     2    -6     4     1     0    -9     4   -11
> >>  -15     0     1   -12    -1     2   -11     2    -1   -13
> >>  -13    -5     3     9   -11    -8     2   -12    -2    -5
> >>    0    -3    -2     1    -6    -2    -1     0    -3     2
> >>    0    -9    -4     1    -2     3    -6     0    -4    -6
> >>    2     1   -14    -4    -7   -23    -1    -4    -8    -8
> >>    2    -4     1     6   -10     5    -9    -6     6    -1
> >>    4    -2    -9     0    -5    -1     8     0     3     4
> >>   -4    -7    -4     2   -15    -6     2     1    -6    -4
> >>   -3    -3     3    -7    -2    -9     9    -2    -9    -4
> >>    3    -8   -10    -3    -4     1    -4   -10    -1     3
> >>   -1   -15     5     0     2    -6     4     6    -2     0
> >>    2     5     3   -12    -5    -5    -2    -4    -4     5
> >>   -8    -4    -6   -16    -1     4    -4    -1    -8     0
> >>    6   -10     5     0     1    -3    -9     8     0   -11
> >>   -3   -13    -1     3     3    -6    -6    -2     3     5
> >>    4    -6    12   -17     1    -5    -5    -2     1    -3
> >>   -7     5    -4     8    -5    -1    -5     8   -12     4
> >>   -6     2    -5    -9     2    -2     5     3    -5    -8
> >>
> >> 0x1
> >> ddb{3}>
> >> ----
> >>
> >> I seems that we can fix the problem by comparing TSC more times and
> >> choosing the minimum value.
> >>
> >> The diff also includes a fix for the problem (use the minimum value of
> >> 1000 samplings).  With the diff, I tried "monotime" test program over
> >> 100 times, it didn't find any clock going back.
> >>
> >>
> >> dmesg
> >> ----
> >> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
> >>    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> >> real mem = 6425083904 (6127MB)
> >> avail mem = 6215311360 (5927MB)
> >> random: good seed from bootblocks
> >> mpath0 at root
> >> scsibus0 at mpath0: 256 targets
> >> mainbus0 at root
> >> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
> >> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
> >> bios0: VMware, Inc. VMware7,1
> >> acpi0 at bios0: ACPI 4.0
> >> acpi0: sleep states S0 S1 S4 S5
> >> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
> >> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
> >> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> >> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> >> cpu0 at mainbus0: apid 0 (boot processor)
> >> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
> >> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu0: 256KB 64b/line 8-way L2 cache
> >> cpu0: smt 0, core 0, package 0
> >> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> >> cpu0: apic clock running at 65MHz
> >> cpu1 at mainbus0: apid 1 (application processor)
> >> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> >> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu1: 256KB 64b/line 8-way L2 cache
> >> cpu1: disabling user TSC (skew=-5310)
> >> cpu1: smt 0, core 1, package 0
> >> cpu2 at mainbus0: apid 2 (application processor)
> >> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
> >> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu2: 256KB 64b/line 8-way L2 cache
> >> cpu2: disabling user TSC (skew=-5335)
> >> cpu2: smt 0, core 2, package 0
> >> cpu3 at mainbus0: apid 3 (application processor)
> >> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> >> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu3: 256KB 64b/line 8-way L2 cache
> >> cpu3: disabling user TSC (skew=-7386)
> >> cpu3: smt 0, core 3, package 0
> >> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
> >> acpimcfg0 at acpi0
> >> acpimcfg0: addr 0xe0000000, bus 0-127
> >> acpihpet0 at acpi0: 14318179 Hz
> >> acpiprt0 at acpi0: bus 0 (PCI0)
> >> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> >> acpicmos0 at acpi0
> >> "PNP0A05" at acpi0 not configured
> >> acpiac0 at acpi0: AC unit online
> >> acpicpu0 at acpi0: C1(@1 halt!)
> >> acpicpu1 at acpi0: C1(@1 halt!)
> >> acpicpu2 at acpi0: C1(@1 halt!)
> >> acpicpu3 at acpi0: C1(@1 halt!)
> >> cpu0: using Broadwell MDS workaround
> >> pvbus0 at mainbus0: VMware
> >> vmt0 at pvbus0
> >> pci0 at mainbus0 bus 0
> >> 0:16:0: rom address conflict 0xffffc000/0x4000
> >> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
> >> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
> >> pci1 at ppb0 bus 1
> >> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
> >> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
> >> pciide0: channel 0 disabled (no drives)
> >> atapiscsi0 at pciide0 channel 1 drive 0
> >> scsibus1 at atapiscsi0: 2 targets
> >> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
> >> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
> >> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
> >> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
> >> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
> >> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
> >> mpi0: 0, firmware 1.3.41.32
> >> scsibus2 at mpi0: 16 targets, initiator 7
> >> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
> >> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
> >> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
> >> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
> >> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> >> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> >> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
> >> pci2 at ppb1 bus 2
> >> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
> >> pci3 at ppb2 bus 3
> >> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
> >> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
> >> pci4 at ppb3 bus 4
> >> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
> >> pci5 at ppb4 bus 5
> >> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
> >> pci6 at ppb5 bus 6
> >> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
> >> pci7 at ppb6 bus 7
> >> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
> >> pci8 at ppb7 bus 8
> >> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
> >> pci9 at ppb8 bus 9
> >> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
> >> pci10 at ppb9 bus 10
> >> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
> >> pci11 at ppb10 bus 11
> >> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
> >> pci12 at ppb11 bus 12
> >> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
> >> pci13 at ppb12 bus 13
> >> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
> >> pci14 at ppb13 bus 14
> >> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
> >> pci15 at ppb14 bus 15
> >> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
> >> pci16 at ppb15 bus 16
> >> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
> >> pci17 at ppb16 bus 17
> >> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
> >> pci18 at ppb17 bus 18
> >> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
> >> pci19 at ppb18 bus 19
> >> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
> >> pci20 at ppb19 bus 20
> >> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
> >> pci21 at ppb20 bus 21
> >> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
> >> pci22 at ppb21 bus 22
> >> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
> >> pci23 at ppb22 bus 23
> >> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
> >> pci24 at ppb23 bus 24
> >> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
> >> pci25 at ppb24 bus 25
> >> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
> >> pci26 at ppb25 bus 26
> >> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
> >> pci27 at ppb26 bus 27
> >> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
> >> pci28 at ppb27 bus 28
> >> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
> >> pci29 at ppb28 bus 29
> >> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
> >> pci30 at ppb29 bus 30
> >> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
> >> pci31 at ppb30 bus 31
> >> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
> >> pci32 at ppb31 bus 32
> >> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
> >> pci33 at ppb32 bus 33
> >> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
> >> pci34 at ppb33 bus 34
> >> isa0 at pcib0
> >> isadma0 at isa0
> >> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
> >> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> >> com0: console
> >> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> >> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> >> pckbd0 at pckbc0 (kbd slot)
> >> wskbd0 at pckbd0 mux 1
> >> pms0 at pckbc0 (aux slot)
> >> wsmouse0 at pms0 mux 0
> >> pcppi0 at isa0 port 0x61
> >> spkr0 at pcppi0
> >> efifb0 at mainbus0: 1152x864, 32bpp
> >> wsdisplay0 at efifb0 mux 1
> >> wskbd0: connecting to wsdisplay0
> >> wsdisplay0: screen 0-5 added (std, vt100 emulation)
> >> vscsi0 at root
> >> scsibus3 at vscsi0: 256 targets
> >> softraid0 at root
> >> scsibus4 at softraid0: 256 targets
> >> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
> >> ----
> >>
> >> This happens on 2 ESXi hosts at least
> >>
> >> - 1
> >>  - ESXi 6.0.0, 3029758
> >>  - Xeon E5-2620 x 2
> >> - 2
> >>  - ESXi 6.7.0 Update 3 (Build 14320388)
> >>  - Xeon Silver 4208 x 2
> >>
> >
> > This broke the monotonic clock on my Ryzen 5 2500U.
> >
> > Note: userland TSC has never worked on this device.
> >
> > $ ./monotime
> > 320678 Starting
> > 351995 Starting
> > 387215 Starting
> > 505501 Starting
> > 387215 Stopped
> > 505501 Back 213.019672364 => 212.599096325
> > 505501 Stopped
> > 351995 Stopped
> > 320678 Stopped
>
> Which diff did you apply?  Yasuoka provided two diffs.
>
> In any case, ignore this diff:
>
> > diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> > index 238a5a068e1..3b951a8b5a3 100644
> > --- a/sys/arch/amd64/amd64/tsc.c
> > +++ b/sys/arch/amd64/amd64/tsc.c
> > @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> > u_int
> > tsc_get_timecount(struct timecounter *tc)
> > {
> > - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > + return rdtsc_lfence();
> > }
> >
> > void
>
>
> We don't want to discard the skews, that's wrong.
>
> The reason it "fixes" Yasuoka's problem is because the real skews
> on the ESXi VMs in question are probably close to zero but our
> synchronization algorithm is picking huge (wrong) skews due to
> some other variable interfering with our measurement.

I had both applied.  As I understood it, the first patch discarding
the skews was a proposed fix and the second was only debug code to
dump the skews.  (Unfortunately, I don't know a way to gather this
information from my device (thinkpad E485), as I don't believe I can
attach to the serial console to capture the ddb output.)

Clock doesn't go backwards with only the second diff.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Mark Kettenis
In reply to this post by Scott Cheloha
> From: Scott Cheloha <[hidden email]>
> Date: Thu, 25 Mar 2021 13:18:04 -0500
>
> > On Mar 24, 2021, at 8:29 AM, Josh Rickmar <[hidden email]> wrote:
> >
> > On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:
> >> Hi,
> >>
> >> I hit a problem which is caused by going back of monotonic time.  It
> >> happens on hosts on VMware ESXi.
> >>
> >> I wrote the program which repeats the problem.
> >>
> >> % cc -o monotime monotime.c -lpthread
> >> % ./monotime
> >> 194964 Starting
> >> 562210 Starting
> >> 483046 Starting
> >> 148865 Starting
> >> 148865 Back 991.808048665 => 991.007447931
> >> 562210 Back 991.808048885 => 991.007448224
> >> 483046 Back 991.808049115 => 991.007449172
> >> 148865 Stopped
> >> 562210 Stopped
> >> 483046 Stopped
> >> 194964 Stopped
> >> % uname -a
> >> OpenBSD yasuoka-ob-c.tokyo.iiji.jp 6.8 GENERIC.MP#5 amd64
> >> % sysctl kern.version
> >> kern.version=OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
> >>     [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> >> %
> >>
> >> monotime.c
> >> ----
> >> #include <sys/types.h>
> >> #include <sys/time.h>
> >> #include <stdio.h>
> >> #include <time.h>
> >> #include <unistd.h>
> >> #include <pthread.h>
> >> #include <stdlib.h>
> >>
> >> #define NTHREAD 4
> >> #define NTRY 50000
> >>
> >> void *
> >> start(void *dummy)
> >> {
> >> int i;
> >> struct timespec ts0, ts1;
> >>
> >> printf("%d Starting\n", (int)getthrid());
> >> clock_gettime(CLOCK_MONOTONIC, &ts0);
> >>
> >> for (i = 0; i < NTRY; i++) {
> >> clock_gettime(CLOCK_MONOTONIC, &ts1);
> >> if (timespeccmp(&ts0, &ts1, <=)) {
> >> ts0 = ts1;
> >> continue;
> >> }
> >> printf("%d Back %lld.%09lu => %lld.%09lu\n",
> >>    (int)getthrid(), ts0.tv_sec, ts0.tv_nsec, ts1.tv_sec,
> >>    ts1.tv_nsec);
> >>     break;
> >> }
> >> printf("%d Stopped\n", (int)getthrid());
> >>
> >> return (NULL);
> >> }
> >>
> >> int
> >> main(int argc, char *argv[])
> >> {
> >> int i, n = NTHREAD;
> >> pthread_t *threads;
> >>
> >> threads = calloc(n, sizeof(pthread_t));
> >>
> >> for (i = 0; i < n; i++)
> >> pthread_create(&threads[i], NULL, start, NULL);
> >> for (i = 0; i < n; i++)
> >> pthread_join(threads[i], NULL);
> >>
> >> }
> >> ----
> >>
> >> The machine has 4 vCPUs and showing the following message on boot.
> >>
> >>  cpu1: disabling user TSC (skew=-5310)
> >>  cpu2: disabling user TSC (skew=-5335)
> >>  cpu3: disabling user TSC (skew=-7386)
> >>
> >> This means "user TSC" is disabled because of TSC of cpu{1,2,3} is much
> >> delayed against cpu0.
> >>
> >> Simply ignoring the skews by the following diff seems to workaround
> >> this problem.
> >>
> >> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> >> index 238a5a068e1..3b951a8b5a3 100644
> >> --- a/sys/arch/amd64/amd64/tsc.c
> >> +++ b/sys/arch/amd64/amd64/tsc.c
> >> @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> >> u_int
> >> tsc_get_timecount(struct timecounter *tc)
> >> {
> >> - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> + return rdtsc_lfence();
> >> }
> >>
> >> void
> >>
> >> So I supposed the skews are not calculated properly.  Also I found
> >> NetBSD changed the skew calculating so that it checks 1000 times and
> >> take the minimum value.
> >>
> >>  https://github.com/NetBSD/src/commit/1dec05c1ae197b4acfc7038e49dfddabcbed0dff
> >>  https://github.com/NetBSD/src/commit/66d76b89792bac1c71cd5507ba62b08ad02129ef
> >>
> >>
> >> I checked skews on the machine by the following debug code.
> >>
> >> diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> >> index 238a5a068e1..83e835e4f82 100644
> >> --- a/sys/arch/amd64/amd64/tsc.c
> >> +++ b/sys/arch/amd64/amd64/tsc.c
> >> @@ -302,16 +302,42 @@ tsc_read_bp(struct cpu_info *ci, uint64_t *bptscp, uint64_t *aptscp)
> >> *aptscp = tsc_sync_val;
> >> }
> >>
> >> +#define TSC_SYNC_NTIMES 1000
> >> +
> >> +static int tsc_difs[MAXCPUS][TSC_SYNC_NTIMES];
> >> +
> >> +void
> >> +tsc_debug(void)
> >> +{
> >> + int i, cpuid = curcpu()->ci_cpuid;
> >> +
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> >> + if (i % 10 == 0)
> >> + printf("%5d", tsc_difs[cpuid][i]);
> >> + else
> >> + printf(" %5d", tsc_difs[cpuid][i]);
> >> + if (i % 10 == 9)
> >> + printf("\n");
> >> + }
> >> + printf("\n");
> >> +}
> >> +
> >> void
> >> tsc_sync_bp(struct cpu_info *ci)
> >> {
> >> + int i, mindif = INT_MAX, dif;
> >> uint64_t bptsc, aptsc;
> >>
> >> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
> >> - tsc_read_bp(ci, &bptsc, &aptsc);
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++) {
> >> + tsc_read_bp(ci, &bptsc, &aptsc);
> >> + dif = bptsc - aptsc;
> >> + if (abs(dif) < abs(mindif))
> >> + mindif = dif;
> >> + tsc_difs[ci->ci_cpuid][i] = dif;
> >> + }
> >>
> >> /* Compute final value to adjust for skew. */
> >> - ci->ci_tsc_skew = bptsc - aptsc;
> >> + ci->ci_tsc_skew = mindif;
> >> }
> >>
> >> /*
> >> @@ -342,8 +368,10 @@ tsc_post_ap(struct cpu_info *ci)
> >> void
> >> tsc_sync_ap(struct cpu_info *ci)
> >> {
> >> - tsc_post_ap(ci);
> >> - tsc_post_ap(ci);
> >> + int i;
> >> +
> >> + for (i = 0; i < TSC_SYNC_NTIMES; i++)
> >> + tsc_post_ap(ci);
> >> }
> >>
> >> void
> >>
> >> ----
> >> Stopped at      db_enter+0x10:  popq    %rbp
> >> ddb{0}> machine ddbcpu 1
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{1}> call tsc_debug
> >> -8445 -6643 -52183     0    -3    -4    -7   -11    -5     0
> >>  -11    -9    -5    -3    -4    -3    -7     8    -5    -6
> >>   -5    -9    -3    -9    -7    -1    -5    -5    -9    -2
> >>   -6    -4    -6    -4   -11    -8    -3    -4    -8    -1
> >>   -9    -1    -8     1    -8     6    -5    -4     2    -2
> >>   -8    -3    -1    -5    -2    -2     1     2    -2    -9
> >>  -12     0    -9    -2    -2    -5    -2     1     2     0
> >>   -1     2    -2     6    -5    -1    -2    -4     2    -2
> >>    0    -9    -9    -6    -2     2     3    -6    -1     3
> >>    8     4    -2     2    -8     7     1     2    -2     1
> >>   -2    -6    -2     5     0     0    -4    -9     6    -2
> >>   -3    -6    -2   -12     1    -9    -2    -3   -10    10
> >>    2    -1    -3    -2     3     1     1    -5     3    -3
> >>   -5     1    -6    -2    -3     0     0     9     1     6
> >>    8    -6     5     4   -12    -1     4     2    -1    -1
> >>   -1     2     2     0    -5     1     2    -8     3     9
> >>    0     6    -3     4     6     0     8     6   -14    -1
> >>   -1     0    -6    -7     6   -10     7    -6    -5    -4
> >>    6   -12     4     3    -5     5     1    -6     3     0
> >>   -2     0     6    -9    -2    -1     1    -1     4     0
> >>    4    10   -13     1    -8    -2    -8    -3    -5    -3
> >>   -5    -5     1    -9    -9     0    -3    -1     2     6
> >>   -2     2    -3    -9    -9   -11    -7    -6    -4    -9
> >>   -4    -9    -3    -4     0    -5     0    -9   -12    -7
> >>   -6    -9     1    -5    -4   -12     7    -3   -12    -4
> >>   -5    -5    -6    -9    -7    -1     0     0    -1    -2
> >>   -6    -8     0     1    -8    -5    -2    -4     0    -1
> >>   -3   -10   -15    -3    -8   -11    -9    -9     2     0
> >>   -2    -4    -2    -3   -13    -9    -9    -1   -10    -6
> >>    0     0     2    -2    -4     1    -6     0     0    -5
> >>   -2    -7    -5    -2    -2     1    -2    -6    -1    -7
> >>   -6    -1    -9    -3    -2    -1    -4    -6    -3    -4
> >>   -4    -3    -4   -11     1    -9     0    -3     2    -9
> >>   -8     2    -1    -7    -5    -5    -9     2    -3    -5
> >>    0     5   -12     0    -5    -3    -6    -1   -13   -10
> >>   -9     0     0    -5    -7    -4    -3    -3    -3    -2
> >>   -2     3    -5    -3    -5    -1    -7    -4   -10     0
> >>   -3     0     2     1    -4    -1    -5    -3    -5    -6
> >>   -4    -8    -3     0    -1    -2   -13   -10    -9    -5
> >>  -11   -11    -4    -3     0     5    -2    -3    -6     0
> >>   -6    -9    -1    -4    -1     2    -2    -7    -9     0
> >>   -8    -4    -6    -5   -12    -9    -5   -11    -5    -8
> >>   -8    -6    -2    -3    -9    -5    -9   -11   -10     1
> >>   -3    -6    -1    -1    -6     0     0    -8    -4     0
> >>   -3   -10    -4    -2    -3    -2    -1    -9   -11   -12
> >>   -4     2    -2 -5012     5     2   -17     0     7    -5
> >>    0    -4    -3     6    -7    -1    -1     4    -6     3
> >>    0    -4    -9    -7   -11   -11     8    -7   -15   -10
> >>    3    -4     1   -17    -4     3   -17     0     4     3
> >>   -2     0    -3   -10    -2     1     3    -5   -12   -19
> >>    1     2     5     1    -9     4    -2    -3    -4     0
> >>   -1   -11    -3    -1    -9    -5     0    -8     7    -2
> >>   -6    -7     4    -5    -2    -1    -5     0    -5    -5
> >>  -14    -2    -8     0   -11     9   -10     2    -6   -17
> >>   -3    -5    -6     2     0     9   -14     0    -4    -7
> >>    6     2     2    -9    -9     5     5     0    -6     3
> >>  -12     5    -2   -13   -10    -5    -7     2   -11    -3
> >>   -6    -2   -13     1     8    -5   -14     2     4    -3
> >>  -13    -5   -11    -9   -10     4    -3    -1     9   -17
> >>  -11     2   -13    -2    -1    -9   -10     0    -5    -4
> >>    0    10    -8    -5    -8    -3   -14    -6     3   -15
> >>    1    -5     1   176    -8    -7    -7    -4    -1    -1
> >>   -8    -7    -4     1    -6    -9     1    -2    -9    -4
> >>   -4    -1    -7     0    -8    -3    -4    -3    -1    -2
> >>   -5    -6    -9     2    -6     0    -8    -5     0    -9
> >>  -10     0    -4     4    -6   -11    -3     2   -12     1
> >>   -2    -6    -6    -3    -7    -7     0    -9    -1    -9
> >>   -1    -8    -4    -3   -11     1     0     1    -2    -4
> >>  -11    -1    -9    -9   -10    -1    -1    -9    -8    -6
> >>   -3    -4    -2    -4     1     0    -5    -2    -1     4
> >>   -9    -1    -4     1    -8   -11     0   -10    -4    -9
> >>   -5    -2    -2     4     0    -7    -4     1    -2     1
> >>   -4    -1    -5    -9    -9    -5   -10    -4   -12    -8
> >>   -4    -9    -7    -5    -3     3    -5   -12    -3     0
> >>   -8    -4    -9    -5    -6     0     0    -1    -2    -6
> >>   -8   -12    -3     1     2    -6    -1    -7   -10    -9
> >>   -6    -8     0    -2    -3    -7    -3    -2     6    -3
> >>  -12     0     0    -7    -9    -6    -1    -5    -2    -9
> >>   -6     1     0    -3    -1    -1    -2     2    -2    -3
> >>   -7    -9    -1    -8    -4    -2     5    -5    -3   -10
> >>    2     6    -3     0    -6    -8    -9    -1    -1    -7
> >>   -8    -1    -1    -4    -4     7    -2   -10   -11    -6
> >>    2     2    -4     3    -2    -1    -3     0     0    -7
> >>   -1    -3    -4    -9    -5    -2    -5    -7    -5    -3
> >>    0     1    -3     5    -3    -4    -1    -6    -9    -4
> >>   -6     0    -9    -6     0    -2     4    -2    -4   -10
> >>   -9    -4    -3    -9    -3    -6    -9    -8    -4     1
> >>   -5    -6    -5     1     0    -2    -3    -6    -5    -9
> >>   -4     1    -5    -4    -2    -4    -8    -3    -4     0
> >>    2    -5    -3    -7    -1    -2    -1    -9    -6   -15
> >>  -10    -6    -2    -7    -1    -3     3    -6    -6    -9
> >>  -10    -8    -9    -2    -3     0    -6     3    -4     4
> >>    3     3     8    -2    -2    -4     0    -3    -9    -3
> >>   -6    -4     3     2     1     1    -3    -7   -15    -1
> >>   -4    -6    -1    -2    -1   -12     2    -1    -4     1
> >>    2     3    -5     3    -3    -7    -6    -5     0     1
> >>    5   -13    -8     0    -5     2     0    -5    -3     6
> >>   -4    -9    -2    -8    -1    -9   -10    -1   -10    -6
> >>  -10    -4   -10    -9    -2     1     0    -4    -3     0
> >>    1    -3    -1    -4    -7   -10   -13    -8    -1    -1
> >>
> >> 0x1
> >> ddb{1}> machine ddbcpu 2
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{2}> call tsc_debug
> >> -8242 -6496 -50265    -1    -2    -2     1   109    -2    -3
> >>    3     3    -8    -3    -4     4     0    -8    -7    -5
> >>   -5     3    -7    -5    -4    -9    -7    -3     0     2
> >>   -5     2     1     3    -2     3     8    -6   -11     8
> >>    8    -5     1     5     0    -8     2     0     6     3
> >>  -14     7    -2    -1    -3     1    -5    -6     0     5
> >>    1    -1     0    -2    -5     2    -3     0    -3    -1
> >>   -5   -12    -4    -4    -9     4     0    -2    -2    -8
> >>    2     5     7    -2     0    -6   110    -8    -8    -4
> >>    0     5    -7    -3    -5    -4     9    -2    -2     3
> >>   -8    -2    -5     4    -3   217     0    -7    -7    -6
> >>    7   -10    -9    -3     3   -14     3    -5     5   -12
> >>    5    -8   -17    -5   286    -6     0    -3    -4    -2
> >>    1    -5    -5    -9    -6    -7    -3    -5     6     0
> >>    1    -1    -4    -2     2    -2    -2    -2    -5     2
> >>   12     3   -18    -8     6    -4    -3     6     2    -3
> >>   -7    -3     4    -5   -23     9     6     6    -6   -11
> >>    9    -1   -10 50505    -1     2     6   -11     2    -2
> >>   -4    -6   201     1     3     4    -9     6     0     1
> >>   -4     0    -1     3     4     1     6    -7    -5     4
> >>  -14    -3    -1    -8     5     6    -5     3    -7    -9
> >>   -7     1    -2     5    -2     0    -2    -9     4    -3
> >>   98    -5     7    -7     3     0    -5     0     9     2
> >>   -7    -5    -3   -12   -11   -11     6    -5    -7    -6
> >>  210     5    -3    -5    -4   -11    -6     0    -5    -9
> >>    3     0    -9     5     1     0     0    -7    -5   210
> >>    1    -6   -17    -8     0     1    -2    -8     1    -7
> >>   10    -8    -8    -9     4    -2    -4    -3   204     5
> >>   -9   -15     3    -1    -5     0   -12    -1     0     1
> >>   -1    -6    -5    -9    -1     4    -1    -1     0     1
> >>    4    -8   -13     1     0    -5    -6     0    -4     0
> >>    6    -2    -4    -8    -7   -12    -2    -2    -6    -8
> >>   -5     0    -8    -7   -11     0     6    -1    -8    -3
> >>    2     6    -6     0   -10   285    -1    -2    -8    -6
> >>   -6    -1    -5    -6     0    -5    -8    -5     1    -8
> >>   -1     1     4    -3    -4   188    -3    -3   -10     5
> >>    6     0    -7     4     1     2     0    -2    -2     2
> >>   -3    -1    -9   -12   201    -1    -7    -1     8     0
> >>    0     0    -5     0     7   -18     5     1    -2    15
> >>    5    -6     4   -10   272     0    -4    -3     2   -10
> >>   -7     7     3     4     1     6    -9    -8   -12    -2
> >>   -2    -2    -6     8     3    97    -1    -7     5     1
> >>   -7     4    -6    -9    -7    -2     0    -6     8   -13
> >>   -1     3    -9    -4   233    -2     0     0    -5    -5
> >>   -2     0     0     5    -7     6   -14     4    -6     5
> >>    4     3     3    -3   103    -2    -6   -11     2    -2
> >>   -3    -8     0    -1     1     0    -6     1     1   -10
> >>   -1     0    -1     0     0    -1    -6    -4    -4    -3
> >>    3     0    -5     0     2    -2     6     0   -13     3
> >>    1   -16    -2   -12   206    -4    -6    -5    -3     2
> >>   -8    -2    -9    -2     9     7    -1     1     3    -5
> >>    6     6    10     0    99    -2    -1    -2     0    -6
> >>   -8    -9     0     3     0   -11    -6     1    -4     9
> >>  -11   -11     2    -1   276    -7     2     4    -4    -3
> >>    4     2   -12     8     1    -4     0    -1    -1    -1
> >>    5    -8     0     6   232    -4     2    -2   -11     2
> >>   -6     0     4     6    -7     8    -6     3    -3    -9
> >>    0     1    -7     2    -3    -5    -3    -2    -8    -4
> >>  -14    -2     0     4    -4    -3    -4     9     3    -1
> >>   -5    -8     1     0   210     0    -6    -4     2     2
> >>    0    -3    -4     0     4   -12    10    -2    -3    -1
> >>    3     7    -3     6    -9   190     4     6    -2    11
> >>  -10    -2    -9     3     2     4    -4    -7    -9    -2
> >>  -10    12     1    -7     3    -1     0    -1   -11     6
> >>    6     0    -8     1     4     2    -2    -5     0     0
> >>    5    -5    -3    -5   205    -1    -3    -1     0    -4
> >>   -3    -7     3     0    -7    -5    -4    -3     7     1
> >>  -14    -2     0   -14     2     0     7    11    -2    -7
> >>    6    -6    -3    -4     0     4    -3    -4    -3    -7
> >>   -6     3    -4     0     4    -3    -6     3     4    -4
> >>   -6     7   -11     1   -10   -10   -12    -4    -3     6
> >>   -5    -6     5   212    -8     1    -4     3    -3    -8
> >>    0   -10     0     2     6    -3    -1   -13     1     6
> >>   -6     5    -4     0    -7    -4    -5    -6     1    -2
> >>    1   -10   -12    -3    -8     9   -11     0     1    -3
> >>   -1     1   186     2   -12     3    -4     0     0    -1
> >>   -5    -4     1    -1     4     5   -10     0    -4     1
> >>   -1    -6   270     0   -17     5     0     0    -4    -1
> >>    4     6     1     0    -6     6     5    -3     3    -2
> >>   -6    -7    18   -16     0     9     4     3    -1     6
> >>    4     1    -5     7   -11    -1    -6    -2     6    -2
> >>   -8   256    -5    -2     1    -1    -5    -3    -9     0
> >>   -1     3    -2   -11     4     3    -7    -3     3    -1
> >>   -5    -5     0    -4    -1    -3    -3     6    -3     3
> >>    3    -2   -11    -2    -3    11    -8     1     5    -7
> >>    5   -12    -3     8    -9    -5     7     5    -3     2
> >>   -7    -3    -6     2    -2    -1    -2    -9    -8    99
> >>    6    -2     9    -1    -4    -2     0    -2    -7    -5
> >>    0     1    -4    -8    -1    -2     2    -8     2   205
> >>   -3   -10    -1    -1    -2    -5     2     2     5    -2
> >>   -5    -6    -4     6     6    -6     4     1    -5     0
> >>   -7     3     1     0   -11    -7    -3     5    -5     5
> >>    1    -1     3    -5    -8     0    -1     0   183    -5
> >>    0     4    -1    -6   -11   -10     1   -18     3    -1
> >>   -5    -9    -2     2     2    -2     0    99    -7    -8
> >>   -1    -3    -5    -1    12    -3    -1     2     1     4
> >>    7     3   -14     2    -4     8    -9    -3    -8    -5
> >>    6    -6     5   -12     6    -1    -9    -4    -4     1
> >>   -6     0     0    -2    -3    -5    -9    -2    -9    -3
> >>    3   -16    -2    -1     0     9    -4     5    -6     5
> >>
> >> 0x1
> >> ddb{2}> machine ddbcpu 3
> >> Stopped at      x86_ipi_db+0x12:        leave
> >> ddb{3}> call tsc_debug
> >> -8336 -6457 -45527     0    -1     0    -2     4     0     5
> >>   -9    -6    -4    -4     6     4     0    -3    -4     5
> >>    3     6   -12    -1     1     1    -3     6    -4    -2
> >>   -2     2     4    -3     0    -1     3     0     1     3
> >>   -3     3    -1     4    -5    -2    -2    -9     6    -9
> >>    0     1    -2    -6     8    -4    -2    -2     6     1
> >>   -1     1    -6    -6     4    -5    -1     6    -1    -1
> >>    3     5     0    -6     5    -4    -2    -6    -3    -4
> >>   -5     2    -3    -3    -5    -3    -5 -5720     0     5
> >>   -1    -3     3    -2     4    -6     8   -16    -6    -3
> >>   -2     4     8    -3     3    -1     2    -8    -3   -19
> >>   -8     3    -7    -9    -6    -3     1    -3    -6     7
> >>    4     1     3     2    -4     7    -3     2     2    -4
> >>  -10    -8   -14    -2     2    -3     3    -2     3    -3
> >>    5     5    -6     9    -3   -12    -6     1   -10     7
> >>   -6     5    -4     1     6     3     2     2    -6    -1
> >>    6    -8    -5     7     3    -3    -4    -6     1    -5
> >>    4    -6     2     6    -6     3    -8    -5    -6     0
> >>   -5    -2   -13    -8     3     0   -17    -7    -9     1
> >>    6   -12     3     6     3    -3     4    -1    -7     0
> >>    2     0    -7   -10    -6     3     1     2   -19     4
> >>    1   -18     1    -3    -6   -14     4     6     3    -4
> >>   -7   -11    -1    -1     3     0     6     6    -8   -14
> >>    3    -2     6    -5     0     1     0    -7     0     4
> >>   -3   -16    -2    -4   -12    -4     6     0    -8    -4
> >>   -4    -4    -3     0    -6   -13   -10   -15    -6     2
> >>    0    -3     0    -8     4    -1    -1     5    -4    -1
> >>   -7     2     1     1     3    -3    -1   -18     6     8
> >>   -2     3    -6     0    -6    -2     2    -2    -7     1
> >>   -6   -13    -4    -2    -1    -6     6    -5    -9   -14
> >>    4     5    -4    -2    -9    -2    -2   -13     1   -18
> >>   -1     2    -5     6    -6    -7    -9    -6     1     6
> >>  -13    -4     3     0    -8    -6    -6   -10    -2    -9
> >>    5     2     4     1     6    -5    -8    -6     2    -4
> >>   -3    -5    -2    -6   -10     0     5    -2     8    -3
> >>    8   -11   -11    -7    -5   -13   -19    -5   -14    -3
> >>    3     2     1     3     6    -1    -9   -16     3    -7
> >>    1    -3    -5     0    -7     6     4    -2    -2     4
> >>    4    -6    -6     8    -6    -7    -5    -2     0     4
> >>   -1     3     1     3    -6    -2    -4    -9     1     0
> >>   -2     3     2   -16     4   -15   -11    -3     8     0
> >>   -6    -3   -18    -7    -8     8    -8     6    -7    -4
> >>   -8    -7    -9     0    -2     3     7    -2     1    -6
> >>    2    -6     8    -1   -12    -8    -4     3   -13    -2
> >>  -11     1    -2    -7    -3     0   -16    -8     4    -9
> >>  -15    -8    -9     8     5     7    -9     5   -10    10
> >>    1     6    -6     3    -6    -4     5     0    -3    -7
> >>   -1    -4   -10    -2     0   -11     8    -8    -3   -11
> >>    4    -6     1    -8    -1    -6     3    -1   -12    -7
> >>   11    -1     0    -4   -13     0   -10     7    -2     0
> >>   -6     4     0   -12    -9     6    -2    -5    -5    -7
> >>   -1    -9    -5     3     3    -7     3   -16    -2   -10
> >>    0    -2     6     4     4    -6    -9    -3    -6     4
> >>   -5    -1     7   -11   -21    -9    -3    -1     4   -13
> >>   -7     0    -3     0   -10    -7     8    -9     7     6
> >>   -9   -14     5    -9    -7    -8    11    -6     1    -3
> >>   -9     7     5     0   -12    -3    -4   -18     0     4
> >>   -1     8    -8     9     4     0     5   -10   -10    -8
> >>    1     8    -1     4     1    -3    -6    -6    -5    -1
> >>  -12    -6    -8   -14   -10     2    -1     9     0    -9
> >>    0    -8    -6    -5     1   -14    -6     5     1    -7
> >>    3    -9     6    -4     3     0   -21     8     7     5
> >>    0     0    -2     2     1    -7   -11     1    -7     2
> >>   -3    -2     9     1     3    -1    -8     0   -18    -7
> >>   -3     6     1     1    -8    -5    -1     2    -4    -6
> >>  -10    -5   -20   -18     5    -7     2     5    -3    -3
> >>   -6    -3    -3     4    -7    -2    -4     2    -6   -11
> >>   -4   -15    -6    -5     2    -1   -10    -4    -6    -3
> >>   -1     0    -6   -10     5    -5     2     2    -8     6
> >>   -1     5    -5    -9    12     0    -6   -17     2    -4
> >>    4   -11    -1    -8     0    -3   -11    -8     0    -6
> >>    2    -1    -4    -9   -12     3     6   -10    -2    -6
> >>  -13     1   -10     1   -13     5    -4     3   -11     4
> >>   -8     4     4   -17     6   -12     3   -13     0    -3
> >>   -7     4   -11    -1     1     3     5    -8    -3     0
> >>    4    -8    -1     4   -13     2    -1     2     5    -6
> >>   -6     4    -4    -5     1    -4     4     5    -2   -10
> >>   -9     0   -14    -2    -7     1    -1   -14   -15     8
> >>   -3     9    -3    -4    -8     0     2     5   -11   -13
> >>   -5   -13    -3    -7     9    -3    -7    -6    -9    -7
> >>   -8   -10    -1     6     2     2     3   -13    -6    -5
> >>    3   -13     2    -6     4     1     0    -9     4   -11
> >>  -15     0     1   -12    -1     2   -11     2    -1   -13
> >>  -13    -5     3     9   -11    -8     2   -12    -2    -5
> >>    0    -3    -2     1    -6    -2    -1     0    -3     2
> >>    0    -9    -4     1    -2     3    -6     0    -4    -6
> >>    2     1   -14    -4    -7   -23    -1    -4    -8    -8
> >>    2    -4     1     6   -10     5    -9    -6     6    -1
> >>    4    -2    -9     0    -5    -1     8     0     3     4
> >>   -4    -7    -4     2   -15    -6     2     1    -6    -4
> >>   -3    -3     3    -7    -2    -9     9    -2    -9    -4
> >>    3    -8   -10    -3    -4     1    -4   -10    -1     3
> >>   -1   -15     5     0     2    -6     4     6    -2     0
> >>    2     5     3   -12    -5    -5    -2    -4    -4     5
> >>   -8    -4    -6   -16    -1     4    -4    -1    -8     0
> >>    6   -10     5     0     1    -3    -9     8     0   -11
> >>   -3   -13    -1     3     3    -6    -6    -2     3     5
> >>    4    -6    12   -17     1    -5    -5    -2     1    -3
> >>   -7     5    -4     8    -5    -1    -5     8   -12     4
> >>   -6     2    -5    -9     2    -2     5     3    -5    -8
> >>
> >> 0x1
> >> ddb{3}>
> >> ----
> >>
> >> I seems that we can fix the problem by comparing TSC more times and
> >> choosing the minimum value.
> >>
> >> The diff also includes a fix for the problem (use the minimum value of
> >> 1000 samplings).  With the diff, I tried "monotime" test program over
> >> 100 times, it didn't find any clock going back.
> >>
> >>
> >> dmesg
> >> ----
> >> OpenBSD 6.8 (GENERIC.MP) #5: Mon Feb 22 04:36:10 MST 2021
> >>    [hidden email]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> >> real mem = 6425083904 (6127MB)
> >> avail mem = 6215311360 (5927MB)
> >> random: good seed from bootblocks
> >> mpath0 at root
> >> scsibus0 at mpath0: 256 targets
> >> mainbus0 at root
> >> bios0 at mainbus0: SMBIOS rev. 2.7 @ 0xbfbb401f (98 entries)
> >> bios0: vendor VMware, Inc. version "VMW71.00V.0.B64.1506250318" date 06/25/2015
> >> bios0: VMware, Inc. VMware7,1
> >> acpi0 at bios0: ACPI 4.0
> >> acpi0: sleep states S0 S1 S4 S5
> >> acpi0: tables DSDT SRAT FACP APIC MCFG HPET WAET
> >> acpi0: wakeup devices PCI0(S3) USB_(S1) P2P0(S3) S1F0(S3) S2F0(S3) S3F0(S3) S4F0(S3) S5F0(S3) S6F0(S3) S7F0(S3) S8F0(S3) S9F0(S3) S10F(S3) S11F(S3) S12F(S3) S13F(S3) [...]
> >> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> >> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> >> cpu0 at mainbus0: apid 0 (boot processor)
> >> cpu0: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.42 MHz, 06-3f-02
> >> cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu0: 256KB 64b/line 8-way L2 cache
> >> cpu0: smt 0, core 0, package 0
> >> mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
> >> cpu0: apic clock running at 65MHz
> >> cpu1 at mainbus0: apid 1 (application processor)
> >> cpu1: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> >> cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu1: 256KB 64b/line 8-way L2 cache
> >> cpu1: disabling user TSC (skew=-5310)
> >> cpu1: smt 0, core 1, package 0
> >> cpu2 at mainbus0: apid 2 (application processor)
> >> cpu2: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.28 MHz, 06-3f-02
> >> cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu2: 256KB 64b/line 8-way L2 cache
> >> cpu2: disabling user TSC (skew=-5335)
> >> cpu2: smt 0, core 2, package 0
> >> cpu3 at mainbus0: apid 3 (application processor)
> >> cpu3: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz, 2397.29 MHz, 06-3f-02
> >> cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,MMX,FXSR,SSE,SSE2,SS,HTT,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,HV,NXE,RDTSCP,LONG,LAHF,PERF,ITSC,SENSOR,ARAT,MELTDOWN
> >> cpu3: 256KB 64b/line 8-way L2 cache
> >> cpu3: disabling user TSC (skew=-7386)
> >> cpu3: smt 0, core 3, package 0
> >> ioapic0 at mainbus0: apid 4 pa 0xfec00000, version 11, 24 pins, remapped
> >> acpimcfg0 at acpi0
> >> acpimcfg0: addr 0xe0000000, bus 0-127
> >> acpihpet0 at acpi0: 14318179 Hz
> >> acpiprt0 at acpi0: bus 0 (PCI0)
> >> acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
> >> acpicmos0 at acpi0
> >> "PNP0A05" at acpi0 not configured
> >> acpiac0 at acpi0: AC unit online
> >> acpicpu0 at acpi0: C1(@1 halt!)
> >> acpicpu1 at acpi0: C1(@1 halt!)
> >> acpicpu2 at acpi0: C1(@1 halt!)
> >> acpicpu3 at acpi0: C1(@1 halt!)
> >> cpu0: using Broadwell MDS workaround
> >> pvbus0 at mainbus0: VMware
> >> vmt0 at pvbus0
> >> pci0 at mainbus0 bus 0
> >> 0:16:0: rom address conflict 0xffffc000/0x4000
> >> pchb0 at pci0 dev 0 function 0 "Intel 82443BX AGP" rev 0x01
> >> ppb0 at pci0 dev 1 function 0 "Intel 82443BX AGP" rev 0x01
> >> pci1 at ppb0 bus 1
> >> pcib0 at pci0 dev 7 function 0 "Intel 82371AB PIIX4 ISA" rev 0x08
> >> pciide0 at pci0 dev 7 function 1 "Intel 82371AB IDE" rev 0x01: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
> >> pciide0: channel 0 disabled (no drives)
> >> atapiscsi0 at pciide0 channel 1 drive 0
> >> scsibus1 at atapiscsi0: 2 targets
> >> cd0 at scsibus1 targ 0 lun 0: <NECVMWar, VMware IDE CDR10, 1.00> removable
> >> cd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 2
> >> piixpm0 at pci0 dev 7 function 3 "Intel 82371AB Power" rev 0x08: SMBus disabled
> >> "VMware VMCI" rev 0x10 at pci0 dev 7 function 7 not configured
> >> "VMware SVGA II" rev 0x00 at pci0 dev 15 function 0 not configured
> >> mpi0 at pci0 dev 16 function 0 "Symbios Logic 53c1030" rev 0x01: apic 4 int 17
> >> mpi0: 0, firmware 1.3.41.32
> >> scsibus2 at mpi0: 16 targets, initiator 7
> >> sd0 at scsibus2 targ 0 lun 0: <VMware, Virtual disk, 1.0>
> >> sd0: 16384MB, 512 bytes/sector, 33554432 sectors
> >> sd1 at scsibus2 targ 1 lun 0: <VMware, Virtual disk, 1.0>
> >> sd1: 81920MB, 512 bytes/sector, 167772160 sectors
> >> mpi0: target 0 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> >> mpi0: target 1 Sync at 160MHz width 16bit offset 127 QAS 1 DT 1 IU 1
> >> ppb1 at pci0 dev 17 function 0 "VMware PCI" rev 0x02
> >> pci2 at ppb1 bus 2
> >> ppb2 at pci0 dev 21 function 0 "VMware PCIE" rev 0x01: msi
> >> pci3 at ppb2 bus 3
> >> vmx0 at pci3 dev 0 function 0 "VMware VMXNET3" rev 0x01: msix, 4 queues, address 00:0c:29:7d:49:9c
> >> ppb3 at pci0 dev 21 function 1 "VMware PCIE" rev 0x01: msi
> >> pci4 at ppb3 bus 4
> >> ppb4 at pci0 dev 21 function 2 "VMware PCIE" rev 0x01: msi
> >> pci5 at ppb4 bus 5
> >> ppb5 at pci0 dev 21 function 3 "VMware PCIE" rev 0x01: msi
> >> pci6 at ppb5 bus 6
> >> ppb6 at pci0 dev 21 function 4 "VMware PCIE" rev 0x01: msi
> >> pci7 at ppb6 bus 7
> >> ppb7 at pci0 dev 21 function 5 "VMware PCIE" rev 0x01: msi
> >> pci8 at ppb7 bus 8
> >> ppb8 at pci0 dev 21 function 6 "VMware PCIE" rev 0x01: msi
> >> pci9 at ppb8 bus 9
> >> ppb9 at pci0 dev 21 function 7 "VMware PCIE" rev 0x01: msi
> >> pci10 at ppb9 bus 10
> >> ppb10 at pci0 dev 22 function 0 "VMware PCIE" rev 0x01: msi
> >> pci11 at ppb10 bus 11
> >> ppb11 at pci0 dev 22 function 1 "VMware PCIE" rev 0x01: msi
> >> pci12 at ppb11 bus 12
> >> ppb12 at pci0 dev 22 function 2 "VMware PCIE" rev 0x01: msi
> >> pci13 at ppb12 bus 13
> >> ppb13 at pci0 dev 22 function 3 "VMware PCIE" rev 0x01: msi
> >> pci14 at ppb13 bus 14
> >> ppb14 at pci0 dev 22 function 4 "VMware PCIE" rev 0x01: msi
> >> pci15 at ppb14 bus 15
> >> ppb15 at pci0 dev 22 function 5 "VMware PCIE" rev 0x01: msi
> >> pci16 at ppb15 bus 16
> >> ppb16 at pci0 dev 22 function 6 "VMware PCIE" rev 0x01: msi
> >> pci17 at ppb16 bus 17
> >> ppb17 at pci0 dev 22 function 7 "VMware PCIE" rev 0x01: msi
> >> pci18 at ppb17 bus 18
> >> ppb18 at pci0 dev 23 function 0 "VMware PCIE" rev 0x01: msi
> >> pci19 at ppb18 bus 19
> >> ppb19 at pci0 dev 23 function 1 "VMware PCIE" rev 0x01: msi
> >> pci20 at ppb19 bus 20
> >> ppb20 at pci0 dev 23 function 2 "VMware PCIE" rev 0x01: msi
> >> pci21 at ppb20 bus 21
> >> ppb21 at pci0 dev 23 function 3 "VMware PCIE" rev 0x01: msi
> >> pci22 at ppb21 bus 22
> >> ppb22 at pci0 dev 23 function 4 "VMware PCIE" rev 0x01: msi
> >> pci23 at ppb22 bus 23
> >> ppb23 at pci0 dev 23 function 5 "VMware PCIE" rev 0x01: msi
> >> pci24 at ppb23 bus 24
> >> ppb24 at pci0 dev 23 function 6 "VMware PCIE" rev 0x01: msi
> >> pci25 at ppb24 bus 25
> >> ppb25 at pci0 dev 23 function 7 "VMware PCIE" rev 0x01: msi
> >> pci26 at ppb25 bus 26
> >> ppb26 at pci0 dev 24 function 0 "VMware PCIE" rev 0x01: msi
> >> pci27 at ppb26 bus 27
> >> ppb27 at pci0 dev 24 function 1 "VMware PCIE" rev 0x01: msi
> >> pci28 at ppb27 bus 28
> >> ppb28 at pci0 dev 24 function 2 "VMware PCIE" rev 0x01: msi
> >> pci29 at ppb28 bus 29
> >> ppb29 at pci0 dev 24 function 3 "VMware PCIE" rev 0x01: msi
> >> pci30 at ppb29 bus 30
> >> ppb30 at pci0 dev 24 function 4 "VMware PCIE" rev 0x01: msi
> >> pci31 at ppb30 bus 31
> >> ppb31 at pci0 dev 24 function 5 "VMware PCIE" rev 0x01: msi
> >> pci32 at ppb31 bus 32
> >> ppb32 at pci0 dev 24 function 6 "VMware PCIE" rev 0x01: msi
> >> pci33 at ppb32 bus 33
> >> ppb33 at pci0 dev 24 function 7 "VMware PCIE" rev 0x01: msi
> >> pci34 at ppb33 bus 34
> >> isa0 at pcib0
> >> isadma0 at isa0
> >> fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
> >> com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
> >> com0: console
> >> com1 at isa0 port 0x2f8/8 irq 3: ns16550a, 16 byte fifo
> >> pckbc0 at isa0 port 0x60/5 irq 1 irq 12
> >> pckbd0 at pckbc0 (kbd slot)
> >> wskbd0 at pckbd0 mux 1
> >> pms0 at pckbc0 (aux slot)
> >> wsmouse0 at pms0 mux 0
> >> pcppi0 at isa0 port 0x61
> >> spkr0 at pcppi0
> >> efifb0 at mainbus0: 1152x864, 32bpp
> >> wsdisplay0 at efifb0 mux 1
> >> wskbd0: connecting to wsdisplay0
> >> wsdisplay0: screen 0-5 added (std, vt100 emulation)
> >> vscsi0 at root
> >> scsibus3 at vscsi0: 256 targets
> >> softraid0 at root
> >> scsibus4 at softraid0: 256 targets
> >> root on sd0a (a5bd0d220920df21.a) swap on sd0b dump on sd0b
> >> ----
> >>
> >> This happens on 2 ESXi hosts at least
> >>
> >> - 1
> >>  - ESXi 6.0.0, 3029758
> >>  - Xeon E5-2620 x 2
> >> - 2
> >>  - ESXi 6.7.0 Update 3 (Build 14320388)
> >>  - Xeon Silver 4208 x 2
> >>
> >
> > This broke the monotonic clock on my Ryzen 5 2500U.
> >
> > Note: userland TSC has never worked on this device.
> >
> > $ ./monotime
> > 320678 Starting
> > 351995 Starting
> > 387215 Starting
> > 505501 Starting
> > 387215 Stopped
> > 505501 Back 213.019672364 => 212.599096325
> > 505501 Stopped
> > 351995 Stopped
> > 320678 Stopped
>
> Which diff did you apply?  Yasuoka provided two diffs.
>
> In any case, ignore this diff:
>
> > diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> > index 238a5a068e1..3b951a8b5a3 100644
> > --- a/sys/arch/amd64/amd64/tsc.c
> > +++ b/sys/arch/amd64/amd64/tsc.c
> > @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> > u_int
> > tsc_get_timecount(struct timecounter *tc)
> > {
> > - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > + return rdtsc_lfence();
> > }
> >
> > void
>
>
> We don't want to discard the skews, that's wrong.
>
> The reason it "fixes" Yasuoka's problem is because the real skews
> on the ESXi VMs in question are probably close to zero but our
> synchronization algorithm is picking huge (wrong) skews due to
> some other variable interfering with our measurement.

Right.  If a VM exit happens while we're doing our measurement, you'll
see a significant delay.  And a guest OS can't prevent those from
happening.  But even on real hardware SMM mode may interfere with our
measurement.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
In reply to this post by Josh Rickmar
On Thu, Mar 25, 2021 at 02:33:43PM -0400, Josh Rickmar wrote:

> On Thu, Mar 25, 2021 at 01:18:04PM -0500, Scott Cheloha wrote:
> > > On Mar 24, 2021, at 8:29 AM, Josh Rickmar <[hidden email]> wrote:
> > >
> > > [...]
> >
> > Which diff did you apply?  Yasuoka provided two diffs.
> >
> > In any case, ignore this diff:
> >
> > > diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> > > index 238a5a068e1..3b951a8b5a3 100644
> > > --- a/sys/arch/amd64/amd64/tsc.c
> > > +++ b/sys/arch/amd64/amd64/tsc.c
> > > @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> > > u_int
> > > tsc_get_timecount(struct timecounter *tc)
> > > {
> > > - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > > + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> > > + return rdtsc_lfence();
> > > }
> > >
> > > void
> >
> >
> > We don't want to discard the skews, that's wrong.
> >
> > The reason it "fixes" Yasuoka's problem is because the real skews
> > on the ESXi VMs in question are probably close to zero but our
> > synchronization algorithm is picking huge (wrong) skews due to
> > some other variable interfering with our measurement.
>
> I had both applied.  As I understood it, the first patch discarding
> the skews was a proposed fix and the second was only debug code to
> dump the skews.  (Unfortunately, I don't know a way to gather this
> information from my device (thinkpad E485), as I don't believe I can
> attach to the serial console to capture the ddb output.)

Given that userland TSC doesn't work on your machine I'm curious what
your skews look like as measured by Yasuoka's patch.  If you want to
gather the data and you don't have serial console access...

First enable kern.allowkmem to permit pstat(8) to extract the data
from kernel memory.  You'll need to edit /etc/rc.securelevel and
reboot.

Next, run this shell script to read the skews out of kernel memory and
write them out to a file, one file per CPU.  The script assumes
doas.conf(5) is written to allow passwordless root access.  If you
don't have this then you can edit the script to remove doas and just
run the script as root, though I do not recommend this.

Last, disable kern.allowkmem and reboot.

Here's the script:

---

#! /bin/sh

set -e

# Make sure this is equal to TSC_SYNC_NTIMES!
nsamples=1000

# Each sample is a signed 32-bit integer (4 bytes).
samplesz=4

# Find the starting address of the skew array in memory.
base=$(doas pstat -d lld tsc_difs | tr -d ':' | cut -d ' ' -f 3)

for cpu in $(jot $(sysctl -n hw.ncpu) 0); do
        # Ignore the BSP.
        if [ $cpu -eq 0 ]; then
                continue
        fi
        # Compute the start of the given CPU's samples in the array.
        start=$((base + cpu * nsamples * samplesz))
        end=$((start + nsamples * samplesz))
        i=$start
        # Print each sample to the file ./cpuN-skew
        out="./cpu$cpu-skew"
        rm -f $out
        while [ $i -lt $end ]; do
                doas pstat -d d $(printf "0x%x" $i) | cut -d ' ' -f 4 >> $out
                i=$((i + samplesz))
        done
done

---

My laptop has eight logical CPUs.  I get this:

$ sh script.sh
$ wc -l cpu*
    1000 cpu1-skew
    1000 cpu2-skew
    1000 cpu3-skew
    1000 cpu4-skew
    1000 cpu5-skew
    1000 cpu6-skew
    1000 cpu7-skew
    7000 total

ministat yields this:

x cpu1-skew
+ cpu2-skew
* cpu3-skew
% cpu4-skew
# cpu5-skew
@ cpu6-skew
O cpu7-skew
    N           Min           Max        Median           Avg        Stddev
x 1000           -12             7             0        -0.701       2.93568
+ 1000           -12             7             0        -0.476     2.8927136
* 1000           -12             3            -3        -3.251     1.8898599
% 1000           -20            15            -3        -4.235     6.0109822
# 1000           -23             9            -1        -1.482      3.630545
@ 1000           -18             8             1        -0.563     4.7706173
O 1000           -19             6            -6        -5.527     3.6647922

Feel free to share your raw data.

> Clock doesn't go backwards with only the second diff.

Good.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
On Thu, Mar 25, 2021 at 05:28:54PM -0500, Scott Cheloha wrote:
> Feel free to share your raw data.

Attached.

e485skews.tgz (4K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
On Thu, Mar 25, 2021 at 07:24:23PM -0400, Josh Rickmar wrote:
> On Thu, Mar 25, 2021 at 05:28:54PM -0500, Scott Cheloha wrote:
> > Feel free to share your raw data.
>
> Attached.

Hmmm, interesting stuff.

$ ministat -q cpu*                
x cpu1-skew
+ cpu2-skew
* cpu3-skew
% cpu4-skew
# cpu5-skew
@ cpu6-skew
O cpu7-skew
    N           Min           Max        Median           Avg        Stddev
x 1000 1.4605543e+09 1.4605543e+09 1.4605543e+09 1.4605543e+09          -nan
+ 1000 1.4605543e+09 1.4605544e+09 1.4605544e+09 1.4605544e+09          -nan
No difference proven at 95.0% confidence
* 1000 1.4605543e+09 1.4605543e+09 1.4605543e+09 1.4605543e+09     32.397926
No difference proven at 95.0% confidence
% 1000 1.4605543e+09 1.4605544e+09 1.4605544e+09 1.4605544e+09          -nan
No difference proven at 95.0% confidence
# 1000 1.4605543e+09 1.4605543e+09 1.4605543e+09 1.4605543e+09     45.817587
No difference proven at 95.0% confidence
@ 1000 1.4605543e+09 1.4605544e+09 1.4605544e+09 1.4605544e+09     129.59171
Difference at 95.0% confidence
        60.42 +/- 6.73519
        4.13679e-06% +/- 4.61139e-07%
        (Student's t, pooled s = 76.8384)
O 1000 1.4605543e+09 1.4605543e+09 1.4605543e+09 1.4605543e+09     104.98128
Difference at 95.0% confidence
        5.71 +/- 4.81512
        3.90947e-07% +/- 3.29678e-07%
        (Student's t, pooled s = 54.9334)

I wish ministat wasn't NaNing the stddev but I don't have the time
to work around it right now.

Anyway, every AP TSC is off from the BSP by about ~1.46 billion
cycles.  All skews fall between 1460554280 and 1460554380.  So, pretty
consistent, but consistently off.

You definitely won't be able to use the TSC for userspace timecounting
until someone decides how to map the skews into userspace.

Or maybe if someone will figure out why the TSCs on machines like
yours are not synchronized at boot and devises a way to prevent it
from happening at all.

Thanks for the data!

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Stefmorino
In reply to this post by YASUOKA Masahiko-3
> Feel free to share your raw data.

Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

YASUOKA Masahiko-3
In reply to this post by Mark Kettenis
On Thu, 25 Mar 2021 19:41:35 +0100 (CET)
Mark Kettenis <[hidden email]> wrote:

>> From: Scott Cheloha <[hidden email]>
>> Date: Thu, 25 Mar 2021 13:18:04 -0500
>> > On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:
>> Which diff did you apply?  Yasuoka provided two diffs.
>>
>> In any case, ignore this diff:
>>
>> > diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
>> > index 238a5a068e1..3b951a8b5a3 100644
>> > --- a/sys/arch/amd64/amd64/tsc.c
>> > +++ b/sys/arch/amd64/amd64/tsc.c
>> > @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
>> > u_int
>> > tsc_get_timecount(struct timecounter *tc)
>> > {
>> > - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> > + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
>> > + return rdtsc_lfence();
>> > }
>> >
>> > void
>>
>>
>> We don't want to discard the skews, that's wrong.

I'm sorry for the confusion.

>> The reason it "fixes" Yasuoka's problem is because the real skews
>> on the ESXi VMs in question are probably close to zero but our
>> synchronization algorithm is picking huge (wrong) skews due to
>> some other variable interfering with our measurement.
>
> Right.  If a VM exit happens while we're doing our measurement, you'll
> see a significant delay.  And a guest OS can't prevent those from
> happening.  But even on real hardware SMM mode may interfere with our
> measurement.

For machines like the ESXi VMs, the measurement seems to have to
exclude such delayed values as outliers.  I think taking a lot of
samples and choice the minimum is a good enough way for the purpose.

I updated the diff.

- delete lines for debug
- make tsc quality lower if skew is not good enough
- reduce difference from NetBSD

comment? ok?

Index: sys/arch/amd64//amd64/tsc.c
===================================================================
RCS file: /disk/cvs/openbsd/src/sys/arch/amd64/amd64/tsc.c,v
retrieving revision 1.23
diff -u -p -r1.23 tsc.c
--- sys/arch/amd64//amd64/tsc.c 23 Feb 2021 04:44:30 -0000 1.23
+++ sys/arch/amd64//amd64/tsc.c 29 Mar 2021 04:18:31 -0000
@@ -38,6 +38,7 @@ int tsc_is_invariant;
 
 #define TSC_DRIFT_MAX 250
 #define TSC_SKEW_MAX 100
+#define TSC_SYNC_ROUNDS 1000
 int64_t tsc_drift_observed;
 
 volatile int64_t tsc_sync_val;
@@ -235,6 +236,7 @@ tsc_timecounter_init(struct cpu_info *ci
  printf("%s: disabling user TSC (skew=%lld)\n",
     ci->ci_dev->dv_xname, (long long)ci->ci_tsc_skew);
  tsc_timecounter.tc_user = 0;
+ tsc_timecounter.tc_quality = -1000;
  }
 
  if (!(ci->ci_flags & CPUF_PRIMARY) ||
@@ -314,13 +316,19 @@ tsc_read_bp(struct cpu_info *ci, uint64_
 void
 tsc_sync_bp(struct cpu_info *ci)
 {
+ int i, val, diff;
  uint64_t bptsc, aptsc;
 
- tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
- tsc_read_bp(ci, &bptsc, &aptsc);
+ val = INT_MAX;
+ for (i = 0; i < TSC_SYNC_ROUNDS; i++) {
+ tsc_read_bp(ci, &bptsc, &aptsc);
+ diff = bptsc - aptsc;
+ if (abs(diff) < abs(val))
+ val = diff;
+ }
 
  /* Compute final value to adjust for skew. */
- ci->ci_tsc_skew = bptsc - aptsc;
+ ci->ci_tsc_skew = val;
 }
 
 /*
@@ -351,8 +359,10 @@ tsc_post_ap(struct cpu_info *ci)
 void
 tsc_sync_ap(struct cpu_info *ci)
 {
- tsc_post_ap(ci);
- tsc_post_ap(ci);
+ int i;
+
+ for (i = 0; i < TSC_SYNC_ROUNDS; i++)
+ tsc_post_ap(ci);
 }
 
 void

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
In reply to this post by Stefmorino
On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > Feel free to share your raw data.
>
> Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz

Thanks!

TL;DR:

Two things:

1. Could you check whether Linux will use the TSC as a clocksource on
   this machine?  The dmesg output on any given distribution should
   contain lines about the TSC.

   Feel free to use my easy five-step method.  You don't even need to
   install Linux, we just need to boot installation media and look at
   the dmesg:

   A. Grab the latest Alpine Linux ISO:

        $ ftp https://dl-cdn.alpinelinux.org/alpine/v3.13/releases/x86_64/alpine-standard-3.13.4-x86_64.iso

   B. Write the ISO to a USB key to create your bootable installation media.

      Achtung!  Danger!  Don't wipe out the wrong disk!  Change /dev/sdNc
      to match the special device for your USB stick!

        # dd if=alpine-standard-3.13.4-x86_64.iso of=/dev/sdNc bs=1m

   C. Reboot.

        # shutdown -r now

   D. Boot from the USB stick.  How you do this varies by device.  Log in as
      root.  The Alpine installation ramdisk has no root password.

   E. Examine the Linux dmesg for lines about the TSC, clocksources:

        # dmesg | egrep -i 'tsc|clocksource'

2. Second, is there a more recent BIOS revision for this machine?
   Perhaps (assuming this is in fact a BIOS problem) Lenovo is aware
   of it and has fixed it.  This is unlikely but worth a look.

Long version:

I think two points form a pattern.  Bear with me.

Both you and Josh Rickmar (CC'd) have Lenovo laptops with the same CPU
(AMD Ryzen 5 2500U) and the same BIOS (LENOVO version "R0UET78W (1.58
)" date 11/17/2020).

Looking at the data here, both machines exhibit the same problem with
the TSC: the APs are all nearly synchronized outside of small
measurement errors while the BSP is way off.

This makes me wonder whether this is a firmware/BIOS bug.  Perhaps the
BIOS is fussing with the TSC on CPU0 before we boot.  Is there a new
BIOS revision available from Lenovo?

I'd also be interested to know if a recent Linux kernel would even use
the TSC on this laptop as a clocksource or if the kernel complains and
falls back to using the HPET.

There is a little chit-chat here and there about adding support to
OpenBSD for fixing the TSC skew during synchronization at boot/resume.
One way to do this is with the TSC_ADJUST MSR...

... but that won't work here in your case.  The CPU on this particular
laptop does not have TSC_ADJUST support, so if we wanted to correct
the TSC skew we'd have to use WRMSR to modify the TSC directly.

I'm uncertain about whether using WRMSR to reset the TSC on a given
logical processor is universally supported on all amd64 machines or
if it's a special feature a la the TSC_ADJUST MSR.

-Scott

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
On Thu, Apr 01, 2021 at 02:15:48PM -0500, Scott Cheloha wrote:

> On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > > Feel free to share your raw data.
> >
> > Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz
>
> Thanks!
>
> TL;DR:
>
> Two things:
>
> 1. Could you check whether Linux will use the TSC as a clocksource on
>    this machine?  The dmesg output on any given distribution should
>    contain lines about the TSC.
>
>    Feel free to use my easy five-step method.  You don't even need to
>    install Linux, we just need to boot installation media and look at
>    the dmesg:
>
>    A. Grab the latest Alpine Linux ISO:
>
> $ ftp https://dl-cdn.alpinelinux.org/alpine/v3.13/releases/x86_64/alpine-standard-3.13.4-x86_64.iso
>
>    B. Write the ISO to a USB key to create your bootable installation media.
>
>       Achtung!  Danger!  Don't wipe out the wrong disk!  Change /dev/sdNc
>       to match the special device for your USB stick!
>
> # dd if=alpine-standard-3.13.4-x86_64.iso of=/dev/sdNc bs=1m
>
>    C. Reboot.
>
>         # shutdown -r now
>
>    D. Boot from the USB stick.  How you do this varies by device.  Log in as
>       root.  The Alpine installation ramdisk has no root password.
>
>    E. Examine the Linux dmesg for lines about the TSC, clocksources:
>
> # dmesg | egrep -i 'tsc|clocksource'
>
> 2. Second, is there a more recent BIOS revision for this machine?
>    Perhaps (assuming this is in fact a BIOS problem) Lenovo is aware
>    of it and has fixed it.  This is unlikely but worth a look.
>
> Long version:
>
> I think two points form a pattern.  Bear with me.
>
> Both you and Josh Rickmar (CC'd) have Lenovo laptops with the same CPU
> (AMD Ryzen 5 2500U) and the same BIOS (LENOVO version "R0UET78W (1.58
> )" date 11/17/2020).
>
> Looking at the data here, both machines exhibit the same problem with
> the TSC: the APs are all nearly synchronized outside of small
> measurement errors while the BSP is way off.
>
> This makes me wonder whether this is a firmware/BIOS bug.  Perhaps the
> BIOS is fussing with the TSC on CPU0 before we boot.  Is there a new
> BIOS revision available from Lenovo?
>
> I'd also be interested to know if a recent Linux kernel would even use
> the TSC on this laptop as a clocksource or if the kernel complains and
> falls back to using the HPET.
>
> There is a little chit-chat here and there about adding support to
> OpenBSD for fixing the TSC skew during synchronization at boot/resume.
> One way to do this is with the TSC_ADJUST MSR...
>
> ... but that won't work here in your case.  The CPU on this particular
> laptop does not have TSC_ADJUST support, so if we wanted to correct
> the TSC skew we'd have to use WRMSR to modify the TSC directly.
>
> I'm uncertain about whether using WRMSR to reset the TSC on a given
> logical processor is universally supported on all amd64 machines or
> if it's a special feature a la the TSC_ADJUST MSR.
>
> -Scott

Hey, thanks for the reminder to try this out with Linux.  Will give it
a shot shortly.

As for the BIOS, 1.58 is the current version (found here):

https://support.lenovo.com/us/en/downloads/ds503790

This same issue was happening with all older BIOS versions that I have
used as well.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
On Thu, Apr 01, 2021 at 03:22:00PM -0400, Josh Rickmar wrote:

> On Thu, Apr 01, 2021 at 02:15:48PM -0500, Scott Cheloha wrote:
> > On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > > > Feel free to share your raw data.
> > >
> > > Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz
> >
> > Thanks!
> >
> > TL;DR:
> >
> > Two things:
> >
> > 1. Could you check whether Linux will use the TSC as a clocksource on
> >    this machine?  The dmesg output on any given distribution should
> >    contain lines about the TSC.
> >
> >    Feel free to use my easy five-step method.  You don't even need to
> >    install Linux, we just need to boot installation media and look at
> >    the dmesg:
> >
> >    A. Grab the latest Alpine Linux ISO:
> >
> > $ ftp https://dl-cdn.alpinelinux.org/alpine/v3.13/releases/x86_64/alpine-standard-3.13.4-x86_64.iso
> >
> >    B. Write the ISO to a USB key to create your bootable installation media.
> >
> >       Achtung!  Danger!  Don't wipe out the wrong disk!  Change /dev/sdNc
> >       to match the special device for your USB stick!
> >
> > # dd if=alpine-standard-3.13.4-x86_64.iso of=/dev/sdNc bs=1m
> >
> >    C. Reboot.
> >
> >         # shutdown -r now
> >
> >    D. Boot from the USB stick.  How you do this varies by device.  Log in as
> >       root.  The Alpine installation ramdisk has no root password.
> >
> >    E. Examine the Linux dmesg for lines about the TSC, clocksources:
> >
> > # dmesg | egrep -i 'tsc|clocksource'
> >
> > 2. Second, is there a more recent BIOS revision for this machine?
> >    Perhaps (assuming this is in fact a BIOS problem) Lenovo is aware
> >    of it and has fixed it.  This is unlikely but worth a look.
> >
> > Long version:
> >
> > I think two points form a pattern.  Bear with me.
> >
> > Both you and Josh Rickmar (CC'd) have Lenovo laptops with the same CPU
> > (AMD Ryzen 5 2500U) and the same BIOS (LENOVO version "R0UET78W (1.58
> > )" date 11/17/2020).
> >
> > Looking at the data here, both machines exhibit the same problem with
> > the TSC: the APs are all nearly synchronized outside of small
> > measurement errors while the BSP is way off.
> >
> > This makes me wonder whether this is a firmware/BIOS bug.  Perhaps the
> > BIOS is fussing with the TSC on CPU0 before we boot.  Is there a new
> > BIOS revision available from Lenovo?
> >
> > I'd also be interested to know if a recent Linux kernel would even use
> > the TSC on this laptop as a clocksource or if the kernel complains and
> > falls back to using the HPET.
> >
> > There is a little chit-chat here and there about adding support to
> > OpenBSD for fixing the TSC skew during synchronization at boot/resume.
> > One way to do this is with the TSC_ADJUST MSR...
> >
> > ... but that won't work here in your case.  The CPU on this particular
> > laptop does not have TSC_ADJUST support, so if we wanted to correct
> > the TSC skew we'd have to use WRMSR to modify the TSC directly.
> >
> > I'm uncertain about whether using WRMSR to reset the TSC on a given
> > logical processor is universally supported on all amd64 machines or
> > if it's a special feature a la the TSC_ADJUST MSR.
> >
> > -Scott
>
> Hey, thanks for the reminder to try this out with Linux.  Will give it
> a shot shortly.
>
> As for the BIOS, 1.58 is the current version (found here):
>
> https://support.lenovo.com/us/en/downloads/ds503790
>
> This same issue was happening with all older BIOS versions that I have
> used as well.
>

Seems Linux doesn't like it either:

localhost:~# dmesg | egrep -i 'tsc|clocksource'
[    0.000000] tsc: Fast TSC calibration using PIT
[    0.000000] tsc: Detected 1996.173 MHz processor
[    0.043227] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ms: 6370452778343963 ns
[    0.114728] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484873504 ns
[    0.131435] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x398c1ebcd00, max_idle_ns: 881590807727 ns
[    0.244772] TSC synchronization [CPU#0 -> CPU#1]:
[    0.244772] Measured 7296391160 warp between CPUs, turning off TSC clock.
[    0.244772] tsc: Marking TSC unstable due to check_tsc_sync_source_failed
[    0.252185] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
[    0.316884] clocksource: Switched to clocksource hpet
[    0.335046] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
On Thu, Apr 01, 2021 at 03:41:24PM -0400, Josh Rickmar wrote:

> On Thu, Apr 01, 2021 at 03:22:00PM -0400, Josh Rickmar wrote:
> > On Thu, Apr 01, 2021 at 02:15:48PM -0500, Scott Cheloha wrote:
> > > On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > > > > Feel free to share your raw data.
> > > >
> > > > Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz
> > >
> > > Thanks!
> > >
> > > TL;DR:
> > >
> > > Two things:
> > >
> > > 1. Could you check whether Linux will use the TSC as a clocksource on
> > >    this machine?  The dmesg output on any given distribution should
> > >    contain lines about the TSC.
> > >
> > >    [...]
> > >
> > Hey, thanks for the reminder to try this out with Linux.  Will give it
> > a shot shortly.
> >
> > As for the BIOS, 1.58 is the current version (found here):
> >
> > https://support.lenovo.com/us/en/downloads/ds503790
> >
> > This same issue was happening with all older BIOS versions that I have
> > used as well.

Okay, not great news, but at least the behavior is consistent.

> Seems Linux doesn't like it either:
>
> localhost:~# dmesg | egrep -i 'tsc|clocksource'
> [    0.000000] tsc: Fast TSC calibration using PIT
> [    0.000000] tsc: Detected 1996.173 MHz processor
> [    0.043227] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ms: 6370452778343963 ns
> [    0.114728] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484873504 ns
> [    0.131435] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x398c1ebcd00, max_idle_ns: 881590807727 ns
> [    0.244772] TSC synchronization [CPU#0 -> CPU#1]:
> [    0.244772] Measured 7296391160 warp between CPUs, turning off TSC clock.
> [    0.244772] tsc: Marking TSC unstable due to check_tsc_sync_source_failed
> [    0.252185] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
> [    0.316884] clocksource: Switched to clocksource hpet
> [    0.335046] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns

Hmmm.  Being able to work around this would be nice.

FreeBSD has code that uses WRMSR to synchronize the TSC:

https://cgit.freebsd.org/src/commit/sys/x86/x86/tsc.c?id=b2c63698d4b81576e0c8842263ee86e86cd34e76

My guess is that support for writing the TSC is not implemented by
every hypervisor, so we would need to be very careful in deciding when
to try it.  Otherwise we end up with protection faults and other crap
we don't want.

Doing this via TSC_ADJUST (instead of writing the TSC directly) is
nicer because you just check for the CPUID level and bit.  No
guesswork.  But we can't in your case because, as I said, no
TSC_ADJUST support on your CPU.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Josh Rickmar
On Thu, Apr 01, 2021 at 06:43:30PM -0500, Scott Cheloha wrote:

> On Thu, Apr 01, 2021 at 03:41:24PM -0400, Josh Rickmar wrote:
> > On Thu, Apr 01, 2021 at 03:22:00PM -0400, Josh Rickmar wrote:
> > > On Thu, Apr 01, 2021 at 02:15:48PM -0500, Scott Cheloha wrote:
> > > > On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > > > > > Feel free to share your raw data.
> > > > >
> > > > > Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz
> > > >
> > > > Thanks!
> > > >
> > > > TL;DR:
> > > >
> > > > Two things:
> > > >
> > > > 1. Could you check whether Linux will use the TSC as a clocksource on
> > > >    this machine?  The dmesg output on any given distribution should
> > > >    contain lines about the TSC.
> > > >
> > > >    [...]
> > > >
> > > Hey, thanks for the reminder to try this out with Linux.  Will give it
> > > a shot shortly.
> > >
> > > As for the BIOS, 1.58 is the current version (found here):
> > >
> > > https://support.lenovo.com/us/en/downloads/ds503790
> > >
> > > This same issue was happening with all older BIOS versions that I have
> > > used as well.
>
> Okay, not great news, but at least the behavior is consistent.
>
> > Seems Linux doesn't like it either:
> >
> > localhost:~# dmesg | egrep -i 'tsc|clocksource'
> > [    0.000000] tsc: Fast TSC calibration using PIT
> > [    0.000000] tsc: Detected 1996.173 MHz processor
> > [    0.043227] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ms: 6370452778343963 ns
> > [    0.114728] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484873504 ns
> > [    0.131435] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x398c1ebcd00, max_idle_ns: 881590807727 ns
> > [    0.244772] TSC synchronization [CPU#0 -> CPU#1]:
> > [    0.244772] Measured 7296391160 warp between CPUs, turning off TSC clock.
> > [    0.244772] tsc: Marking TSC unstable due to check_tsc_sync_source_failed
> > [    0.252185] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
> > [    0.316884] clocksource: Switched to clocksource hpet
> > [    0.335046] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
>
> Hmmm.  Being able to work around this would be nice.
>
> FreeBSD has code that uses WRMSR to synchronize the TSC:
>
> https://cgit.freebsd.org/src/commit/sys/x86/x86/tsc.c?id=b2c63698d4b81576e0c8842263ee86e86cd34e76
>
> My guess is that support for writing the TSC is not implemented by
> every hypervisor, so we would need to be very careful in deciding when
> to try it.  Otherwise we end up with protection faults and other crap
> we don't want.
>
> Doing this via TSC_ADJUST (instead of writing the TSC directly) is
> nicer because you just check for the CPUID level and bit.  No
> guesswork.  But we can't in your case because, as I said, no
> TSC_ADJUST support on your CPU.

This seems to be a common problem among most Ryzen Thinkpads.

https://bugzilla.kernel.org/show_bug.cgi?id=202525

Oddly enough, the A485/A585 seems to have gotten a BIOS patch (v1.28,
Nov 2019) that fixes this, but no other models that I can see.

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Mike Larkin-2
In reply to this post by Scott Cheloha
On Thu, Apr 01, 2021 at 06:43:30PM -0500, Scott Cheloha wrote:

> On Thu, Apr 01, 2021 at 03:41:24PM -0400, Josh Rickmar wrote:
> > On Thu, Apr 01, 2021 at 03:22:00PM -0400, Josh Rickmar wrote:
> > > On Thu, Apr 01, 2021 at 02:15:48PM -0500, Scott Cheloha wrote:
> > > > On Sat, Mar 27, 2021 at 02:20:21AM +0000, Stefmorino wrote:
> > > > > > Feel free to share your raw data.
> > > > >
> > > > > Also includes some standard sendbug dumps: https://0x0.st/-qng.tgz
> > > >
> > > > Thanks!
> > > >
> > > > TL;DR:
> > > >
> > > > Two things:
> > > >
> > > > 1. Could you check whether Linux will use the TSC as a clocksource on
> > > >    this machine?  The dmesg output on any given distribution should
> > > >    contain lines about the TSC.
> > > >
> > > >    [...]
> > > >
> > > Hey, thanks for the reminder to try this out with Linux.  Will give it
> > > a shot shortly.
> > >
> > > As for the BIOS, 1.58 is the current version (found here):
> > >
> > > https://support.lenovo.com/us/en/downloads/ds503790
> > >
> > > This same issue was happening with all older BIOS versions that I have
> > > used as well.
>
> Okay, not great news, but at least the behavior is consistent.
>
> > Seems Linux doesn't like it either:
> >
> > localhost:~# dmesg | egrep -i 'tsc|clocksource'
> > [    0.000000] tsc: Fast TSC calibration using PIT
> > [    0.000000] tsc: Detected 1996.173 MHz processor
> > [    0.043227] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ms: 6370452778343963 ns
> > [    0.114728] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484873504 ns
> > [    0.131435] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x398c1ebcd00, max_idle_ns: 881590807727 ns
> > [    0.244772] TSC synchronization [CPU#0 -> CPU#1]:
> > [    0.244772] Measured 7296391160 warp between CPUs, turning off TSC clock.
> > [    0.244772] tsc: Marking TSC unstable due to check_tsc_sync_source_failed
> > [    0.252185] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
> > [    0.316884] clocksource: Switched to clocksource hpet
> > [    0.335046] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
>
> Hmmm.  Being able to work around this would be nice.
>
> FreeBSD has code that uses WRMSR to synchronize the TSC:
>
> https://cgit.freebsd.org/src/commit/sys/x86/x86/tsc.c?id=b2c63698d4b81576e0c8842263ee86e86cd34e76
>
> My guess is that support for writing the TSC is not implemented by
> every hypervisor, so we would need to be very careful in deciding when
> to try it.  Otherwise we end up with protection faults and other crap
> we don't want.
>

We implemented rdmsr_safe for things like this. We could probably do the same
for wrmsr.

-ml

> Doing this via TSC_ADJUST (instead of writing the TSC directly) is
> nicer because you just check for the CPUID level and bit.  No
> guesswork.  But we can't in your case because, as I said, no
> TSC_ADJUST support on your CPU.
>

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
On Fri, Apr 02, 2021 at 10:37:36AM -0700, Mike Larkin wrote:

> On Thu, Apr 01, 2021 at 06:43:30PM -0500, Scott Cheloha wrote:
> >
> > [...]
> >
> > Hmmm.  Being able to work around this would be nice.
> >
> > FreeBSD has code that uses WRMSR to synchronize the TSC:
> >
> > https://cgit.freebsd.org/src/commit/sys/x86/x86/tsc.c?id=b2c63698d4b81576e0c8842263ee86e86cd34e76
> >
> > My guess is that support for writing the TSC is not implemented by
> > every hypervisor, so we would need to be very careful in deciding when
> > to try it.  Otherwise we end up with protection faults and other crap
> > we don't want.
> >
>
> We implemented rdmsr_safe for things like this. We could probably do the same
> for wrmsr.

Like this?

Sorry if this is not idiomatic.  I don't write much assembly.

I tested this a bit on my laptop.  Stuff like:

        wrmsr_safe(MSR_TSC, rdtsc() + 100);

Which seems to desync the normally synchronized TSCs here.

Unclear what the rules are for RETGUARD.  I just copied what was in
rdmsr_safe().  We're not using R10 so we can use R10?

-Scott

Index: include/cpufunc.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpufunc.h,v
retrieving revision 1.36
diff -u -p -r1.36 cpufunc.h
--- include/cpufunc.h 13 Sep 2020 11:53:16 -0000 1.36
+++ include/cpufunc.h 4 Apr 2021 03:16:48 -0000
@@ -398,6 +398,7 @@ struct cpu_info_full;
 void cpu_enter_pages(struct cpu_info_full *);
 
 int rdmsr_safe(u_int msr, uint64_t *);
+int wrmsr_safe(uint32_t msr, uint64_t);
 
 #endif /* _KERNEL */
 
Index: amd64/locore.S
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/locore.S,v
retrieving revision 1.122
diff -u -p -r1.122 locore.S
--- amd64/locore.S 3 Nov 2020 18:19:31 -0000 1.122
+++ amd64/locore.S 4 Apr 2021 03:16:48 -0000
@@ -1154,6 +1154,30 @@ NENTRY(rdmsr_resume)
  ret
 END(rdmsr_safe)
 
+/* int wrmsr_safe(uint32_t msr, uint64_t val) */
+ENTRY(wrmsr_safe)
+ RETGUARD_SETUP(wrmsr_safe, r10)
+
+ movl %edi, %ecx /* uint32_t msr */
+
+ movl %esi, %eax /* uint64_t val */
+ sarq $32, %rsi
+ movl %esi, %edx
+
+ .globl wrmsr_safe_fault
+wrmsr_safe_fault:
+ wrmsr
+
+ xorq %rax, %rax
+ RETGUARD_CHECK(rdmsr_safe, r10)
+ ret
+
+NENTRY(wrmsr_resume)
+ movq $0x1, %rax
+ RETGUARD_CHECK(wrmsr_safe, r10)
+ ret
+END(wrmsr_safe)
+
 #if NXEN > 0
  /* Hypercall page needs to be page aligned */
  .text

Reply | Threaded
Open this post in threaded view
|

Re: monotonic time going back by wrong skews

Scott Cheloha
In reply to this post by YASUOKA Masahiko-3
On Mon, Mar 29, 2021 at 02:00:01PM +0900, YASUOKA Masahiko wrote:

> On Thu, 25 Mar 2021 19:41:35 +0100 (CET)
> Mark Kettenis <[hidden email]> wrote:
> >> From: Scott Cheloha <[hidden email]>
> >> Date: Thu, 25 Mar 2021 13:18:04 -0500
> >> > On Wed, Mar 24, 2021 at 05:40:21PM +0900, YASUOKA Masahiko wrote:
> >> Which diff did you apply?  Yasuoka provided two diffs.
> >>
> >> In any case, ignore this diff:
> >>
> >> > diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
> >> > index 238a5a068e1..3b951a8b5a3 100644
> >> > --- a/sys/arch/amd64/amd64/tsc.c
> >> > +++ b/sys/arch/amd64/amd64/tsc.c
> >> > @@ -212,7 +212,8 @@ cpu_recalibrate_tsc(struct timecounter *tc)
> >> > u_int
> >> > tsc_get_timecount(struct timecounter *tc)
> >> > {
> >> > - return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> > + //return rdtsc_lfence() + curcpu()->ci_tsc_skew;
> >> > + return rdtsc_lfence();
> >> > }
> >> >
> >> > void
> >>
> >>
> >> We don't want to discard the skews, that's wrong.
>
> I'm sorry for the confusion.

No problem.

> >> The reason it "fixes" Yasuoka's problem is because the real skews
> >> on the ESXi VMs in question are probably close to zero but our
> >> synchronization algorithm is picking huge (wrong) skews due to
> >> some other variable interfering with our measurement.
> >
> > Right.  If a VM exit happens while we're doing our measurement, you'll
> > see a significant delay.  And a guest OS can't prevent those from
> > happening.  But even on real hardware SMM mode may interfere with our
> > measurement.
>
> For machines like the ESXi VMs, the measurement seems to have to
> exclude such delayed values as outliers.  I think taking a lot of
> samples and choice the minimum is a good enough way for the purpose.
>
> I updated the diff.
>
> - delete lines for debug
> - make tsc quality lower if skew is not good enough
> - reduce difference from NetBSD
>
> comment? ok?

If more iterations fixes your problem, great.  It isn't going to make
things worse for machines with sync'd TSCs, makes the TSC usable on
another class of machine, and is relatively cheap.

This is ok cheloha@.

You need another ok, though.

> Index: sys/arch/amd64//amd64/tsc.c
> ===================================================================
> RCS file: /disk/cvs/openbsd/src/sys/arch/amd64/amd64/tsc.c,v
> retrieving revision 1.23
> diff -u -p -r1.23 tsc.c
> --- sys/arch/amd64//amd64/tsc.c 23 Feb 2021 04:44:30 -0000 1.23
> +++ sys/arch/amd64//amd64/tsc.c 29 Mar 2021 04:18:31 -0000
> @@ -38,6 +38,7 @@ int tsc_is_invariant;
>  
>  #define TSC_DRIFT_MAX 250
>  #define TSC_SKEW_MAX 100
> +#define TSC_SYNC_ROUNDS 1000
>  int64_t tsc_drift_observed;
>  
>  volatile int64_t tsc_sync_val;
> @@ -235,6 +236,7 @@ tsc_timecounter_init(struct cpu_info *ci
>   printf("%s: disabling user TSC (skew=%lld)\n",
>      ci->ci_dev->dv_xname, (long long)ci->ci_tsc_skew);
>   tsc_timecounter.tc_user = 0;
> + tsc_timecounter.tc_quality = -1000;
>   }
>  
>   if (!(ci->ci_flags & CPUF_PRIMARY) ||
> @@ -314,13 +316,19 @@ tsc_read_bp(struct cpu_info *ci, uint64_
>  void
>  tsc_sync_bp(struct cpu_info *ci)
>  {
> + int i, val, diff;
>   uint64_t bptsc, aptsc;
>  
> - tsc_read_bp(ci, &bptsc, &aptsc); /* discarded - cache effects */
> - tsc_read_bp(ci, &bptsc, &aptsc);
> + val = INT_MAX;
> + for (i = 0; i < TSC_SYNC_ROUNDS; i++) {
> + tsc_read_bp(ci, &bptsc, &aptsc);
> + diff = bptsc - aptsc;
> + if (abs(diff) < abs(val))
> + val = diff;
> + }
>  
>   /* Compute final value to adjust for skew. */
> - ci->ci_tsc_skew = bptsc - aptsc;
> + ci->ci_tsc_skew = val;
>  }
>  
>  /*
> @@ -351,8 +359,10 @@ tsc_post_ap(struct cpu_info *ci)
>  void
>  tsc_sync_ap(struct cpu_info *ci)
>  {
> - tsc_post_ap(ci);
> - tsc_post_ap(ci);
> + int i;
> +
> + for (i = 0; i < TSC_SYNC_ROUNDS; i++)
> + tsc_post_ap(ci);
>  }
>  
>  void

123