提交 e547e44c 编写于 作者: P Paolo Bonzini 提交者: Eric Blake

xen: parse and generate hpet item in sxpr

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: NPaolo Bonzini <pbonzini@redhat.com>
上级 fa473272
...@@ -1175,6 +1175,23 @@ xenParseSxpr(const struct sexpr *root, ...@@ -1175,6 +1175,23 @@ xenParseSxpr(const struct sexpr *root,
/* Old XenD only allows localtime here for HVM */ /* Old XenD only allows localtime here for HVM */
if (sexpr_int(root, "domain/image/hvm/localtime")) if (sexpr_int(root, "domain/image/hvm/localtime"))
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_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 */ /* Current XenD allows localtime here, for PV and HVM */
...@@ -2220,6 +2237,15 @@ xenFormatSxpr(virConnectPtr conn, ...@@ -2220,6 +2237,15 @@ xenFormatSxpr(virConnectPtr conn,
if (def->emulator && (hvm || xendConfigVersion >= 3)) if (def->emulator && (hvm || xendConfigVersion >= 3))
virBufferEscapeSexpr(&buf, "(device_model '%s')", def->emulator); 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) {
virBufferAsprintf(&buf, "(hpet %d)",
def->clock.timers[i]->present);
break;
}
}
/* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */ /* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */
if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) || if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
......
...@@ -369,6 +369,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion, ...@@ -369,6 +369,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
goto cleanup; goto cleanup;
else if (val) else if (val)
def->features |= (1 << VIR_DOMAIN_FEATURE_HAP); 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) if (xenXMConfigGetBool(conf, "localtime", &vmlocaltime, 0) < 0)
goto cleanup; goto cleanup;
...@@ -1514,6 +1533,13 @@ virConfPtr xenFormatXM(virConnectPtr conn, ...@@ -1514,6 +1533,13 @@ virConfPtr xenFormatXM(virConnectPtr conn,
goto cleanup; 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) { if (xendConfigVersion == 1) {
for (i = 0 ; i < def->ndisks ; i++) { for (i = 0 ; i < def->ndisks ; i++) {
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM && if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
......
(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))))\
<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>
(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))))\
<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>
...@@ -157,6 +157,8 @@ mymain(void) ...@@ -157,6 +157,8 @@ mymain(void)
DO_TEST("fv-usbmouse", "fv-usbmouse", 1); DO_TEST("fv-usbmouse", "fv-usbmouse", 1);
DO_TEST("fv-usbtablet", "fv-usbtablet", 1); DO_TEST("fv-usbtablet", "fv-usbtablet", 1);
DO_TEST("fv-kernel", "fv-kernel", 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-null", "fv-serial-null", 1);
DO_TEST("fv-serial-file", "fv-serial-file", 1); DO_TEST("fv-serial-file", "fv-serial-file", 1);
......
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"
<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>
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"
<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>
...@@ -231,6 +231,9 @@ mymain(void) ...@@ -231,6 +231,9 @@ mymain(void)
DO_TEST("fullvirt-serial-udp", 2); DO_TEST("fullvirt-serial-udp", 2);
DO_TEST("fullvirt-serial-unix", 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-parallel-tcp", 2);
DO_TEST("fullvirt-sound", 2); DO_TEST("fullvirt-sound", 2);
......
(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))))\
<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>
(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))))\
<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>
...@@ -143,6 +143,8 @@ mymain(void) ...@@ -143,6 +143,8 @@ mymain(void)
DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1); DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1);
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-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-null", "fv-serial-null", "fvtest", 1);
DO_TEST("fv-serial-file", "fv-serial-file", "fvtest", 1); DO_TEST("fv-serial-file", "fv-serial-file", "fvtest", 1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册