svn commit: r311256 - stable/10/sys/dev/hyperv/utilities
Sepherosa Ziehau
sephe at FreeBSD.org
Wed Jan 4 05:36:39 UTC 2017
Author: sephe
Date: Wed Jan 4 05:36:38 2017
New Revision: 311256
URL: https://svnweb.freebsd.org/changeset/base/311256
Log:
MFC 310462,310465
310462
hyperv/ic: Fix version4 timesync message format.
It is not compat w/ the old timesync message format, which the message
type stays the same as the old timesync message.
Sponsored by: Microsoft
310465
hyperv/ic: Allow applying the samples from hypervisor unconditionally.
Sponsored by: Microsoft
Modified:
stable/10/sys/dev/hyperv/utilities/vmbus_icreg.h
stable/10/sys/dev/hyperv/utilities/vmbus_timesync.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/hyperv/utilities/vmbus_icreg.h
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/vmbus_icreg.h Wed Jan 4 05:32:29 2017 (r311255)
+++ stable/10/sys/dev/hyperv/utilities/vmbus_icreg.h Wed Jan 4 05:36:38 2017 (r311256)
@@ -114,8 +114,17 @@ struct vmbus_icmsg_timesync {
struct vmbus_icmsg_hdr ic_hdr;
uint64_t ic_hvtime;
uint64_t ic_vmtime;
+ uint64_t ic_rtt;
+ uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */
+} __packed;
+
+/* VMBUS_ICMSG_TYPE_TIMESYNC, MSGVER4 */
+struct vmbus_icmsg_timesync4 {
+ struct vmbus_icmsg_hdr ic_hdr;
+ uint64_t ic_hvtime;
uint64_t ic_sent_tc;
uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */
+ uint8_t ic_rsvd[5];
} __packed;
#define VMBUS_ICMSG_TS_FLAG_SYNC 0x01
Modified: stable/10/sys/dev/hyperv/utilities/vmbus_timesync.c
==============================================================================
--- stable/10/sys/dev/hyperv/utilities/vmbus_timesync.c Wed Jan 4 05:32:29 2017 (r311255)
+++ stable/10/sys/dev/hyperv/utilities/vmbus_timesync.c Wed Jan 4 05:36:38 2017 (r311256)
@@ -48,8 +48,11 @@ __FBSDID("$FreeBSD$");
#define VMBUS_TIMESYNC_MSGVER \
VMBUS_IC_VERSION(VMBUS_TIMESYNC_MSGVER_MAJOR, 0)
+#define VMBUS_TIMESYNC_MSGVER4(sc) \
+ VMBUS_ICVER_LE(VMBUS_IC_VERSION(4, 0), (sc)->ic_msgver)
+
#define VMBUS_TIMESYNC_DORTT(sc) \
- ((sc)->ic_msgver >= VMBUS_IC_VERSION(4, 0) && \
+ (VMBUS_TIMESYNC_MSGVER4((sc)) &&\
(hyperv_features & CPUID_HV_MSR_TIME_REFCNT))
static int vmbus_timesync_probe(device_t);
@@ -136,7 +139,7 @@ vmbus_timesync(struct vmbus_ic_softc *sc
}
if ((tsflags & VMBUS_ICMSG_TS_FLAG_SAMPLE) &&
- vmbus_ts_sample_thresh > 0) {
+ vmbus_ts_sample_thresh >= 0) {
int64_t diff;
if (vmbus_ts_sample_verbose) {
@@ -174,7 +177,6 @@ vmbus_timesync_cb(struct vmbus_channel *
{
struct vmbus_ic_softc *sc = xsc;
struct vmbus_icmsg_hdr *hdr;
- const struct vmbus_icmsg_timesync *msg;
int dlen, error;
uint64_t xactid;
void *data;
@@ -209,14 +211,28 @@ vmbus_timesync_cb(struct vmbus_channel *
break;
case VMBUS_ICMSG_TYPE_TIMESYNC:
- if (dlen < sizeof(*msg)) {
- device_printf(sc->ic_dev, "invalid timesync len %d\n",
- dlen);
- return;
+ if (VMBUS_TIMESYNC_MSGVER4(sc)) {
+ const struct vmbus_icmsg_timesync4 *msg4;
+
+ if (dlen < sizeof(*msg4)) {
+ device_printf(sc->ic_dev, "invalid timesync4 "
+ "len %d\n", dlen);
+ return;
+ }
+ msg4 = data;
+ vmbus_timesync(sc, msg4->ic_hvtime, msg4->ic_sent_tc,
+ msg4->ic_tsflags);
+ } else {
+ const struct vmbus_icmsg_timesync *msg;
+
+ if (dlen < sizeof(*msg)) {
+ device_printf(sc->ic_dev, "invalid timesync "
+ "len %d\n", dlen);
+ return;
+ }
+ msg = data;
+ vmbus_timesync(sc, msg->ic_hvtime, 0, msg->ic_tsflags);
}
- msg = data;
- vmbus_timesync(sc, msg->ic_hvtime, msg->ic_sent_tc,
- msg->ic_tsflags);
break;
default:
More information about the svn-src-stable
mailing list