diff --git a/c391e07e-libxl-clock-settings.patch b/c391e07e-libxl-clock-settings.patch new file mode 100644 index 0000000..1b36a08 --- /dev/null +++ b/c391e07e-libxl-clock-settings.patch @@ -0,0 +1,284 @@ +commit c391e07eb08d713474ae8998cfd859e1827a4b2d +Author: Jim Fehlig +Date: Tue Feb 20 16:51:27 2018 -0700 + + libxl: add support for specifying clock offset and adjustment + + libxl supports setting the domain real time clock to local time or + UTC via the localtime field of libxl_domain_build_info. Adjustment + of the clock is also supported via the rtc_timeoffset field. The + libvirt libxl driver has never supported these settings, instead + relying on libxl's default of a UTC real time clock with adjustment + set to 0. + + There is at least one user that would like the ability to change + the defaults + + https://www.redhat.com/archives/libvirt-users/2018-February/msg00059.html + + Add support for specifying a local time clock and for specifying an + adjustment for both local time and UTC clocks. Add a test case to + verify the XML to libxl_domain_config conversion. + + Local time clock and clock adjustment is already supported by the + XML <-> xl.cfg converter. What is missing is an explicit test for + the conversion. There are plenty of existing tests that all use UTC + with 0 adjustment. Hijack test-fullvirt-tsc-timer to test a local + time clock with 1 hour adjustment. + + Signed-off-by: Jim Fehlig + Reviewed-by: Daniel P. Berrangé + +Index: libvirt-4.0.0/src/libxl/libxl_conf.c +=================================================================== +--- libvirt-4.0.0.orig/src/libxl/libxl_conf.c ++++ libvirt-4.0.0/src/libxl/libxl_conf.c +@@ -274,6 +274,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr de + virCapsPtr caps, + libxl_domain_config *d_config) + { ++ virDomainClockDef clock = def->clock; + libxl_domain_build_info *b_info = &d_config->b_info; + int hvm = def->os.type == VIR_DOMAIN_OSTYPE_HVM; + size_t i; +@@ -293,10 +294,38 @@ libxlMakeDomBuildInfo(virDomainDefPtr de + for (i = 0; i < virDomainDefGetVcpus(def); i++) + libxl_bitmap_set((&b_info->avail_vcpus), i); + +- for (i = 0; i < def->clock.ntimers; i++) { +- switch ((virDomainTimerNameType) def->clock.timers[i]->name) { ++ switch ((virDomainClockOffsetType) clock.offset) { ++ case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: ++ if (clock.data.variable.basis == VIR_DOMAIN_CLOCK_BASIS_LOCALTIME) ++ libxl_defbool_set(&b_info->localtime, true); ++ b_info->rtc_timeoffset = clock.data.variable.adjustment; ++ break; ++ ++ case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME: ++ libxl_defbool_set(&b_info->localtime, true); ++ break; ++ ++ /* Nothing to do since UTC is the default in libxl */ ++ case VIR_DOMAIN_CLOCK_OFFSET_UTC: ++ break; ++ ++ case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE: ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("unsupported clock offset '%s'"), ++ virDomainClockOffsetTypeToString(clock.offset)); ++ return -1; ++ ++ case VIR_DOMAIN_CLOCK_OFFSET_LAST: ++ default: ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, ++ _("unexpected clock offset '%d'"), clock.offset); ++ return -1; ++ } ++ ++ for (i = 0; i < clock.ntimers; i++) { ++ switch ((virDomainTimerNameType) clock.timers[i]->name) { + case VIR_DOMAIN_TIMER_NAME_TSC: +- switch (def->clock.timers[i]->mode) { ++ switch (clock.timers[i]->mode) { + case VIR_DOMAIN_TIMER_MODE_NATIVE: + b_info->tsc_mode = LIBXL_TSC_MODE_NATIVE; + break; +@@ -315,10 +344,10 @@ libxlMakeDomBuildInfo(virDomainDefPtr de + if (!hvm) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported timer type (name) '%s'"), +- virDomainTimerNameTypeToString(def->clock.timers[i]->name)); ++ virDomainTimerNameTypeToString(clock.timers[i]->name)); + return -1; + } +- if (def->clock.timers[i]->present == 1) ++ if (clock.timers[i]->present == 1) + libxl_defbool_set(&b_info->u.hvm.hpet, 1); + break; + +@@ -329,7 +358,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr de + case VIR_DOMAIN_TIMER_NAME_PIT: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported timer type (name) '%s'"), +- virDomainTimerNameTypeToString(def->clock.timers[i]->name)); ++ virDomainTimerNameTypeToString(clock.timers[i]->name)); + return -1; + + case VIR_DOMAIN_TIMER_NAME_LAST: +Index: libvirt-4.0.0/tests/libxlxml2domconfigdata/variable-clock-hvm.json +=================================================================== +--- /dev/null ++++ libvirt-4.0.0/tests/libxlxml2domconfigdata/variable-clock-hvm.json +@@ -0,0 +1,91 @@ ++{ ++ "c_info": { ++ "type": "hvm", ++ "name": "test-hvm", ++ "uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b" ++ }, ++ "b_info": { ++ "max_vcpus": 4, ++ "avail_vcpus": [ ++ 0, ++ 1, ++ 2, ++ 3 ++ ], ++ "max_memkb": 1048576, ++ "target_memkb": 1048576, ++ "video_memkb": 8192, ++ "shadow_memkb": 12288, ++ "rtc_timeoffset": 3600, ++ "localtime": "True", ++ "device_model_version": "qemu_xen", ++ "device_model": "/bin/true", ++ "sched_params": { ++ "weight": 1000 ++ }, ++ "type.hvm": { ++ "pae": "True", ++ "apic": "True", ++ "acpi": "True", ++ "vga": { ++ "kind": "cirrus" ++ }, ++ "vnc": { ++ "enable": "True", ++ "listen": "0.0.0.0", ++ "findunused": "False" ++ }, ++ "sdl": { ++ "enable": "False" ++ }, ++ "spice": { ++ ++ }, ++ "boot": "c", ++ "rdm": { ++ ++ } ++ }, ++ "arch_arm": { ++ ++ } ++ }, ++ "disks": [ ++ { ++ "pdev_path": "/var/lib/xen/images/test-hvm.img", ++ "vdev": "hda", ++ "backend": "qdisk", ++ "format": "raw", ++ "removable": 1, ++ "readwrite": 1 ++ } ++ ], ++ "nics": [ ++ { ++ "devid": 0, ++ "mac": "00:16:3e:66:12:b4", ++ "bridge": "br0", ++ "script": "/etc/xen/scripts/vif-bridge", ++ "nictype": "vif_ioemu" ++ } ++ ], ++ "vfbs": [ ++ { ++ "devid": -1, ++ "vnc": { ++ "enable": "True", ++ "listen": "0.0.0.0", ++ "findunused": "False" ++ }, ++ "sdl": { ++ "enable": "False" ++ } ++ } ++ ], ++ "vkbs": [ ++ { ++ "devid": -1 ++ } ++ ], ++ "on_reboot": "restart" ++} +Index: libvirt-4.0.0/tests/libxlxml2domconfigdata/variable-clock-hvm.xml +=================================================================== +--- /dev/null ++++ libvirt-4.0.0/tests/libxlxml2domconfigdata/variable-clock-hvm.xml +@@ -0,0 +1,36 @@ ++ ++ test-hvm ++ None ++ 2147d599-9cc6-c0dc-92ab-4064b5446e9b ++ 1048576 ++ 1048576 ++ 4 ++ destroy ++ restart ++ destroy ++ ++ ++ hvm ++ /usr/lib/xen/boot/hvmloader ++ ++ ++ ++ ++ ++ ++ ++ ++ /bin/true ++ ++ ++ ++ ++ ++ ++ ++ ++