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
r...@syspatch-68-amd64.openbsd.org:/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
r...@syspatch-68-amd64.openbsd.org:/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