[libvirt] [PATCHv3 0/3] Add HyperV timer enlightenment

See patch 3/3 for changes. Peter Krempa (3): schema: Fix guest timer specification schema according to the docs conf: Enforce supported options for certain timers qemu: hyperv: Add support for timer enlightenments docs/formatdomain.html.in | 7 +- docs/schemas/domaincommon.rng | 156 +++++++++++++-------- src/conf/domain_conf.c | 59 +++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 31 ++-- .../qemuxml2argv-clock-timer-hyperv-rtc.args | 5 + .../qemuxml2argv-clock-timer-hyperv-rtc.xml | 26 ++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 212 insertions(+), 75 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml -- 1.8.5.3

According to the documentation describing various tunables for domain timers not all the fields are supported by all the driver types. Express these in the RNG: - rtc, platform: Only these support the "track" attribute. - tsc: only one to support "frequency" and "mode" attributes - hpet, pit: tickpolicy/catchup attribute/element - kvmclock: no extra attributes are supported --- docs/schemas/domaincommon.rng | 153 +++++++++++++++++++++++++----------------- 1 file changed, 93 insertions(+), 60 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 7f55f24..12fc0db 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -857,54 +857,68 @@ </define> <define name="timer"> <element name="timer"> - <attribute name="name"> - <choice> - <value>platform</value> - <value>hpet</value> - <value>kvmclock</value> - <value>pit</value> - <value>rtc</value> - <value>tsc</value> - </choice> - </attribute> - <optional> - <attribute name="track"> - <choice> - <value>boot</value> - <value>guest</value> - <value>wall</value> - </choice> - </attribute> - </optional> - <optional> - <attribute name="tickpolicy"> - <choice> - <value>delay</value> - <value>catchup</value> - <value>merge</value> - <value>discard</value> - </choice> - </attribute> - </optional> - <optional> - <ref name="catchup"/> - </optional> - <optional> - <attribute name="frequency"> - <ref name="unsignedInt"/> - </attribute> - </optional> - <optional> - <attribute name="mode"> - <choice> - <value>auto</value> - <value>native</value> - <value>emulate</value> - <value>paravirt</value> - <value>smpsafe</value> - </choice> - </attribute> - </optional> + <choice> + <group> + <attribute name="name"> + <choice> + <value>platform</value> + <value>rtc</value> + </choice> + </attribute> + <optional> + <attribute name="track"> + <choice> + <value>boot</value> + <value>guest</value> + <value>wall</value> + </choice> + </attribute> + </optional> + <optional> + <ref name="tickpolicy"/> + </optional> + </group> + <group> + <attribute name="name"> + <value>tsc</value> + </attribute> + <optional> + <ref name="tickpolicy"/> + </optional> + <optional> + <attribute name="frequency"> + <ref name="unsignedInt"/> + </attribute> + </optional> + <optional> + <attribute name="mode"> + <choice> + <value>auto</value> + <value>native</value> + <value>emulate</value> + <value>paravirt</value> + <value>smpsafe</value> + </choice> + </attribute> + </optional> + </group> + <group> + <attribute name="name"> + <choice> + <value>hpet</value> + <value>pit</value> + </choice> + </attribute> + <optional> + <ref name="tickpolicy"/> + </optional> + </group> + <group> + <attribute name="name"> + <value>kvmclock</value> + </attribute> + </group> + </choice> <optional> <attribute name="present"> <choice> @@ -916,20 +930,39 @@ <empty/> </element> </define> - <define name="catchup"> - <element name="catchup"> - <optional> - <attribute name="threshold"> - <ref name="unsignedInt"/> - </attribute> - <attribute name="slew"> - <ref name="unsignedInt"/> + + <define name="tickpolicy"> + <choice> + <group> + <attribute name="tickpolicy"> + <choice> + <value>delay</value> + <value>merge</value> + <value>discard</value> + </choice> </attribute> - <attribute name="limit"> - <ref name="unsignedInt"/> + </group> + <group> + <attribute name="tickpolicy"> + <value>catchup</value> </attribute> - </optional> - </element> + <optional> + <element name="catchup"> + <optional> + <attribute name="threshold"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="slew"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="limit"> + <ref name="unsignedInt"/> + </attribute> + </optional> + </element> + </optional> + </group> + </choice> </define> <!-- A bootloader may be used to extract the OS information instead of -- 1.8.5.3

On 02/07/2014 07:21 AM, Peter Krempa wrote:
According to the documentation describing various tunables for domain timers not all the fields are supported by all the driver types. Express these in the RNG:
- rtc, platform: Only these support the "track" attribute. - tsc: only one to support "frequency" and "mode" attributes - hpet, pit: tickpolicy/catchup attribute/element - kvmclock: no extra attributes are supported --- docs/schemas/domaincommon.rng | 153 +++++++++++++++++++++++++----------------- 1 file changed, 93 insertions(+), 60 deletions(-)
+ <optional> + <element name="catchup"> + <optional> + <attribute name="threshold"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="slew"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="limit"> + <ref name="unsignedInt"/> + </attribute>
Are all three attributes mandatory as a group? Or is each attribute optional in isolation? The C code says the latter, which means this part has to be written: <element name='catchup'> <optional> <attribute name='threshold'>... </optional> <optional> <attribute name='slew'>... and so on. ACK with that fix; it might also be nice to add a testsuite addition that proves we handle 'threshold' without also having to specify 'slew' and 'limit'. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 02/07/14 21:30, Eric Blake wrote:
On 02/07/2014 07:21 AM, Peter Krempa wrote:
According to the documentation describing various tunables for domain timers not all the fields are supported by all the driver types. Express these in the RNG:
- rtc, platform: Only these support the "track" attribute. - tsc: only one to support "frequency" and "mode" attributes - hpet, pit: tickpolicy/catchup attribute/element - kvmclock: no extra attributes are supported --- docs/schemas/domaincommon.rng | 153 +++++++++++++++++++++++++----------------- 1 file changed, 93 insertions(+), 60 deletions(-)
+ <optional> + <element name="catchup"> + <optional> + <attribute name="threshold"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="slew"> + <ref name="unsignedInt"/> + </attribute> + <attribute name="limit"> + <ref name="unsignedInt"/> + </attribute>
Are all three attributes mandatory as a group? Or is each attribute optional in isolation? The C code says the latter, which means this part has to be written:
<element name='catchup'> <optional> <attribute name='threshold'>... </optional> <optional> <attribute name='slew'>...
and so on.
I've fixed this, and
ACK with that fix; it might also be nice to add a testsuite addition that proves we handle 'threshold' without also having to specify 'slew' and 'limit'.
added some tests. The tests also showed that the <catchup> element was being formatted with a spurious space, so I fixed that too in this patch. Pushed now; Thanks. Peter

According to the documentation various timer options are only supported by certain timer types. Add a post parse check to verify that the user didn't specify invalid options. Also fix the qemu command line parsing function to set correct default values for the kvmclock timer so that it passes the new check. --- src/conf/domain_conf.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_command.c | 1 + 2 files changed, 56 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 512fe51..44bd149 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2924,6 +2924,61 @@ virDomainDefPostParseInternal(virDomainDefPtr def, if (virDomainDefRejectDuplicateControllers(def) < 0) return -1; + + /* verify settings of guest timers */ + for (i = 0; i < def->clock.ntimers; i++) { + virDomainTimerDefPtr timer = def->clock.timers[i]; + + if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK) { + if (timer->tickpolicy != -1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("timer %s doesn't support setting of " + "timer tickpolicy"), + virDomainTimerNameTypeToString(timer->name)); + return -1; + } + } + + if (timer->tickpolicy != VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP && + (timer->catchup.threshold != 0 || + timer->catchup.limit != 0 || + timer->catchup.slew != 0)) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("setting of timer catchup policies is only " + "supported with tickpolicy='catchup'")); + return -1; + } + + if (timer->name != VIR_DOMAIN_TIMER_NAME_TSC) { + if (timer->frequency != 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("timer %s doesn't support setting of " + "timer frequency"), + virDomainTimerNameTypeToString(timer->name)); + return -1; + } + + if (timer->mode != -1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("timer %s doesn't support setting of " + "timer mode"), + virDomainTimerNameTypeToString(timer->name)); + return -1; + } + } + + if (timer->name != VIR_DOMAIN_TIMER_NAME_PLATFORM && + timer->name != VIR_DOMAIN_TIMER_NAME_RTC) { + if (timer->track != -1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("timer %s doesn't support setting of " + "timer track"), + virDomainTimerNameTypeToString(timer->name)); + return -1; + } + } + } + return 0; } diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6cc32f9..dddd9d0 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10924,6 +10924,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom, dom->clock.timers[j]->present = present; dom->clock.timers[j]->tickpolicy = -1; dom->clock.timers[j]->track = -1; + dom->clock.timers[j]->mode = -1; dom->clock.ntimers++; } else if (dom->clock.timers[j]->present != -1 && dom->clock.timers[j]->present != present) { -- 1.8.5.3

On 02/07/2014 07:21 AM, Peter Krempa wrote:
According to the documentation various timer options are only supported by certain timer types. Add a post parse check to verify that the user didn't specify invalid options.
Also fix the qemu command line parsing function to set correct default values for the kvmclock timer so that it passes the new check. --- src/conf/domain_conf.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_command.c | 1 + 2 files changed, 56 insertions(+)
ACK -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Add a new <timer> for the HyperV reference time counter enlightenment and the iTSC reference page for Windows guests. This feature provides a paravirtual approach to track timer events for the guest (similar to kvmclock) with the option to use real hardware clock on systems with a iTSC with compensation across various hosts. --- docs/formatdomain.html.in | 7 ++++- docs/schemas/domaincommon.rng | 5 +++- src/conf/domain_conf.c | 6 +++-- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 30 ++++++++++++---------- .../qemuxml2argv-clock-timer-hyperv-rtc.args | 5 ++++ .../qemuxml2argv-clock-timer-hyperv-rtc.xml | 26 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index fd02864..64dd16a 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1367,7 +1367,12 @@ being modified, and can be one of "platform" (currently unsupported), "hpet" (libxl, xen, qemu), "kvmclock" (qemu), - "pit" (qemu), "rtc" (qemu), or "tsc" (libxl). + "pit" (qemu), "rtc" (qemu), "tsc" (libxl) or "hypervclock" + (qemu - <span class="since">since 1.2.2</span>). + + The <code>hypervclock</code> timer adds support for the + reference time counter and the reference TSC page feature + for guests running the Microsoft Windows operating system. </dd> <dt><code>track</code></dt> <dd> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 12fc0db..90525c2 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -915,7 +915,10 @@ </group> <group> <attribute name="name"> - <value>kvmclock</value> + <choice> + <value>kvmclock</value> + <value>hypervclock</value> + </choice> </attribute> </group> </choice> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 44bd149..e642733 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -726,7 +726,8 @@ VIR_ENUM_IMPL(virDomainTimerName, VIR_DOMAIN_TIMER_NAME_LAST, "rtc", "hpet", "tsc", - "kvmclock"); + "kvmclock", + "hypervclock"); VIR_ENUM_IMPL(virDomainTimerTrack, VIR_DOMAIN_TIMER_TRACK_LAST, "boot", @@ -2929,7 +2930,8 @@ virDomainDefPostParseInternal(virDomainDefPtr def, for (i = 0; i < def->clock.ntimers; i++) { virDomainTimerDefPtr timer = def->clock.timers[i]; - if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK) { + if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK || + timer->name == VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK) { if (timer->tickpolicy != -1) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("timer %s doesn't support setting of " diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9acb105..41aa457 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1750,6 +1750,7 @@ enum virDomainTimerNameType { VIR_DOMAIN_TIMER_NAME_HPET, VIR_DOMAIN_TIMER_NAME_TSC, VIR_DOMAIN_TIMER_NAME_KVMCLOCK, + VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK, VIR_DOMAIN_TIMER_NAME_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index dddd9d0..7b2b91b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6732,20 +6732,23 @@ qemuBuildCpuArgStr(virQEMUDriverPtr driver, } } - /* Now force kvmclock on/off based on the corresponding <timer> element. */ + /* Handle paravirtual timers */ for (i = 0; i < def->clock.ntimers; i++) { - if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK && - def->clock.timers[i]->present != -1) { - char sign; - if (def->clock.timers[i]->present) - sign = '+'; - else - sign = '-'; + virDomainTimerDefPtr timer = def->clock.timers[i]; + + if (timer->present == -1) + continue; + + if (timer->name == VIR_DOMAIN_TIMER_NAME_KVMCLOCK) { virBufferAsprintf(&buf, "%s,%ckvmclock", have_cpu ? "" : default_model, - sign); + timer->present ? '+' : '-'); + have_cpu = true; + } else if (timer->name == VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK && + timer->present) { + virBufferAsprintf(&buf, "%s,hv_time", + have_cpu ? "" : default_model); have_cpu = true; - break; } } @@ -8007,8 +8010,7 @@ qemuBuildCommandLine(virConnectPtr conn, } for (i = 0; i < def->clock.ntimers; i++) { - switch (def->clock.timers[i]->name) { - default: + switch ((enum virDomainTimerNameType) def->clock.timers[i]->name) { case VIR_DOMAIN_TIMER_NAME_PLATFORM: case VIR_DOMAIN_TIMER_NAME_TSC: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -8017,7 +8019,9 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: - /* This is handled when building -cpu. */ + case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK: + /* Timers above are handled when building -cpu. */ + case VIR_DOMAIN_TIMER_NAME_LAST: break; case VIR_DOMAIN_TIMER_NAME_RTC: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args b/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args new file mode 100644 index 0000000..1905875 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args @@ -0,0 +1,5 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/kvm -S -M pc \ +-cpu qemu32,hv_time -m 214 -smp 6 \ +-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot n -usb -net \ +none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml b/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml new file mode 100644 index 0000000..596e619 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml @@ -0,0 +1,26 @@ +<domain type='kvm'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>6</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='network'/> + </os> + <features> + <pae/> + </features> + <clock offset='utc'> + <timer name='hypervclock' present='yes'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/kvm</emulator> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index dae08d5..47813c1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -636,6 +636,7 @@ mymain(void) DO_TEST("cpu-kvmclock", QEMU_CAPS_ENABLE_KVM); DO_TEST("cpu-host-kvmclock", QEMU_CAPS_ENABLE_KVM, QEMU_CAPS_CPU_HOST); DO_TEST("kvmclock", QEMU_CAPS_KVM); + DO_TEST("clock-timer-hyperv-rtc", QEMU_CAPS_KVM); DO_TEST("cpu-eoi-disabled", QEMU_CAPS_ENABLE_KVM); DO_TEST("cpu-eoi-enabled", QEMU_CAPS_ENABLE_KVM); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 41d1904..e12a0ab 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -159,6 +159,7 @@ mymain(void) DO_TEST("cpu-kvmclock"); DO_TEST("cpu-host-kvmclock"); DO_TEST("kvmclock"); + DO_TEST("clock-timer-hyperv-rtc"); DO_TEST("cpu-eoi-disabled"); DO_TEST("cpu-eoi-enabled"); -- 1.8.5.3

On 02/07/2014 07:21 AM, Peter Krempa wrote:
Add a new <timer> for the HyperV reference time counter enlightenment and the iTSC reference page for Windows guests.
This feature provides a paravirtual approach to track timer events for the guest (similar to kvmclock) with the option to use real hardware clock on systems with a iTSC with compensation across various hosts.
iTSC twice here...
--- docs/formatdomain.html.in | 7 ++++- docs/schemas/domaincommon.rng | 5 +++- src/conf/domain_conf.c | 6 +++-- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 30 ++++++++++++---------- .../qemuxml2argv-clock-timer-hyperv-rtc.args | 5 ++++ .../qemuxml2argv-clock-timer-hyperv-rtc.xml | 26 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index fd02864..64dd16a 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1367,7 +1367,12 @@ being modified, and can be one of "platform" (currently unsupported), "hpet" (libxl, xen, qemu), "kvmclock" (qemu), - "pit" (qemu), "rtc" (qemu), or "tsc" (libxl). + "pit" (qemu), "rtc" (qemu), "tsc" (libxl) or "hypervclock" + (qemu - <span class="since">since 1.2.2</span>). + + The <code>hypervclock</code> timer adds support for the + reference time counter and the reference TSC page feature
but TSC here. Is the 'i' prefix part of the name? It looks like one of the two places needs changing, but I'm not sure which. ACK with that fixed. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 02/07/14 21:43, Eric Blake wrote:
On 02/07/2014 07:21 AM, Peter Krempa wrote:
Add a new <timer> for the HyperV reference time counter enlightenment and the iTSC reference page for Windows guests.
This feature provides a paravirtual approach to track timer events for the guest (similar to kvmclock) with the option to use real hardware clock on systems with a iTSC with compensation across various hosts.
iTSC twice here...
--- docs/formatdomain.html.in | 7 ++++- docs/schemas/domaincommon.rng | 5 +++- src/conf/domain_conf.c | 6 +++-- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 30 ++++++++++++---------- .../qemuxml2argv-clock-timer-hyperv-rtc.args | 5 ++++ .../qemuxml2argv-clock-timer-hyperv-rtc.xml | 26 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 9 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-clock-timer-hyperv-rtc.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index fd02864..64dd16a 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1367,7 +1367,12 @@ being modified, and can be one of "platform" (currently unsupported), "hpet" (libxl, xen, qemu), "kvmclock" (qemu), - "pit" (qemu), "rtc" (qemu), or "tsc" (libxl). + "pit" (qemu), "rtc" (qemu), "tsc" (libxl) or "hypervclock" + (qemu - <span class="since">since 1.2.2</span>). + + The <code>hypervclock</code> timer adds support for the + reference time counter and the reference TSC page feature
but TSC here. Is the 'i' prefix part of the name? It looks like one of the two places needs changing, but I'm not sure which.
iTSC is correct. It stands for invariant TSC - a TSC that has a constant rate even if the CPU changes frequency. The rate and actual count is also equal across cpus. I've fixed the shortcut.
ACK with that fixed.
Pushed; Thanks. Peter
participants (2)
-
Eric Blake
-
Peter Krempa