From 03a6a0dbe0a4ed59191c599c2d3fdba6fb423d9c Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Wed, 29 Mar 2017 10:33:08 +0200 Subject: [PATCH] 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 --- src/qemu/qemu_capabilities.c | 39 ++++++++++++++++--- src/qemu/qemu_monitor.c | 2 + src/qemu/qemu_monitor.h | 2 + .../qemucapabilitiesdata/caps_2.8.0.s390x.xml | 2 +- .../caps_2.9.0.x86_64.xml | 4 +- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index f51141b990..446c15f92c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3272,6 +3272,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, int ret = -1; size_t i; int n; + int val; if (virtType == VIR_DOMAIN_VIRT_KVM) hostCPUNode = virXPathNode("./hostCPU[@type='kvm']", ctxt); @@ -3293,6 +3294,15 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, 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; if ((n = virXPathNodeSet("./property", ctxt, &nodes)) > 0) { @@ -3303,7 +3313,6 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, for (i = 0; i < n; i++) { qemuMonitorCPUPropertyPtr prop = hostCPU->props + i; - int type; ctxt->node = nodes[i]; @@ -3315,7 +3324,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, } if (!(str = virXMLPropString(ctxt->node, "type")) || - (type = qemuMonitorCPUPropertyTypeFromString(str)) < 0) { + (val = qemuMonitorCPUPropertyTypeFromString(str)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing or invalid CPU model property type " "in QEMU capabilities cache")); @@ -3323,7 +3332,7 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, } VIR_FREE(str); - prop->type = type; + prop->type = val; switch (prop->type) { case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: if (virXPathBoolean("./@value='true'", ctxt)) @@ -3355,6 +3364,19 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, case QEMU_MONITOR_CPU_PROPERTY_LAST: 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) return; - virBufferAsprintf(buf, "\n", - typeStr, model->name); + virBufferAsprintf(buf, + "\n", + typeStr, model->name, + model->migratability ? "yes" : "no"); virBufferAdjustIndent(buf, 2); for (i = 0; i < model->nprops; i++) { @@ -3735,6 +3759,11 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps, case QEMU_MONITOR_CPU_PROPERTY_LAST: break; } + + if (prop->migratable > 0) + virBufferAsprintf(buf, " migratable='%s'", + virTristateBoolTypeToString(prop->migratable)); + virBufferAddLit(buf, "/>\n"); } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 78d9cb7529..e9ba5fdea7 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3747,12 +3747,14 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) if (VIR_STRDUP(copy->name, orig->name) < 0) goto error; + copy->migratability = orig->migratability; copy->nprops = orig->nprops; for (i = 0; i < orig->nprops; i++) { if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0) goto error; + copy->props[i].migratable = orig->props[i].migratable; copy->props[i].type = orig->props[i].type; switch (orig->props[i].type) { case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN: diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 87a1496cf7..3326521781 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -992,6 +992,7 @@ struct _qemuMonitorCPUProperty { char *string; long long number; } value; + virTristateBool migratable; }; typedef struct _qemuMonitorCPUModelInfo qemuMonitorCPUModelInfo; @@ -1001,6 +1002,7 @@ struct _qemuMonitorCPUModelInfo { char *name; size_t nprops; qemuMonitorCPUPropertyPtr props; + bool migratability; }; typedef enum { diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml index d49f0fbd16..42c92c5675 100644 --- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml @@ -136,7 +136,7 @@ 0 s390x - + diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml index bb54634697..0b14e53e2a 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml @@ -211,7 +211,7 @@ 0 (v2.9.0-rc0-142-g940a8ce) x86_64 - + @@ -443,7 +443,7 @@ - + -- 2.39.5