提交 bc0b2288 编写于 作者: J Jiri Denemark

qemu: Switch qemuCaps to use qemuMonitorCPUDefs

We will need to keep some QEMU-specific data for each CPU model
supported by a QEMU binary. Instead of complicating the generic
virDomainCapsCPUModelsPtr, we can just directly store
qemuMonitorCPUDefsPtr returned by the capabilities probing code.
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 857b88f5
...@@ -610,8 +610,8 @@ struct _virQEMUCaps { ...@@ -610,8 +610,8 @@ struct _virQEMUCaps {
virArch arch; virArch arch;
virHashTablePtr domCapsCache; virHashTablePtr domCapsCache;
virDomainCapsCPUModelsPtr kvmCPUModels; qemuMonitorCPUDefsPtr kvmCPUModels;
virDomainCapsCPUModelsPtr tcgCPUModels; qemuMonitorCPUDefsPtr tcgCPUModels;
size_t nmachineTypes; size_t nmachineTypes;
struct virQEMUCapsMachineType *machineTypes; struct virQEMUCapsMachineType *machineTypes;
...@@ -1620,17 +1620,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) ...@@ -1620,17 +1620,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
ret->arch = qemuCaps->arch; ret->arch = qemuCaps->arch;
if (qemuCaps->kvmCPUModels) { ret->kvmCPUModels = qemuMonitorCPUDefsCopy(qemuCaps->kvmCPUModels);
ret->kvmCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->kvmCPUModels); ret->tcgCPUModels = qemuMonitorCPUDefsCopy(qemuCaps->tcgCPUModels);
if (!ret->kvmCPUModels)
goto error;
}
if (qemuCaps->tcgCPUModels) {
ret->tcgCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->tcgCPUModels);
if (!ret->tcgCPUModels)
goto error;
}
if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 || if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 ||
virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0) virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0)
...@@ -1855,26 +1846,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, ...@@ -1855,26 +1846,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainCapsCPUUsable usable) virDomainCapsCPUUsable usable)
{ {
size_t i; size_t i;
virDomainCapsCPUModelsPtr cpus = NULL; size_t start;
qemuMonitorCPUDefsPtr defs = NULL;
if (type == VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels) if (type == VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels)
cpus = qemuCaps->kvmCPUModels; defs = qemuCaps->kvmCPUModels;
else if (type == VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels) else if (type == VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels)
cpus = qemuCaps->tcgCPUModels; defs = qemuCaps->tcgCPUModels;
if (defs) {
start = defs->ncpus;
if (!cpus) { if (VIR_EXPAND_N(defs->cpus, defs->ncpus, count) < 0)
if (!(cpus = virDomainCapsCPUModelsNew(count))) return -1;
} else {
start = 0;
if (!(defs = qemuMonitorCPUDefsNew(count)))
return -1; return -1;
if (type == VIR_DOMAIN_VIRT_KVM) if (type == VIR_DOMAIN_VIRT_KVM)
qemuCaps->kvmCPUModels = cpus; qemuCaps->kvmCPUModels = defs;
else else
qemuCaps->tcgCPUModels = cpus; qemuCaps->tcgCPUModels = defs;
} }
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0) qemuMonitorCPUDefInfoPtr cpu = defs->cpus + start + i;
return -1;
cpu->usable = usable;
cpu->name = g_strdup(name[i]);
} }
return 0; return 0;
...@@ -1916,20 +1917,17 @@ virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -1916,20 +1917,17 @@ virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps,
const char **modelWhitelist, const char **modelWhitelist,
const char **modelBlacklist) const char **modelBlacklist)
{ {
virDomainCapsCPUModelsPtr cpuModels; qemuMonitorCPUDefsPtr defs;
if (type == VIR_DOMAIN_VIRT_KVM) if (type == VIR_DOMAIN_VIRT_KVM)
cpuModels = qemuCaps->kvmCPUModels; defs = qemuCaps->kvmCPUModels;
else else
cpuModels = qemuCaps->tcgCPUModels; defs = qemuCaps->tcgCPUModels;
if (!cpuModels) if (!defs)
return NULL; return NULL;
if (modelWhitelist || modelBlacklist) return virQEMUCapsCPUDefsToModels(defs, modelWhitelist, modelBlacklist);
return virDomainCapsCPUModelsFilter(cpuModels, modelWhitelist, modelBlacklist);
return virDomainCapsCPUModelsCopy(cpuModels);
} }
...@@ -1989,7 +1987,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, ...@@ -1989,7 +1987,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virDomainVirtType type, virDomainVirtType type,
virCPUMode mode) virCPUMode mode)
{ {
virDomainCapsCPUModelsPtr cpus; qemuMonitorCPUDefsPtr cpus;
switch (mode) { switch (mode) {
case VIR_CPU_MODE_HOST_PASSTHROUGH: case VIR_CPU_MODE_HOST_PASSTHROUGH:
...@@ -2005,7 +2003,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, ...@@ -2005,7 +2003,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
cpus = qemuCaps->kvmCPUModels; cpus = qemuCaps->kvmCPUModels;
else else
cpus = qemuCaps->tcgCPUModels; cpus = qemuCaps->tcgCPUModels;
return cpus && cpus->nmodels > 0; return cpus && cpus->ncpus > 0;
case VIR_CPU_MODE_LAST: case VIR_CPU_MODE_LAST:
break; break;
...@@ -2535,18 +2533,18 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps, ...@@ -2535,18 +2533,18 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
qemuMonitorPtr mon, qemuMonitorPtr mon,
bool tcg) bool tcg)
{ {
virDomainCapsCPUModelsPtr models = NULL; qemuMonitorCPUDefsPtr defs = NULL;
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS)) if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS))
return 0; return 0;
if (virQEMUCapsFetchCPUModels(mon, qemuCaps->arch, &models) < 0) if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &defs) < 0)
return -1; return -1;
if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
qemuCaps->tcgCPUModels = models; qemuCaps->tcgCPUModels = defs;
else else
qemuCaps->kvmCPUModels = models; qemuCaps->kvmCPUModels = defs;
return 0; return 0;
} }
...@@ -3487,7 +3485,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3487,7 +3485,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
xmlXPathContextPtr ctxt, xmlXPathContextPtr ctxt,
virDomainVirtType type) virDomainVirtType type)
{ {
virDomainCapsCPUModelsPtr cpus = NULL; g_autoptr(qemuMonitorCPUDefs) defs = NULL;
g_autofree xmlNodePtr * nodes = NULL; g_autofree xmlNodePtr * nodes = NULL;
size_t i; size_t i;
int n; int n;
...@@ -3507,20 +3505,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3507,20 +3505,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
if (n == 0) if (n == 0)
return 0; return 0;
if (!(cpus = virDomainCapsCPUModelsNew(n))) if (!(defs = qemuMonitorCPUDefsNew(n)))
return -1; return -1;
if (type == VIR_DOMAIN_VIRT_KVM)
qemuCaps->kvmCPUModels = cpus;
else
qemuCaps->tcgCPUModels = cpus;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i;
int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
g_autofree char * strUsable = NULL; g_autofree char * strUsable = NULL;
g_autofree char * name = NULL;
g_autofree xmlNodePtr * blockerNodes = NULL; g_autofree xmlNodePtr * blockerNodes = NULL;
VIR_AUTOSTRINGLIST blockers = NULL;
int nblockers; int nblockers;
if ((strUsable = virXMLPropString(nodes[i], "usable")) && if ((strUsable = virXMLPropString(nodes[i], "usable")) &&
...@@ -3530,8 +3522,9 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3530,8 +3522,9 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
strUsable); strUsable);
return -1; return -1;
} }
cpu->usable = usable;
if (!(name = virXMLPropString(nodes[i], "name"))) { if (!(cpu->name = virXMLPropString(nodes[i], "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing cpu name in QEMU capabilities cache")); _("missing cpu name in QEMU capabilities cache"));
return -1; return -1;
...@@ -3551,11 +3544,11 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3551,11 +3544,11 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
if (nblockers > 0) { if (nblockers > 0) {
size_t j; size_t j;
if (VIR_ALLOC_N(blockers, nblockers + 1) < 0) if (VIR_ALLOC_N(cpu->blockers, nblockers + 1) < 0)
return -1; return -1;
for (j = 0; j < nblockers; j++) { for (j = 0; j < nblockers; j++) {
if (!(blockers[j] = virXMLPropString(blockerNodes[j], "name"))) { if (!(cpu->blockers[j] = virXMLPropString(blockerNodes[j], "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing blocker name in QEMU " _("missing blocker name in QEMU "
"capabilities cache")); "capabilities cache"));
...@@ -3563,11 +3556,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3563,11 +3556,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
} }
} }
} }
if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0)
return -1;
} }
if (type == VIR_DOMAIN_VIRT_KVM)
qemuCaps->kvmCPUModels = g_steal_pointer(&defs);
else
qemuCaps->tcgCPUModels = g_steal_pointer(&defs);
return 0; return 0;
} }
...@@ -3976,23 +3971,23 @@ virQEMUCapsFormatCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -3976,23 +3971,23 @@ virQEMUCapsFormatCPUModels(virQEMUCapsPtr qemuCaps,
virBufferPtr buf, virBufferPtr buf,
virDomainVirtType type) virDomainVirtType type)
{ {
virDomainCapsCPUModelsPtr cpus; qemuMonitorCPUDefsPtr defs;
const char *typeStr; const char *typeStr;
size_t i; size_t i;
if (type == VIR_DOMAIN_VIRT_KVM) { if (type == VIR_DOMAIN_VIRT_KVM) {
typeStr = "kvm"; typeStr = "kvm";
cpus = qemuCaps->kvmCPUModels; defs = qemuCaps->kvmCPUModels;
} else { } else {
typeStr = "tcg"; typeStr = "tcg";
cpus = qemuCaps->tcgCPUModels; defs = qemuCaps->tcgCPUModels;
} }
if (!cpus) if (!defs)
return; return;
for (i = 0; i < cpus->nmodels; i++) { for (i = 0; i < defs->ncpus; i++) {
virDomainCapsCPUModelPtr cpu = cpus->models + i; qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i;
virBufferAsprintf(buf, "<cpu type='%s' ", typeStr); virBufferAsprintf(buf, "<cpu type='%s' ", typeStr);
virBufferEscapeString(buf, "name='%s'", cpu->name); virBufferEscapeString(buf, "name='%s'", cpu->name);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册