qemuMonitorCPUModelInfo: Add support for non-migratable features

QEMU is able to tell us whether a CPU feature would block migration or
not. This patch adds support for storing such features in
qemuMonitorCPUModelInfo.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
Jiri Denemark 2017-03-29 10:33:08 +02:00
parent 8a91e85382
commit 03a6a0dbe0
5 changed files with 41 additions and 8 deletions

View File

@ -3272,6 +3272,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
int ret = -1; int ret = -1;
size_t i; size_t i;
int n; int n;
int val;
if (virtType == VIR_DOMAIN_VIRT_KVM) if (virtType == VIR_DOMAIN_VIRT_KVM)
hostCPUNode = virXPathNode("./hostCPU[@type='kvm']", ctxt); hostCPUNode = virXPathNode("./hostCPU[@type='kvm']", ctxt);
@ -3293,6 +3294,15 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
goto cleanup; goto cleanup;
} }
if (!(str = virXMLPropString(hostCPUNode, "migratability")) ||
(val = virTristateBoolTypeFromString(str)) <= 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("invalid migratability value for host CPU model"));
goto cleanup;
}
hostCPU->migratability = val == VIR_TRISTATE_BOOL_YES;
VIR_FREE(str);
ctxt->node = hostCPUNode; ctxt->node = hostCPUNode;
if ((n = virXPathNodeSet("./property", ctxt, &nodes)) > 0) { if ((n = virXPathNodeSet("./property", ctxt, &nodes)) > 0) {
@ -3303,7 +3313,6 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
qemuMonitorCPUPropertyPtr prop = hostCPU->props + i; qemuMonitorCPUPropertyPtr prop = hostCPU->props + i;
int type;
ctxt->node = nodes[i]; ctxt->node = nodes[i];
@ -3315,7 +3324,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
} }
if (!(str = virXMLPropString(ctxt->node, "type")) || if (!(str = virXMLPropString(ctxt->node, "type")) ||
(type = qemuMonitorCPUPropertyTypeFromString(str)) < 0) { (val = qemuMonitorCPUPropertyTypeFromString(str)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing or invalid CPU model property type " _("missing or invalid CPU model property type "
"in QEMU capabilities cache")); "in QEMU capabilities cache"));
@ -3323,7 +3332,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
} }
VIR_FREE(str); VIR_FREE(str);
prop->type = type; prop->type = val;
switch (prop->type) { switch (prop->type) {
case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN:
if (virXPathBoolean("./@value='true'", ctxt)) if (virXPathBoolean("./@value='true'", ctxt))
@ -3355,6 +3364,19 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
case QEMU_MONITOR_CPU_PROPERTY_LAST: case QEMU_MONITOR_CPU_PROPERTY_LAST:
break; break;
} }
if ((str = virXMLPropString(ctxt->node, "migratable"))) {
if ((val = virTristateBoolTypeFromString(str)) <= 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown migratable value for '%s' host "
"CPU model property"),
prop->name);
goto cleanup;
}
prop->migratable = val;
VIR_FREE(str);
}
} }
} }
@ -3707,8 +3729,10 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
if (!model) if (!model)
return; return;
virBufferAsprintf(buf, "<hostCPU type='%s' model='%s'>\n", virBufferAsprintf(buf,
typeStr, model->name); "<hostCPU type='%s' model='%s' migratability='%s'>\n",
typeStr, model->name,
model->migratability ? "yes" : "no");
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
for (i = 0; i < model->nprops; i++) { for (i = 0; i < model->nprops; i++) {
@ -3735,6 +3759,11 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
case QEMU_MONITOR_CPU_PROPERTY_LAST: case QEMU_MONITOR_CPU_PROPERTY_LAST:
break; break;
} }
if (prop->migratable > 0)
virBufferAsprintf(buf, " migratable='%s'",
virTristateBoolTypeToString(prop->migratable));
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }

View File

@ -3747,12 +3747,14 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig)
if (VIR_STRDUP(copy->name, orig->name) < 0) if (VIR_STRDUP(copy->name, orig->name) < 0)
goto error; goto error;
copy->migratability = orig->migratability;
copy->nprops = orig->nprops; copy->nprops = orig->nprops;
for (i = 0; i < orig->nprops; i++) { for (i = 0; i < orig->nprops; i++) {
if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0) if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0)
goto error; goto error;
copy->props[i].migratable = orig->props[i].migratable;
copy->props[i].type = orig->props[i].type; copy->props[i].type = orig->props[i].type;
switch (orig->props[i].type) { switch (orig->props[i].type) {
case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN:

View File

@ -992,6 +992,7 @@ struct _qemuMonitorCPUProperty {
char *string; char *string;
long long number; long long number;
} value; } value;
virTristateBool migratable;
}; };
typedef struct _qemuMonitorCPUModelInfo qemuMonitorCPUModelInfo; typedef struct _qemuMonitorCPUModelInfo qemuMonitorCPUModelInfo;
@ -1001,6 +1002,7 @@ struct _qemuMonitorCPUModelInfo {
char *name; char *name;
size_t nprops; size_t nprops;
qemuMonitorCPUPropertyPtr props; qemuMonitorCPUPropertyPtr props;
bool migratability;
}; };
typedef enum { typedef enum {

View File

@ -136,7 +136,7 @@
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package></package> <package></package>
<arch>s390x</arch> <arch>s390x</arch>
<hostCPU type='kvm' model='zEC12.2-base'> <hostCPU type='kvm' model='zEC12.2-base' migratability='no'>
<property name='aefsi' type='boolean' value='true'/> <property name='aefsi' type='boolean' value='true'/>
<property name='msa5' type='boolean' value='true'/> <property name='msa5' type='boolean' value='true'/>
<property name='msa4' type='boolean' value='true'/> <property name='msa4' type='boolean' value='true'/>

View File

@ -211,7 +211,7 @@
<kvmVersion>0</kvmVersion> <kvmVersion>0</kvmVersion>
<package> (v2.9.0-rc0-142-g940a8ce)</package> <package> (v2.9.0-rc0-142-g940a8ce)</package>
<arch>x86_64</arch> <arch>x86_64</arch>
<hostCPU type='kvm' model='base'> <hostCPU type='kvm' model='base' migratability='no'>
<property name='phys-bits' type='number' value='0'/> <property name='phys-bits' type='number' value='0'/>
<property name='core-id' type='number' value='-1'/> <property name='core-id' type='number' value='-1'/>
<property name='xlevel' type='number' value='2147483656'/> <property name='xlevel' type='number' value='2147483656'/>
@ -443,7 +443,7 @@
<property name='avx512pf' type='boolean' value='false'/> <property name='avx512pf' type='boolean' value='false'/>
<property name='xstore-en' type='boolean' value='false'/> <property name='xstore-en' type='boolean' value='false'/>
</hostCPU> </hostCPU>
<hostCPU type='tcg' model='base'> <hostCPU type='tcg' model='base' migratability='no'>
<property name='phys-bits' type='number' value='0'/> <property name='phys-bits' type='number' value='0'/>
<property name='core-id' type='number' value='-1'/> <property name='core-id' type='number' value='-1'/>
<property name='xlevel' type='number' value='2147483658'/> <property name='xlevel' type='number' value='2147483658'/>