[libvirt] [PATCH 1/2] bhyve: add UTC clock support

Bhyve as of r279225 (FreeBSD -CURRENT) or r284894 (FreeBSD 10-STABLE) supports using UTC time offset via the '-u' argument to bhyve(8). By default it's still using localtime. Make the bhyve driver use UTC clock if it's requested by specifying <clock offset='utc'> in domain XML and if the bhyve(8) binary supports the '-u' flag. --- src/bhyve/bhyve_capabilities.c | 31 ++++++++++++++++++++++ src/bhyve/bhyve_capabilities.h | 5 ++++ src/bhyve/bhyve_command.c | 21 +++++++++++++++ src/bhyve/bhyve_driver.c | 13 +++++++++ src/bhyve/bhyve_driver.h | 2 ++ src/bhyve/bhyve_utils.h | 1 + .../bhyvexml2argvdata/bhyvexml2argv-acpiapic.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-base.args | 2 +- .../bhyvexml2argv-bhyveload-explicitargs.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-console.args | 2 +- .../bhyvexml2argv-custom-loader.args | 2 +- .../bhyvexml2argv-disk-cdrom-grub.args | 2 +- .../bhyvexml2argv-disk-cdrom.args | 2 +- .../bhyvexml2argv-disk-virtio.args | 2 +- .../bhyvexml2argv-grub-bootorder.args | 2 +- .../bhyvexml2argv-grub-bootorder2.args | 2 +- .../bhyvexml2argv-grub-defaults.args | 2 +- .../bhyvexml2argvdata/bhyvexml2argv-localtime.args | 3 +++ .../bhyvexml2argv-localtime.ldargs | 1 + .../bhyvexml2argvdata/bhyvexml2argv-localtime.xml | 23 ++++++++++++++++ tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args | 2 +- .../bhyvexml2argv-serial-grub-nocons.args | 2 +- .../bhyvexml2argv-serial-grub.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-serial.args | 2 +- tests/bhyvexml2argvtest.c | 2 ++ 25 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 3a55879..9b21649 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -141,3 +141,34 @@ virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps) VIR_FREE(binary); return ret; } + +int +virBhyveProbeCaps(virBhyveCapsFlags *caps) +{ + char *binary, *help; + virCommandPtr cmd = NULL; + int ret = 0, exit; + + binary = virFindFileInPath("bhyve"); + if (binary == NULL) + goto out; + if (!virFileIsExecutable(binary)) + goto out; + + cmd = virCommandNew(binary); + virCommandAddArg(cmd, "-h"); + virCommandSetErrorBuffer(cmd, &help); + if (virCommandRun(cmd, &exit) < 0) { + ret = -1; + goto out; + } + + if (strstr(help, "-u:") != NULL) + *caps |= BHYVE_CAP_RTC_UTC; + + out: + VIR_FREE(help); + virCommandFree(cmd); + VIR_FREE(binary); + return ret; +} diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h index ccd8eb6..df7218f 100644 --- a/src/bhyve/bhyve_capabilities.h +++ b/src/bhyve/bhyve_capabilities.h @@ -31,6 +31,11 @@ typedef enum { BHYVE_GRUB_CAP_CONSDEV = 1, } virBhyveGrubCapsFlags; +typedef enum { + BHYVE_CAP_RTC_UTC = 1, +} virBhyveCapsFlags; + int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps); +int virBhyveProbeCaps(virBhyveCapsFlags *caps); #endif diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index 5e31ca6..6576029 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -245,6 +245,27 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn, if (def->features[VIR_DOMAIN_FEATURE_APIC] == VIR_TRISTATE_SWITCH_ON) virCommandAddArg(cmd, "-I"); /* Present ioapic to the guest */ + switch (def->clock.offset) { + case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME: + /* used by default in bhyve */ + break; + case VIR_DOMAIN_CLOCK_OFFSET_UTC: + if ((bhyveDriverGetCaps(conn) & BHYVE_CAP_RTC_UTC) != 0) { + virCommandAddArg(cmd, "-u"); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Installed bhyve binary does not support " + "UTC clock")); + goto error; + } + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported clock offset '%s'"), + virDomainClockOffsetTypeToString(def->clock.offset)); + goto error; + } + /* Clarification about -H and -P flags from Peter Grehan: * -H and -P flags force the guest to exit when it executes IA32 HLT and PAUSE * instructions respectively. diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 85b7c8f..7f365b1 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1181,6 +1181,9 @@ bhyveStateInitialize(bool privileged, if (!(bhyve_driver->caps = virBhyveCapsBuild())) goto cleanup; + if (virBhyveProbeCaps(&bhyve_driver->bhyvecaps) < 0) + goto cleanup; + if (virBhyveProbeGrubCaps(&bhyve_driver->grubcaps) < 0) goto cleanup; @@ -1240,6 +1243,16 @@ bhyveStateInitialize(bool privileged, } unsigned +bhyveDriverGetCaps(virConnectPtr conn) +{ + bhyveConnPtr driver = conn->privateData; + + if (driver != NULL) + return driver->bhyvecaps; + return 0; +} + +unsigned bhyveDriverGetGrubCaps(virConnectPtr conn) { bhyveConnPtr driver = conn->privateData; diff --git a/src/bhyve/bhyve_driver.h b/src/bhyve/bhyve_driver.h index af2424a..221d5a0 100644 --- a/src/bhyve/bhyve_driver.h +++ b/src/bhyve/bhyve_driver.h @@ -25,6 +25,8 @@ int bhyveRegister(void); +unsigned bhyveDriverGetCaps(virConnectPtr conn); + unsigned bhyveDriverGetGrubCaps(virConnectPtr conn); #endif /* __BHYVE_DRIVER_H__ */ diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h index bbaa3a3..4bccdcc 100644 --- a/src/bhyve/bhyve_utils.h +++ b/src/bhyve/bhyve_utils.h @@ -46,6 +46,7 @@ struct _bhyveConn { virCloseCallbacksPtr closeCallbacks; + unsigned bhyvecaps; unsigned grubcaps; }; diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-acpiapic.args b/tests/bhyvexml2argvdata/bhyvexml2argv-acpiapic.args index 79f8e88..6b26964 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-acpiapic.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-acpiapic.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -A -I -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -A -I -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-base.args b/tests/bhyvexml2argvdata/bhyvexml2argv-base.args index 4122e62..118735e 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-base.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-base.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-bhyveload-explicitargs.args b/tests/bhyvexml2argvdata/bhyvexml2argv-bhyveload-explicitargs.args index 4122e62..118735e 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-bhyveload-explicitargs.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-bhyveload-explicitargs.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-console.args b/tests/bhyvexml2argvdata/bhyvexml2argv-console.args index df50290..3119777 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-console.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-console.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img \ -s 1,lpc -l com1,/dev/nmdm0A bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-custom-loader.args b/tests/bhyvexml2argvdata/bhyvexml2argv-custom-loader.args index 4122e62..118735e 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-custom-loader.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-custom-loader.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom-grub.args b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom-grub.args index eb38969..2b1281f 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom-grub.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom-grub.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-cd,/tmp/cdrom.iso bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom.args b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom.args index eb38969..2b1281f 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-cdrom.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-cd,/tmp/cdrom.iso bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio.args b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio.args index 1638d54..da0577c 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,virtio-blk,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder.args b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder.args index eaba370..fc0522d 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd1.img \ -s 2:0,ahci-hd,/tmp/freebsd2.img \ diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder2.args b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder2.args index eaba370..fc0522d 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder2.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-bootorder2.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd1.img \ -s 2:0,ahci-hd,/tmp/freebsd2.img \ diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-defaults.args b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-defaults.args index 4122e62..118735e 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-grub-defaults.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-grub-defaults.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args new file mode 100644 index 0000000..4122e62 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args @@ -0,0 +1,3 @@ +/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +-s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ +-s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs new file mode 100644 index 0000000..215d65f --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs @@ -0,0 +1 @@ +/usr/sbin/bhyveload -m 214 -d /tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml new file mode 100644 index 0000000..f62c626 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml @@ -0,0 +1,23 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <clock offset='localtime'/> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <interface type='bridge'> + <model type='virtio'/> + <source bridge="virbr0"/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </interface> + </devices> +</domain> diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args b/tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args index f914865..77c3a17 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args @@ -1,3 +1,3 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:22:ee:11 \ -s 2:0,ahci-hd,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub-nocons.args b/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub-nocons.args index df50290..3119777 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub-nocons.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub-nocons.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img \ -s 1,lpc -l com1,/dev/nmdm0A bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub.args b/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub.args index df50290..3119777 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-serial-grub.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img \ -s 1,lpc -l com1,/dev/nmdm0A bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-serial.args b/tests/bhyvexml2argvdata/bhyvexml2argv-serial.args index df50290..3119777 100644 --- a/tests/bhyvexml2argvdata/bhyvexml2argv-serial.args +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-serial.args @@ -1,4 +1,4 @@ -/usr/sbin/bhyve -c 1 -m 214 -H -P -s 0:0,hostbridge \ +/usr/sbin/bhyve -c 1 -m 214 -u -H -P -s 0:0,hostbridge \ -s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:00 \ -s 2:0,ahci-hd,/tmp/freebsd.img \ -s 1,lpc -l com1,/dev/nmdm0A bhyve diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index fa6f87f..3e57a78 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -118,6 +118,7 @@ mymain(void) } while (0) driver.grubcaps = BHYVE_GRUB_CAP_CONSDEV; + driver.bhyvecaps = BHYVE_CAP_RTC_UTC; DO_TEST("base"); DO_TEST("acpiapic"); @@ -133,6 +134,7 @@ mymain(void) DO_TEST("custom-loader"); DO_TEST("disk-cdrom-grub"); DO_TEST("serial-grub"); + DO_TEST("localtime"); driver.grubcaps = 0; -- 2.3.7

--- docs/drvbhyve.html.in | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/drvbhyve.html.in b/docs/drvbhyve.html.in index 5479511..485b051 100644 --- a/docs/drvbhyve.html.in +++ b/docs/drvbhyve.html.in @@ -250,5 +250,33 @@ attempt to boot from the first partition in the disk image.</p> <p>Caveat: <code>bootloader_args</code> does not support any quoting. Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p> +<h3><a name="clockconfig">Clock configuration</a></h3> + +<p>Originally bhyve supported only localtime for RTC. Support for UTC time was introduced in +<a href="http://svnweb.freebsd.org/changeset/base/284894">r284894</a> for <i>10-STABLE</i> and +in <a href="http://svnweb.freebsd.org/changeset/base/279225">r279225</a> for <i>-CURRENT</i>. +It's possible to use this in libvirt <span class="since">since 1.2.18</span>, just place the +following to domain XML:</p> + +<pre> +<domain type="bhyve"> + ... + <clock offset='utc'/> + ... +</domain> +</pre> + +<p>Please note that if you run the older bhyve version that doesn't support UTC time, you'll +fail to start a domain. As UTC is used as a default when you do not specify clock settings, +you'll need to explicitly specify 'localtime' in this case:</p> + +<pre> +<domain type="bhyve"> + ... + <clock offset='localtime'/> + ... +</domain> +</pre> + </body> </html> -- 2.3.7

On Sun, Jul 19, 2015 at 11:20:36AM +0300, Roman Bogorodskiy wrote:
--- docs/drvbhyve.html.in | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Daniel P. Berrange wrote:
On Sun, Jul 19, 2015 at 11:20:36AM +0300, Roman Bogorodskiy wrote:
--- docs/drvbhyve.html.in | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
ACK
Pushed, thanks!
Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
Roman Bogorodskiy

On Sun, Jul 19, 2015 at 11:20:35AM +0300, Roman Bogorodskiy wrote:
Bhyve as of r279225 (FreeBSD -CURRENT) or r284894 (FreeBSD 10-STABLE) supports using UTC time offset via the '-u' argument to bhyve(8). By default it's still using localtime.
Make the bhyve driver use UTC clock if it's requested by specifying <clock offset='utc'> in domain XML and if the bhyve(8) binary supports the '-u' flag. --- src/bhyve/bhyve_capabilities.c | 31 ++++++++++++++++++++++ src/bhyve/bhyve_capabilities.h | 5 ++++ src/bhyve/bhyve_command.c | 21 +++++++++++++++ src/bhyve/bhyve_driver.c | 13 +++++++++ src/bhyve/bhyve_driver.h | 2 ++ src/bhyve/bhyve_utils.h | 1 + .../bhyvexml2argvdata/bhyvexml2argv-acpiapic.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-base.args | 2 +- .../bhyvexml2argv-bhyveload-explicitargs.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-console.args | 2 +- .../bhyvexml2argv-custom-loader.args | 2 +- .../bhyvexml2argv-disk-cdrom-grub.args | 2 +- .../bhyvexml2argv-disk-cdrom.args | 2 +- .../bhyvexml2argv-disk-virtio.args | 2 +- .../bhyvexml2argv-grub-bootorder.args | 2 +- .../bhyvexml2argv-grub-bootorder2.args | 2 +- .../bhyvexml2argv-grub-defaults.args | 2 +- .../bhyvexml2argvdata/bhyvexml2argv-localtime.args | 3 +++ .../bhyvexml2argv-localtime.ldargs | 1 + .../bhyvexml2argvdata/bhyvexml2argv-localtime.xml | 23 ++++++++++++++++ tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args | 2 +- .../bhyvexml2argv-serial-grub-nocons.args | 2 +- .../bhyvexml2argv-serial-grub.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-serial.args | 2 +- tests/bhyvexml2argvtest.c | 2 ++ 25 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 3a55879..9b21649 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -141,3 +141,34 @@ virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps) VIR_FREE(binary); return ret; } + +int +virBhyveProbeCaps(virBhyveCapsFlags *caps)
This output parameter is intended to be a union of many enum values, so you can't declare it as an enum - it should be a plain unsigned int.
+{ + char *binary, *help; + virCommandPtr cmd = NULL; + int ret = 0, exit; + + binary = virFindFileInPath("bhyve"); + if (binary == NULL) + goto out; + if (!virFileIsExecutable(binary)) + goto out; + + cmd = virCommandNew(binary); + virCommandAddArg(cmd, "-h"); + virCommandSetErrorBuffer(cmd, &help); + if (virCommandRun(cmd, &exit) < 0) { + ret = -1; + goto out; + } + + if (strstr(help, "-u:") != NULL) + *caps |= BHYVE_CAP_RTC_UTC; + + out: + VIR_FREE(help); + virCommandFree(cmd); + VIR_FREE(binary); + return ret; +}
ACK if that is fixed. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Daniel P. Berrange wrote:
On Sun, Jul 19, 2015 at 11:20:35AM +0300, Roman Bogorodskiy wrote:
Bhyve as of r279225 (FreeBSD -CURRENT) or r284894 (FreeBSD 10-STABLE) supports using UTC time offset via the '-u' argument to bhyve(8). By default it's still using localtime.
Make the bhyve driver use UTC clock if it's requested by specifying <clock offset='utc'> in domain XML and if the bhyve(8) binary supports the '-u' flag. --- src/bhyve/bhyve_capabilities.c | 31 ++++++++++++++++++++++ src/bhyve/bhyve_capabilities.h | 5 ++++ src/bhyve/bhyve_command.c | 21 +++++++++++++++ src/bhyve/bhyve_driver.c | 13 +++++++++ src/bhyve/bhyve_driver.h | 2 ++ src/bhyve/bhyve_utils.h | 1 + .../bhyvexml2argvdata/bhyvexml2argv-acpiapic.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-base.args | 2 +- .../bhyvexml2argv-bhyveload-explicitargs.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-console.args | 2 +- .../bhyvexml2argv-custom-loader.args | 2 +- .../bhyvexml2argv-disk-cdrom-grub.args | 2 +- .../bhyvexml2argv-disk-cdrom.args | 2 +- .../bhyvexml2argv-disk-virtio.args | 2 +- .../bhyvexml2argv-grub-bootorder.args | 2 +- .../bhyvexml2argv-grub-bootorder2.args | 2 +- .../bhyvexml2argv-grub-defaults.args | 2 +- .../bhyvexml2argvdata/bhyvexml2argv-localtime.args | 3 +++ .../bhyvexml2argv-localtime.ldargs | 1 + .../bhyvexml2argvdata/bhyvexml2argv-localtime.xml | 23 ++++++++++++++++ tests/bhyvexml2argvdata/bhyvexml2argv-macaddr.args | 2 +- .../bhyvexml2argv-serial-grub-nocons.args | 2 +- .../bhyvexml2argv-serial-grub.args | 2 +- tests/bhyvexml2argvdata/bhyvexml2argv-serial.args | 2 +- tests/bhyvexml2argvtest.c | 2 ++ 25 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-localtime.xml
diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 3a55879..9b21649 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -141,3 +141,34 @@ virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps) VIR_FREE(binary); return ret; } + +int +virBhyveProbeCaps(virBhyveCapsFlags *caps)
This output parameter is intended to be a union of many enum values, so you can't declare it as an enum - it should be a plain unsigned int.
+{ + char *binary, *help; + virCommandPtr cmd = NULL; + int ret = 0, exit; + + binary = virFindFileInPath("bhyve"); + if (binary == NULL) + goto out; + if (!virFileIsExecutable(binary)) + goto out; + + cmd = virCommandNew(binary); + virCommandAddArg(cmd, "-h"); + virCommandSetErrorBuffer(cmd, &help); + if (virCommandRun(cmd, &exit) < 0) { + ret = -1; + goto out; + } + + if (strstr(help, "-u:") != NULL) + *caps |= BHYVE_CAP_RTC_UTC; + + out: + VIR_FREE(help); + virCommandFree(cmd); + VIR_FREE(binary); + return ret; +}
ACK if that is fixed.
Pushed with this fixed, thanks!
Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
Roman Bogorodskiy
participants (2)
-
Daniel P. Berrange
-
Roman Bogorodskiy