mirror of https://gitee.com/openkylin/libvirt.git
conf: Introduce migratable attribute for the <cpu> element
The attribute is only allowed for host-passthrough CPUs and it can be used to request only migratable or all supported features to be enabled in the virtual CPU. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
f48bdbdfe4
commit
524f5f00e7
|
@ -1490,7 +1490,7 @@
|
||||||
...</pre>
|
...</pre>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<cpu mode='host-passthrough'>
|
<cpu mode='host-passthrough' migratable='off'>
|
||||||
<cache mode='passthrough'/>
|
<cache mode='passthrough'/>
|
||||||
<feature policy='disable' name='lahf_lm'/>
|
<feature policy='disable' name='lahf_lm'/>
|
||||||
...</pre>
|
...</pre>
|
||||||
|
@ -1639,7 +1639,17 @@
|
||||||
using host-passthrough is dangerous if the source and destination hosts
|
using host-passthrough is dangerous if the source and destination hosts
|
||||||
are not identical in both hardware, QEMU version, microcode version
|
are not identical in both hardware, QEMU version, microcode version
|
||||||
and configuration. If such a migration is attempted then the guest may
|
and configuration. If such a migration is attempted then the guest may
|
||||||
hang or crash upon resuming execution on the destination host.</dd>
|
hang or crash upon resuming execution on the destination host.
|
||||||
|
Depending on hypervisor version the virtual CPU may or may not
|
||||||
|
contain features which may block migration even to an identical host.
|
||||||
|
<span class="since">Since 6.5.0</span> optional
|
||||||
|
<code>migratable</code> attribute may be used to explicitly request
|
||||||
|
such features to be removed from (<code>on</code>) or kept in
|
||||||
|
(<code>off</code>) the virtual CPU. This attribute does not make
|
||||||
|
migration to another host safer: even with
|
||||||
|
<code>migratable='on'</code> migration will be dangerous unless both
|
||||||
|
hosts are identical as described above.
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
Both <code>host-model</code> and <code>host-passthrough</code> modes
|
Both <code>host-model</code> and <code>host-passthrough</code> modes
|
||||||
|
|
|
@ -5469,6 +5469,11 @@
|
||||||
<optional>
|
<optional>
|
||||||
<ref name="cpuCheck"/>
|
<ref name="cpuCheck"/>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<attribute name="migratable">
|
||||||
|
<ref name="virOnOff"/>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
<interleave>
|
<interleave>
|
||||||
<optional>
|
<optional>
|
||||||
<ref name="cpuModel"/>
|
<ref name="cpuModel"/>
|
||||||
|
|
|
@ -243,6 +243,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu)
|
||||||
copy->cores = cpu->cores;
|
copy->cores = cpu->cores;
|
||||||
copy->threads = cpu->threads;
|
copy->threads = cpu->threads;
|
||||||
copy->arch = cpu->arch;
|
copy->arch = cpu->arch;
|
||||||
|
copy->migratable = cpu->migratable;
|
||||||
|
|
||||||
if (cpu->cache) {
|
if (cpu->cache) {
|
||||||
if (VIR_ALLOC(copy->cache) < 0)
|
if (VIR_ALLOC(copy->cache) < 0)
|
||||||
|
@ -333,6 +334,7 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
|
||||||
g_autofree char *fallback = NULL;
|
g_autofree char *fallback = NULL;
|
||||||
g_autofree char *vendor_id = NULL;
|
g_autofree char *vendor_id = NULL;
|
||||||
g_autofree char *tscScaling = NULL;
|
g_autofree char *tscScaling = NULL;
|
||||||
|
g_autofree char *migratable = NULL;
|
||||||
virHostCPUTscInfoPtr tsc = NULL;
|
virHostCPUTscInfoPtr tsc = NULL;
|
||||||
|
|
||||||
*cpu = NULL;
|
*cpu = NULL;
|
||||||
|
@ -386,6 +388,26 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
|
||||||
def->mode = VIR_CPU_MODE_CUSTOM;
|
def->mode = VIR_CPU_MODE_CUSTOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((migratable = virXMLPropString(ctxt->node, "migratable"))) {
|
||||||
|
int val;
|
||||||
|
|
||||||
|
if (def->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Attribute migratable is only allowed for "
|
||||||
|
"host-passthrough CPU"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((val = virTristateSwitchTypeFromString(migratable)) < 0) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("Invalid value in migratable attribute: '%s'"),
|
||||||
|
migratable);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
def->migratable = val;
|
||||||
|
}
|
||||||
|
|
||||||
if (def->type == VIR_CPU_TYPE_GUEST) {
|
if (def->type == VIR_CPU_TYPE_GUEST) {
|
||||||
g_autofree char *match = virXMLPropString(ctxt->node, "match");
|
g_autofree char *match = virXMLPropString(ctxt->node, "match");
|
||||||
g_autofree char *check = NULL;
|
g_autofree char *check = NULL;
|
||||||
|
@ -698,6 +720,11 @@ virCPUDefFormatBufFull(virBufferPtr buf,
|
||||||
virBufferAsprintf(&attributeBuf, " check='%s'",
|
virBufferAsprintf(&attributeBuf, " check='%s'",
|
||||||
virCPUCheckTypeToString(def->check));
|
virCPUCheckTypeToString(def->check));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (def->mode == VIR_CPU_MODE_HOST_PASSTHROUGH && def->migratable) {
|
||||||
|
virBufferAsprintf(&attributeBuf, " migratable='%s'",
|
||||||
|
virTristateSwitchTypeToString(def->migratable));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Format children */
|
/* Format children */
|
||||||
|
|
|
@ -141,6 +141,7 @@ struct _virCPUDef {
|
||||||
virCPUFeatureDefPtr features;
|
virCPUFeatureDefPtr features;
|
||||||
virCPUCacheDefPtr cache;
|
virCPUCacheDefPtr cache;
|
||||||
virHostCPUTscInfoPtr tsc;
|
virHostCPUTscInfoPtr tsc;
|
||||||
|
virTristateSwitch migratable; /* for host-passthrough mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
virCPUDefPtr virCPUDefNew(void);
|
virCPUDefPtr virCPUDefNew(void);
|
||||||
|
|
Loading…
Reference in New Issue