Module Name:    src
Committed By:   msaitoh
Date:           Wed Mar 20 23:34:24 UTC 2024

Modified Files:
        src/sys/dev/vmt: vmt_subr.c

Log Message:
Process all queued messages without delay immediately. From OpenBSD.

 Apply the remaining part of OpenBSD sys/dev/vmt.c rev. 1.22.

 > The VM host might send multiple messages at once but vmt(4) only
 > processed one of time per second.  Change the code to process all
 > queued messages without delay immediately.  This fixes two things: a)
 > the vmt time sensor is available on boot when ntpd -s is loaded and b)
 > the random seeding on resume (OS_Resume message) is executed almost
 > immediately and not delayed by about 20 seconds.

 Apply OpenBSD sys/dev/pv/vmt.c rev. 1.4.

 >  Merge two return branches in vmt_tclo_tick().  No functional changes.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/vmt/vmt_subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/vmt/vmt_subr.c
diff -u src/sys/dev/vmt/vmt_subr.c:1.7 src/sys/dev/vmt/vmt_subr.c:1.8
--- src/sys/dev/vmt/vmt_subr.c:1.7	Wed Mar 20 23:33:22 2024
+++ src/sys/dev/vmt/vmt_subr.c	Wed Mar 20 23:34:24 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: vmt_subr.c,v 1.7 2024/03/20 23:33:22 msaitoh Exp $ */
+/* $NetBSD: vmt_subr.c,v 1.8 2024/03/20 23:34:24 msaitoh Exp $ */
 /* $OpenBSD: vmt.c,v 1.11 2011/01/27 21:29:25 dtucker Exp $ */
 
 /*
@@ -774,7 +774,11 @@ vmt_tclo_tick(void *xarg)
 	struct vmt_softc *sc = xarg;
 	u_int32_t rlen;
 	u_int16_t ack;
+	int delay;
 
+	/* By default, poll every second for new messages */
+	delay = 1;
+	
 	/* reopen tclo channel if it's currently closed */
 	if (sc->sc_tclo_rpc.channel == 0 &&
 	    sc->sc_tclo_rpc.cookie1 == 0 &&
@@ -782,8 +786,8 @@ vmt_tclo_tick(void *xarg)
 		if (vm_rpc_open(&sc->sc_tclo_rpc, VM_RPC_OPEN_TCLO) != 0) {
 			device_printf(sc->sc_dev,
 			    "unable to reopen TCLO channel\n");
-			callout_schedule(&sc->sc_tclo_tick, hz * 15);
-			return;
+			delay = 15;
+			goto out;
 		}
 
 		if (vm_rpc_send_str(&sc->sc_tclo_rpc,
@@ -829,6 +833,9 @@ vmt_tclo_tick(void *xarg)
 	}
 	sc->sc_tclo_ping = 0;
 
+	/* The VM host can queue multiple messages; continue without delay */
+	delay = 0;
+
 #ifdef VMT_DEBUG
 	printf("vmware: received message '%s'\n", sc->sc_rpc_buf);
 #endif
@@ -842,10 +849,13 @@ vmt_tclo_tick(void *xarg)
 		}
 	}
 
+	if (sc->sc_rpc_error == 1) {
+		/* On error, give time to recover and wait a second */
+		delay = 1;
+	}
+
 out:
-	/* On error, give time to recover and wait a second */
-	callout_schedule(&sc->sc_tclo_tick,
-	    (sc->sc_tclo_ping || sc->sc_rpc_error) ? hz : 1);
+	callout_schedule(&sc->sc_tclo_tick, hz * delay);
 }
 
 static void

Reply via email to