1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-20 06:50:22 +03:00

domain: add tsc.on_reboot element

Some versions of Windows hang on reboot if their TSC value is greater
than 2^54.  The workaround is to reset the TSC to a small value.  Add
to the domain configuration an attribute for this.  It can be used
by QEMU and in principle also by ESXi, which has a property called
monitor_control.enable_softResetClearTSC as well.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Paolo Bonzini 2022-03-24 10:48:38 +01:00 committed by Michal Privoznik
parent 5cef757875
commit 150540394d
4 changed files with 39 additions and 0 deletions

View File

@ -2243,6 +2243,10 @@ Windows, however, expects it to be in so called 'localtime'.
``frequency``
The ``frequency`` attribute is an unsigned integer specifying the
frequency at which ``name="tsc"`` runs.
``on_reboot``
The ``on_reboot`` attribute controls how the ``name="tsc"`` timer behaves
when the VM is reset, and can be "default", "clear" or "keep". The reset
behavior of other timers is hardcoded, and depends on the type of timer.
``mode``
The ``mode`` attribute controls how the ``name="tsc"`` timer is managed,
and can be "auto", "native", "emulate", "paravirt", or "smpsafe". Other

View File

@ -1217,6 +1217,13 @@ VIR_ENUM_IMPL(virDomainTimerMode,
"smpsafe",
);
VIR_ENUM_IMPL(virDomainTimerRebootMode,
VIR_DOMAIN_TIMER_REBOOT_MODE_LAST,
"default",
"keep",
"clear",
);
VIR_ENUM_IMPL(virDomainStartupPolicy,
VIR_DOMAIN_STARTUP_POLICY_LAST,
"default",
@ -12080,6 +12087,11 @@ virDomainTimerDefParseXML(xmlNodePtr node,
}
}
if (virXMLPropEnum(node, "on_reboot",
virDomainTimerRebootModeTypeFromString,
VIR_XML_PROP_NONZERO, &def->reboot) < 0)
goto error;
catchup = virXPathNode("./catchup", ctxt);
if (catchup != NULL) {
ret = virXPathULong("string(./catchup/@threshold)", ctxt,
@ -26158,6 +26170,11 @@ virDomainTimerDefFormat(virBuffer *buf,
virBufferAsprintf(&timerAttr, " mode='%s'",
virDomainTimerModeTypeToString(def->mode));
}
if (def->reboot) {
virBufferAsprintf(&timerAttr, " on_reboot='%s'",
virDomainTimerRebootModeTypeToString(def->mode));
}
}
if (def->catchup.threshold > 0)

View File

@ -2408,6 +2408,14 @@ typedef enum {
VIR_DOMAIN_TIMER_MODE_LAST
} virDomainTimerModeType;
typedef enum {
VIR_DOMAIN_TIMER_REBOOT_MODE_DEFAULT = 0,
VIR_DOMAIN_TIMER_REBOOT_MODE_KEEP,
VIR_DOMAIN_TIMER_REBOOT_MODE_CLEAR,
VIR_DOMAIN_TIMER_REBOOT_MODE_LAST
} virDomainTimerRebootModeType;
typedef enum {
VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC = 0,
VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO,
@ -2439,6 +2447,7 @@ struct _virDomainTimerDef {
/* frequency & mode are only valid for name='tsc' */
unsigned long long frequency; /* in Hz, unspecified = 0 */
int mode; /* enum virDomainTimerModeType */
virDomainTimerRebootModeType reboot;
};
typedef enum {
@ -4033,6 +4042,7 @@ VIR_ENUM_DECL(virDomainClockBasis);
VIR_ENUM_DECL(virDomainTimerName);
VIR_ENUM_DECL(virDomainTimerTrack);
VIR_ENUM_DECL(virDomainTimerTickpolicy);
VIR_ENUM_DECL(virDomainTimerRebootMode);
VIR_ENUM_DECL(virDomainTimerMode);
VIR_ENUM_DECL(virDomainCpuPlacementMode);

View File

@ -1292,6 +1292,14 @@
<ref name="unsignedLong"/>
</attribute>
</optional>
<optional>
<attribute name="on_reboot">
<choice>
<value>clear</value>
<value>keep</value>
</choice>
</attribute>
</optional>
<optional>
<attribute name="mode">
<choice>