提交 7373c4e4 编写于 作者: J Jiri Denemark

qemu: Add support for setting TSC frequency

QEMU allows for TSC frequency to be explicitly set to enable migration
with invtsc (migration fails if the destination QEMU cannot set the
exact same frequency used when starting the domain on the source host).

Libvirt already supports setting the TSC frequency in the XML using

    <clock>
      <timer name='tsc' frequency='1234567890'/>
    </clock>

which will be transformed into

    -cpu Model,tsc-frequency=1234567890

QEMU command line.
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
上级 5a506cce
...@@ -6329,12 +6329,12 @@ qemuBuildClockCommandLine(virCommandPtr cmd, ...@@ -6329,12 +6329,12 @@ qemuBuildClockCommandLine(virCommandPtr cmd,
for (i = 0; i < def->clock.ntimers; i++) { for (i = 0; i < def->clock.ntimers; i++) {
switch ((virDomainTimerNameType) def->clock.timers[i]->name) { switch ((virDomainTimerNameType) def->clock.timers[i]->name) {
case VIR_DOMAIN_TIMER_NAME_PLATFORM: case VIR_DOMAIN_TIMER_NAME_PLATFORM:
case VIR_DOMAIN_TIMER_NAME_TSC:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unsupported timer type (name) '%s'"), _("unsupported timer type (name) '%s'"),
virDomainTimerNameTypeToString(def->clock.timers[i]->name)); virDomainTimerNameTypeToString(def->clock.timers[i]->name));
return -1; return -1;
case VIR_DOMAIN_TIMER_NAME_TSC:
case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: case VIR_DOMAIN_TIMER_NAME_KVMCLOCK:
case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK: case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK:
/* Timers above are handled when building -cpu. */ /* Timers above are handled when building -cpu. */
...@@ -6921,19 +6921,23 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, ...@@ -6921,19 +6921,23 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
for (i = 0; i < def->clock.ntimers; i++) { for (i = 0; i < def->clock.ntimers; i++) {
virDomainTimerDefPtr timer = def->clock.timers[i]; virDomainTimerDefPtr timer = def->clock.timers[i];
if (timer->present == -1) if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK &&
continue; timer->present != -1) {
if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK) {
virBufferAsprintf(&buf, "%s,%ckvmclock", virBufferAsprintf(&buf, "%s,%ckvmclock",
have_cpu ? "" : default_model, have_cpu ? "" : default_model,
timer->present ? '+' : '-'); timer->present ? '+' : '-');
have_cpu = true; have_cpu = true;
} else if (timer->name == VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK && } else if (timer->name == VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK &&
timer->present) { timer->present == 1) {
virBufferAsprintf(&buf, "%s,hv_time", virBufferAsprintf(&buf, "%s,hv_time",
have_cpu ? "" : default_model); have_cpu ? "" : default_model);
have_cpu = true; have_cpu = true;
} else if (timer->name == VIR_DOMAIN_TIMER_NAME_TSC &&
timer->frequency > 0) {
virBufferAsprintf(&buf, "%s,tsc-frequency=%lu",
have_cpu ? "" : default_model,
timer->frequency);
have_cpu = true;
} }
} }
......
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu \
-name QEMUGuest1 \
-S \
-M pc \
-cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\
+smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,\
+invtsc,tsc-frequency=3504000000 \
-m 214 \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
-nographic \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
-no-acpi \
-boot c \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='kvm'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<title>A description of the test machine.</title>
<description>
A test of qemu&apos;s minimal configuration.
This test also tests the description and title elements.
</description>
<memory unit='KiB'>219100</memory>
<currentMemory unit='KiB'>219100</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='host-model'>
<model fallback='allow'/>
<feature policy='require' name='invtsc'/>
</cpu>
<clock offset='utc'>
<timer name='tsc' frequency='3504000000'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu</emulator>
<controller type='usb' index='0'/>
<controller type='ide' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='virtio'/>
</devices>
</domain>
...@@ -1552,6 +1552,7 @@ mymain(void) ...@@ -1552,6 +1552,7 @@ mymain(void)
DO_TEST("cpu-Haswell3", QEMU_CAPS_KVM); DO_TEST("cpu-Haswell3", QEMU_CAPS_KVM);
DO_TEST("cpu-Haswell-noTSX", QEMU_CAPS_KVM); DO_TEST("cpu-Haswell-noTSX", QEMU_CAPS_KVM);
DO_TEST("cpu-host-model-cmt", NONE); DO_TEST("cpu-host-model-cmt", NONE);
DO_TEST("cpu-tsc-frequency", QEMU_CAPS_KVM);
qemuTestSetHostCPU(driver.caps, NULL); qemuTestSetHostCPU(driver.caps, NULL);
DO_TEST("encrypted-disk", NONE); DO_TEST("encrypted-disk", NONE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册