summaryrefslogtreecommitdiffstats
path: root/sys/dev/hyperv/utilities
diff options
context:
space:
mode:
authorsephe <sephe@FreeBSD.org>2017-01-05 06:19:07 +0000
committersephe <sephe@FreeBSD.org>2017-01-05 06:19:07 +0000
commitf0e951e4dc53424aeffd634d9ab9446d1d41b8a7 (patch)
treeafcc0898ff9b6f1da5b65d8af9fb9a33a2d3bc23 /sys/dev/hyperv/utilities
parent12eb396a5a6fe9fa25ecc805e8d7d8b3224c884a (diff)
downloadFreeBSD-src-f0e951e4dc53424aeffd634d9ab9446d1d41b8a7.zip
FreeBSD-src-f0e951e4dc53424aeffd634d9ab9446d1d41b8a7.tar.gz
MFC 309705
hyperv/timesync: Support "sent TC" to improve accuracy. Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D8723
Diffstat (limited to 'sys/dev/hyperv/utilities')
-rw-r--r--sys/dev/hyperv/utilities/hv_timesync.c21
-rw-r--r--sys/dev/hyperv/utilities/vmbus_icreg.h7
2 files changed, 17 insertions, 11 deletions
diff --git a/sys/dev/hyperv/utilities/hv_timesync.c b/sys/dev/hyperv/utilities/hv_timesync.c
index 5bd51b0..4d166b0 100644
--- a/sys/dev/hyperv/utilities/hv_timesync.c
+++ b/sys/dev/hyperv/utilities/hv_timesync.c
@@ -46,10 +46,14 @@ __FBSDID("$FreeBSD$");
#define VMBUS_TIMESYNC_FWVER \
VMBUS_IC_VERSION(VMBUS_TIMESYNC_FWVER_MAJOR, 0)
-#define VMBUS_TIMESYNC_MSGVER_MAJOR 3
+#define VMBUS_TIMESYNC_MSGVER_MAJOR 4
#define VMBUS_TIMESYNC_MSGVER \
VMBUS_IC_VERSION(VMBUS_TIMESYNC_MSGVER_MAJOR, 0)
+#define VMBUS_TIMESYNC_DORTT(sc) \
+ ((sc)->ic_msgver >= VMBUS_IC_VERSION(4, 0) && \
+ (hyperv_features & CPUID_HV_MSR_TIME_REFCNT))
+
static const struct vmbus_ic_desc vmbus_timesync_descs[] = {
{
.ic_guid = { .hv_guid = {
@@ -81,12 +85,16 @@ SYSCTL_INT(_hw_hvtimesync, OID_AUTO, sample_verbose, CTLFLAG_RWTUN,
&vmbus_ts_sample_verbose, 0, "Increase sample request verbosity.");
static void
-vmbus_timesync(struct hv_util_sc *sc, uint64_t hvtime, uint8_t tsflags)
+vmbus_timesync(struct hv_util_sc *sc, uint64_t hvtime, uint64_t sent_tc,
+ uint8_t tsflags)
{
struct timespec vm_ts;
- uint64_t hv_ns, vm_ns;
+ uint64_t hv_ns, vm_ns, rtt = 0;
+
+ if (VMBUS_TIMESYNC_DORTT(sc))
+ rtt = rdmsr(MSR_HV_TIME_REF_COUNT) - sent_tc;
- hv_ns = (hvtime - VMBUS_ICMSG_TS_BASE) * VMBUS_ICMSG_TS_FACTOR;
+ hv_ns = (hvtime - VMBUS_ICMSG_TS_BASE + rtt) * HYPERV_TIMER_NS_FACTOR;
nanotime(&vm_ts);
vm_ns = (vm_ts.tv_sec * NANOSEC) + vm_ts.tv_nsec;
@@ -174,6 +182,8 @@ vmbus_timesync_cb(struct vmbus_channel *chan, void *xsc)
VMBUS_TIMESYNC_FWVER, VMBUS_TIMESYNC_MSGVER);
if (error)
return;
+ if (VMBUS_TIMESYNC_DORTT(sc))
+ device_printf(sc->ic_dev, "RTT\n");
break;
case VMBUS_ICMSG_TYPE_TIMESYNC:
@@ -183,7 +193,8 @@ vmbus_timesync_cb(struct vmbus_channel *chan, void *xsc)
return;
}
msg = data;
- vmbus_timesync(sc, msg->ic_hvtime, msg->ic_tsflags);
+ vmbus_timesync(sc, msg->ic_hvtime, msg->ic_sent_tc,
+ msg->ic_tsflags);
break;
default:
diff --git a/sys/dev/hyperv/utilities/vmbus_icreg.h b/sys/dev/hyperv/utilities/vmbus_icreg.h
index 3435962..fea74f0 100644
--- a/sys/dev/hyperv/utilities/vmbus_icreg.h
+++ b/sys/dev/hyperv/utilities/vmbus_icreg.h
@@ -114,18 +114,13 @@ struct vmbus_icmsg_timesync {
struct vmbus_icmsg_hdr ic_hdr;
uint64_t ic_hvtime;
uint64_t ic_vmtime;
- uint64_t ic_rtt;
+ uint64_t ic_sent_tc;
uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */
} __packed;
#define VMBUS_ICMSG_TS_FLAG_SYNC 0x01
#define VMBUS_ICMSG_TS_FLAG_SAMPLE 0x02
-/* XXX consolidate w/ hyperv */
#define VMBUS_ICMSG_TS_BASE 116444736000000000ULL
-#define VMBUS_ICMSG_TS_FACTOR 100ULL
-#ifndef NANOSEC
-#define NANOSEC 1000000000ULL
-#endif
#endif /* !_VMBUS_ICREG_H_ */
OpenPOWER on IntegriCloud