[libvirt] [PATCH 0/2] xen/libxl: support enabling or disabling the HPET

This patch series add support for enabling or disabling the HPET in Xen domains. It's split in two because I didn't have means to test the libxl part. Paolo Bonzini (2): xen: parse and generate hpet item in sxpr libxl: support enabling the HPET src/libxl/libxl_conf.c | 8 ++++ src/xenxs/xen_sxpr.c | 26 +++++++++++ src/xenxs/xen_xm.c | 26 +++++++++++ tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr | 9 ++++ tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml | 44 +++++++++++++++++++ .../sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr | 9 ++++ tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml | 44 +++++++++++++++++++ tests/sexpr2xmltest.c | 2 + tests/xmconfigdata/test-fullvirt-force-hpet.cfg | 26 +++++++++++ tests/xmconfigdata/test-fullvirt-force-hpet.xml | 45 ++++++++++++++++++++ tests/xmconfigdata/test-fullvirt-force-nohpet.cfg | 26 +++++++++++ tests/xmconfigdata/test-fullvirt-force-nohpet.xml | 45 ++++++++++++++++++++ tests/xmconfigtest.c | 3 + tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr | 9 ++++ tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml | 39 +++++++++++++++++ .../xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr | 9 ++++ tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml | 39 +++++++++++++++++ tests/xml2sexprtest.c | 2 + 18 files changed, 411 insertions(+), 0 deletions(-) create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml create mode 100644 tests/xmconfigdata/test-fullvirt-force-hpet.cfg create mode 100644 tests/xmconfigdata/test-fullvirt-force-hpet.xml create mode 100644 tests/xmconfigdata/test-fullvirt-force-nohpet.cfg create mode 100644 tests/xmconfigdata/test-fullvirt-force-nohpet.xml create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml -- 1.7.4.4

Recent versions of Xen disable the virtual HPET by default. This is usually more precise because tick policies are not implemented for the HPET in Xen. However, there may be several reasons to control the HPET manually: 1) to test the emulation; 2) because distros may provide the knob while leaving the default to "enabled" for compatibility reasons. This patch provides support for the hpet item in both sexpr and xm formats, and translates it to a <timer> element. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- src/xenxs/xen_sxpr.c | 26 +++++++++++ src/xenxs/xen_xm.c | 26 +++++++++++ tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr | 9 ++++ tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml | 44 +++++++++++++++++++ .../sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr | 9 ++++ tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml | 44 +++++++++++++++++++ tests/sexpr2xmltest.c | 2 + tests/xmconfigdata/test-fullvirt-force-hpet.cfg | 26 +++++++++++ tests/xmconfigdata/test-fullvirt-force-hpet.xml | 45 ++++++++++++++++++++ tests/xmconfigdata/test-fullvirt-force-nohpet.cfg | 26 +++++++++++ tests/xmconfigdata/test-fullvirt-force-nohpet.xml | 45 ++++++++++++++++++++ tests/xmconfigtest.c | 3 + tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr | 9 ++++ tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml | 39 +++++++++++++++++ .../xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr | 9 ++++ tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml | 39 +++++++++++++++++ tests/xml2sexprtest.c | 2 + 17 files changed, 403 insertions(+), 0 deletions(-) create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr create mode 100644 tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml create mode 100644 tests/xmconfigdata/test-fullvirt-force-hpet.cfg create mode 100644 tests/xmconfigdata/test-fullvirt-force-hpet.xml create mode 100644 tests/xmconfigdata/test-fullvirt-force-nohpet.cfg create mode 100644 tests/xmconfigdata/test-fullvirt-force-nohpet.xml create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr create mode 100644 tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c index 3a412a6..d8a18f7 100644 --- a/src/xenxs/xen_sxpr.c +++ b/src/xenxs/xen_sxpr.c @@ -1174,6 +1174,23 @@ xenParseSxpr(const struct sexpr *root, /* Old XenD only allows localtime here for HVM */ if (sexpr_int(root, "domain/image/hvm/localtime")) def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; + + if (sexpr_lookup(root, "domain/image/hvm/hpet")) { + virDomainTimerDefPtr timer; + + if (VIR_ALLOC_N(def->clock.timers, 1) < 0 || + VIR_ALLOC(timer) < 0) { + virReportOOMError(); + goto error; + } + + timer->name = VIR_DOMAIN_TIMER_NAME_HPET; + timer->present = sexpr_int(root, "domain/image/hvm/hpet"); + timer->tickpolicy = -1; + + def->clock.ntimers = 1; + def->clock.timers[0] = timer; + } } /* Current XenD allows localtime here, for PV and HVM */ @@ -2216,6 +2233,15 @@ xenFormatSxpr(virConnectPtr conn, if (def->emulator && (hvm || xendConfigVersion >= 3)) virBufferEscapeSexpr(&buf, "(device_model '%s')", def->emulator); + /* look for HPET in order to override the hypervisor/xend default */ + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present != -1) { + virBufferVSprintf(&buf, "(hpet %d)", + def->clock.timers[i]->present); + break; + } + } /* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */ if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) || diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c index 0acd120..3b92019 100644 --- a/src/xenxs/xen_xm.c +++ b/src/xenxs/xen_xm.c @@ -367,6 +367,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion, goto cleanup; else if (val) def->features |= (1 << VIR_DOMAIN_FEATURE_HAP); + + if (xenXMConfigGetBool(conf, "hpet", &val, -1) < 0) + goto cleanup; + else if (val != -1) { + virDomainTimerDefPtr timer; + + if (VIR_ALLOC_N(def->clock.timers, 1) < 0 || + VIR_ALLOC(timer) < 0) { + virReportOOMError(); + goto cleanup; + } + + timer->name = VIR_DOMAIN_TIMER_NAME_HPET; + timer->present = val; + timer->tickpolicy = -1; + + def->clock.ntimers = 1; + def->clock.timers[0] = timer; + } } if (xenXMConfigGetBool(conf, "localtime", &vmlocaltime, 0) < 0) goto cleanup; @@ -1513,6 +1532,13 @@ virConfPtr xenFormatXM(virConnectPtr conn, goto cleanup; } + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present != -1 && + xenXMConfigSetInt(conf, "hpet", def->clock.timers[i]->present) < 0) + break; + } + if (xendConfigVersion == 1) { for (i = 0 ; i < def->ndisks ; i++) { if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM && diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr new file mode 100644 index 0000000..d52214f --- /dev/null +++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr @@ -0,0 +1,9 @@ +(domain (domid 1)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\ +(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\ +(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 1)(vnc 1)))\ +(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\ +(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\ +(model 'e1000')(type ioemu))))\ diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml new file mode 100644 index 0000000..d0ead27 --- /dev/null +++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml @@ -0,0 +1,44 @@ +<domain type='xen' id='1'> + <name>fvtest</name> + <uuid>b5d70dd2-75cd-aca5-1776-9660b059d8bc</uuid> + <memory>409600</memory> + <currentMemory>409600</currentMemory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <features> + <acpi/> + </features> + <clock offset='utc'> + <timer name='hpet' present='yes'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <disk type='file' device='disk'> + <driver name='file'/> + <source file='/root/foo.img'/> + <target dev='hda' bus='ide'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='file'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='bridge'> + <mac address='00:16:3e:1b:b1:47'/> + <source bridge='xenbr0'/> + <script path='vif-bridge'/> + <target dev='vif1.0'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='5901' autoport='no'/> + </devices> +</domain> diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr new file mode 100644 index 0000000..75bc8b1 --- /dev/null +++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr @@ -0,0 +1,9 @@ +(domain (domid 1)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\ +(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\ +(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 0)(vnc 1)))\ +(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\ +(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\ +(model 'e1000')(type ioemu))))\ diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml new file mode 100644 index 0000000..9e6deae --- /dev/null +++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml @@ -0,0 +1,44 @@ +<domain type='xen' id='1'> + <name>fvtest</name> + <uuid>b5d70dd2-75cd-aca5-1776-9660b059d8bc</uuid> + <memory>409600</memory> + <currentMemory>409600</currentMemory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <features> + <acpi/> + </features> + <clock offset='utc'> + <timer name='hpet' present='no'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <disk type='file' device='disk'> + <driver name='file'/> + <source file='/root/foo.img'/> + <target dev='hda' bus='ide'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='file'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='bridge'> + <mac address='00:16:3e:1b:b1:47'/> + <source bridge='xenbr0'/> + <script path='vif-bridge'/> + <target dev='vif1.0'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='5901' autoport='no'/> + </devices> +</domain> diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c index 9f74ece..cd2ba55 100644 --- a/tests/sexpr2xmltest.c +++ b/tests/sexpr2xmltest.c @@ -165,6 +165,8 @@ mymain(int argc, char **argv) DO_TEST("fv-usbmouse", "fv-usbmouse", 1); DO_TEST("fv-usbtablet", "fv-usbtablet", 1); DO_TEST("fv-kernel", "fv-kernel", 1); + DO_TEST("fv-force-hpet", "fv-force-hpet", 1); + DO_TEST("fv-force-nohpet", "fv-force-nohpet", 1); DO_TEST("fv-serial-null", "fv-serial-null", 1); DO_TEST("fv-serial-file", "fv-serial-file", 1); diff --git a/tests/xmconfigdata/test-fullvirt-force-hpet.cfg b/tests/xmconfigdata/test-fullvirt-force-hpet.cfg new file mode 100644 index 0000000..4dd7585 --- /dev/null +++ b/tests/xmconfigdata/test-fullvirt-force-hpet.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +builder = "hvm" +kernel = "/usr/lib/xen/boot/hvmloader" +boot = "d" +pae = 1 +acpi = 1 +apic = 1 +localtime = 0 +hpet = 1 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-dm" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vncpasswd = "123poi" +disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ] +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=ioemu" ] +parallel = "none" +serial = "none" diff --git a/tests/xmconfigdata/test-fullvirt-force-hpet.xml b/tests/xmconfigdata/test-fullvirt-force-hpet.xml new file mode 100644 index 0000000..a662b97 --- /dev/null +++ b/tests/xmconfigdata/test-fullvirt-force-hpet.xml @@ -0,0 +1,45 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory>592896</memory> + <currentMemory>403456</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='xenfv'>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'> + <timer name='hpet' present='yes'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type='block' device='disk'> + <driver name='phy'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='file'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'/> + </devices> +</domain> diff --git a/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg b/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg new file mode 100644 index 0000000..d4fb429 --- /dev/null +++ b/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg @@ -0,0 +1,26 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +builder = "hvm" +kernel = "/usr/lib/xen/boot/hvmloader" +boot = "d" +pae = 1 +acpi = 1 +apic = 1 +localtime = 0 +hpet = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-dm" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vncpasswd = "123poi" +disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ] +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=ioemu" ] +parallel = "none" +serial = "none" diff --git a/tests/xmconfigdata/test-fullvirt-force-nohpet.xml b/tests/xmconfigdata/test-fullvirt-force-nohpet.xml new file mode 100644 index 0000000..bcd9af6 --- /dev/null +++ b/tests/xmconfigdata/test-fullvirt-force-nohpet.xml @@ -0,0 +1,45 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory>592896</memory> + <currentMemory>403456</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='xenfv'>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='utc'> + <timer name='hpet' present='no'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-dm</emulator> + <disk type='block' device='disk'> + <driver name='phy'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='file'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + </disk> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'/> + </devices> +</domain> diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index 7d418a5..7a44dbc 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -230,6 +230,9 @@ mymain(int argc, char **argv) DO_TEST("fullvirt-serial-udp", 2); DO_TEST("fullvirt-serial-unix", 2); + DO_TEST("fullvirt-force-hpet", 2); + DO_TEST("fullvirt-force-nohpet", 2); + DO_TEST("fullvirt-parallel-tcp", 2); DO_TEST("fullvirt-sound", 2); diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr new file mode 100644 index 0000000..400872d --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr @@ -0,0 +1,9 @@ +(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\ +(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\ +(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 1)(vnc 1)))\ +(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\ +(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\ +(model 'e1000')(type ioemu))))\ diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml new file mode 100644 index 0000000..1065f0e --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml @@ -0,0 +1,39 @@ +<domain type='xen'> + <name>fvtest</name> + <uuid>b5d70dd275cdaca517769660b059d8bc</uuid> + <os> + <type>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <memory>409600</memory> + <vcpu>1</vcpu> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <features> + <acpi/> + </features> + <clock offset='utc'> + <timer name='hpet' present='yes'/> + </clock> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <interface type='bridge'> + <source bridge='xenbr0'/> + <mac address='00:16:3e:1b:b1:47'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <disk type='file' device='cdrom'> + <source file='/root/boot.iso'/> + <target dev='hdc'/> + <readonly/> + </disk> + <disk type='file'> + <source file='/root/foo.img'/> + <target dev='ioemu:hda'/> + </disk> + <graphics type='vnc' port='5917' keymap='ja'/> + </devices> +</domain> diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr new file mode 100644 index 0000000..9577892 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr @@ -0,0 +1,9 @@ +(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\ +(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')\ +(on_reboot 'restart')(on_crash 'restart')\ +(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\ +(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\ +(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 0)(vnc 1)))\ +(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\ +(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\ +(model 'e1000')(type ioemu))))\ diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml new file mode 100644 index 0000000..decfd67 --- /dev/null +++ b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml @@ -0,0 +1,39 @@ +<domain type='xen'> + <name>fvtest</name> + <uuid>b5d70dd275cdaca517769660b059d8bc</uuid> + <os> + <type>hvm</type> + <loader>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='hd'/> + </os> + <memory>409600</memory> + <vcpu>1</vcpu> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <features> + <acpi/> + </features> + <clock offset='utc'> + <timer name='hpet' present='no'/> + </clock> + <devices> + <emulator>/usr/lib64/xen/bin/qemu-dm</emulator> + <interface type='bridge'> + <source bridge='xenbr0'/> + <mac address='00:16:3e:1b:b1:47'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <disk type='file' device='cdrom'> + <source file='/root/boot.iso'/> + <target dev='hdc'/> + <readonly/> + </disk> + <disk type='file'> + <source file='/root/foo.img'/> + <target dev='ioemu:hda'/> + </disk> + <graphics type='vnc' port='5917' keymap='ja'/> + </devices> +</domain> diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c index cf530b6..465e6f6 100644 --- a/tests/xml2sexprtest.c +++ b/tests/xml2sexprtest.c @@ -146,6 +146,8 @@ mymain(int argc, char **argv) DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1); DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1); DO_TEST("fv-kernel", "fv-kernel", "fvtest", 1); + DO_TEST("fv-force-hpet", "fv-force-hpet", "fvtest", 1); + DO_TEST("fv-force-nohpet", "fv-force-nohpet", "fvtest", 1); DO_TEST("fv-serial-null", "fv-serial-null", "fvtest", 1); DO_TEST("fv-serial-file", "fv-serial-file", "fvtest", 1); -- 1.7.4.4

On 05/10/2011 05:24 AM, Paolo Bonzini wrote:
Recent versions of Xen disable the virtual HPET by default. This is usually more precise because tick policies are not implemented for the HPET in Xen. However, there may be several reasons to control the HPET manually: 1) to test the emulation; 2) because distros may provide the knob while leaving the default to "enabled" for compatibility reasons.
This patch provides support for the hpet item in both sexpr and xm formats, and translates it to a <timer> element.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c index 3a412a6..d8a18f7 100644 --- a/src/xenxs/xen_sxpr.c +++ b/src/xenxs/xen_sxpr.c @@ -1174,6 +1174,23 @@ xenParseSxpr(const struct sexpr *root, /* Old XenD only allows localtime here for HVM */ if (sexpr_int(root, "domain/image/hvm/localtime")) def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; + + if (sexpr_lookup(root, "domain/image/hvm/hpet")) { + virDomainTimerDefPtr timer; + + if (VIR_ALLOC_N(def->clock.timers, 1) < 0 || + VIR_ALLOC(timer) < 0) {
TAB character. 'make syntax-check' would have caught it.
+ /* look for HPET in order to override the hypervisor/xend default */ + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present != -1) { + virBufferVSprintf(&buf, "(hpet %d)",
This patch was written before commit 68ea80c renaming things to virBufferAsprint.
+++ b/src/xenxs/xen_xm.c @@ -367,6 +367,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion, goto cleanup; else if (val) def->features |= (1 << VIR_DOMAIN_FEATURE_HAP); + + if (xenXMConfigGetBool(conf, "hpet", &val, -1) < 0) + goto cleanup; + else if (val != -1) { + virDomainTimerDefPtr timer; + + if (VIR_ALLOC_N(def->clock.timers, 1) < 0 || + VIR_ALLOC(timer) < 0) {
Another TAB. ACK with those nits fixed, so I pushed this. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

libxl accepts hpet configuration in its domain info struct. Parse the domain definition's <clock> element in order to set the value. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- src/libxl/libxl_conf.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 9dc35fc..6ace10e 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -374,6 +374,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) { libxl_domain_build_info *b_info = &d_config->b_info; int hvm = STREQ(def->os.type, "hvm"); + int i; libxl_init_build_info(b_info, &d_config->c_info); @@ -399,6 +400,13 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) b_info->u.hvm.pae = def->features & (1 << VIR_DOMAIN_FEATURE_PAE); b_info->u.hvm.apic = def->features & (1 << VIR_DOMAIN_FEATURE_APIC); b_info->u.hvm.acpi = def->features & (1 << VIR_DOMAIN_FEATURE_ACPI); + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present == 1) { + b_info->u.hvm.acpi.hpet = 1; + } + } + /* * The following comment and calculation were taken directly from * libxenlight's internal function libxl_get_required_shadow_memory(): -- 1.7.4.4

Paolo Bonzini wrote:
libxl accepts hpet configuration in its domain info struct. Parse the domain definition's <clock> element in order to set the value.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- src/libxl/libxl_conf.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 9dc35fc..6ace10e 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -374,6 +374,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) { libxl_domain_build_info *b_info = &d_config->b_info; int hvm = STREQ(def->os.type, "hvm"); + int i;
libxl_init_build_info(b_info, &d_config->c_info);
@@ -399,6 +400,13 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) b_info->u.hvm.pae = def->features & (1 << VIR_DOMAIN_FEATURE_PAE); b_info->u.hvm.apic = def->features & (1 << VIR_DOMAIN_FEATURE_APIC); b_info->u.hvm.acpi = def->features & (1 << VIR_DOMAIN_FEATURE_ACPI); + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present == 1) { + b_info->u.hvm.acpi.hpet = 1;
That should be b_info->u.hvm.hpet = 1; ACK with that change. Regards, Jim

On 05/10/2011 04:18 PM, Jim Fehlig wrote:
Paolo Bonzini wrote:
libxl accepts hpet configuration in its domain info struct. Parse the domain definition's <clock> element in order to set the value.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present == 1) { + b_info->u.hvm.acpi.hpet = 1;
That should be
b_info->u.hvm.hpet = 1;
ACK with that change.
Pushed. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On 05/10/2011 04:31 PM, Eric Blake wrote:
On 05/10/2011 04:18 PM, Jim Fehlig wrote:
Paolo Bonzini wrote:
libxl accepts hpet configuration in its domain info struct. Parse the domain definition's <clock> element in order to set the value.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present == 1) { + b_info->u.hvm.acpi.hpet = 1;
That should be
b_info->u.hvm.hpet = 1;
ACK with that change.
Pushed.
Aaargh. I botched things, and did 'git push' prior to 'git commit -a --amend'. Rather than be a revisionist and rewind history, I've just made this a two-part commit. Sorry. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On 05/10/2011 05:24 AM, Paolo Bonzini wrote:
libxl accepts hpet configuration in its domain info struct. Parse the domain definition's <clock> element in order to set the value.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- src/libxl/libxl_conf.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 9dc35fc..6ace10e 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -374,6 +374,7 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) { libxl_domain_build_info *b_info = &d_config->b_info; int hvm = STREQ(def->os.type, "hvm"); + int i;
libxl_init_build_info(b_info, &d_config->c_info);
@@ -399,6 +400,13 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config) b_info->u.hvm.pae = def->features & (1 << VIR_DOMAIN_FEATURE_PAE); b_info->u.hvm.apic = def->features & (1 << VIR_DOMAIN_FEATURE_APIC); b_info->u.hvm.acpi = def->features & (1 << VIR_DOMAIN_FEATURE_ACPI); + for (i = 0; i < def->clock.ntimers; i++) { + if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET && + def->clock.timers[i]->present == 1) { + b_info->u.hvm.acpi.hpet = 1; + } + }
Like you, I'm not set up to runtime test this; but I'm getting a compilation error: CC libvirt_driver_libxl_la-libxl_conf.lo libxl/libxl_conf.c: In function 'libxlMakeDomBuildInfo': libxl/libxl_conf.c:409:35: error: request for member 'hpet' in something not a structure or union Is this something where we need to do a configure check to see whether libxl is new enough to support that member? This patch will need a v2, possibly with more input from those more familiar with libxl. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (3)
-
Eric Blake
-
Jim Fehlig
-
Paolo Bonzini