Call "vmctl stop" on each VM at shutdown, for OpenBSD guests this means they
authorsthen <sthen@openbsd.org>
Tue, 20 Feb 2018 10:12:14 +0000 (10:12 +0000)
committersthen <sthen@openbsd.org>
Tue, 20 Feb 2018 10:12:14 +0000 (10:12 +0000)
are signalled to shutdown cleanly. Wait for each to finish to avoid too much
busy work at once; this may need revising if it turns out to be too slow with
a larger number of VMs (e.g. signal/delay/signal/delay/... then wait for
shutdowns), but let's avoid making it more complex unless we know it's needed.

Based on a diff from abieber@, discussed with mlarkin@ aja@ rpe@, ok rpe

etc/rc.d/vmd

index 43d0431..f023ff3 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/ksh
 #
-# $OpenBSD: vmd,v 1.6 2018/01/11 22:44:44 rpe Exp $
+# $OpenBSD: vmd,v 1.7 2018/02/20 10:12:14 sthen Exp $
 
 daemon="/usr/sbin/vmd"
 
@@ -11,4 +11,19 @@ rc_pre() {
        ${daemon} -n ${daemon_flags}
 }
 
+list_running() {
+       vmctl status | awk '$2 ~ "[0-9]" {print $8}'
+}
+
+rc_stop() {
+       for vm in $(list_running); do
+               _rc_do vmctl stop "$vm"
+               while list_running | fgrep -wq "$vm"; do
+                       sleep .1
+               done
+       done
+
+       pkill -T "${daemon_rtable}" -xf "${pexp}"
+}
+
 rc_cmd $1