}
-virDomainCapsCPUModelsPtr
+int
virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
- virArch arch)
+ virArch arch,
+ virDomainCapsCPUModelsPtr *cpuModels)
{
virDomainCapsCPUModelsPtr models = NULL;
qemuMonitorCPUDefInfoPtr *cpus = NULL;
int ncpus = 0;
size_t i;
+ int ret = -1;
+
+ *cpuModels = NULL;
if ((ncpus = qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0)
- return NULL;
+ return -1;
+
+ if (ncpus == 0) {
+ ret = 0;
+ goto cleanup;
+ }
/* QEMU 2.11 for Power renamed all CPU models to lower case, we need to
* translate them back to libvirt's upper case model names. */
char **name;
if (virCPUGetModels(arch, &libvirtModels) < 0)
- goto error;
+ goto cleanup;
for (name = libvirtModels; name && *name; name++) {
for (i = 0; i < ncpus; i++) {
}
if (!(models = virDomainCapsCPUModelsNew(ncpus)))
- goto error;
+ goto cleanup;
for (i = 0; i < ncpus; i++) {
virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable,
&cpus[i]->blockers) < 0)
- goto error;
+ goto cleanup;
}
+ *cpuModels = g_steal_pointer(&models);
+ ret = 0;
+
cleanup:
for (i = 0; i < ncpus; i++)
qemuMonitorCPUDefInfoFree(cpus[i]);
VIR_FREE(cpus);
- return models;
-
- error:
virObjectUnref(models);
- models = NULL;
- goto cleanup;
+ return ret;
}
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS))
return 0;
- if (!(models = virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch)))
+ if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &models) < 0)
return -1;
if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
virDomainVirtType type,
const char **modelWhitelist,
const char **modelBlacklist);
-virDomainCapsCPUModelsPtr virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
- virArch arch);
+int virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
+ virArch arch,
+ virDomainCapsCPUModelsPtr *cpuModels);
typedef enum {
/* Host CPU definition reported in domain capabilities. */
}
-static virDomainCapsCPUModelsPtr
+static int
qemuProcessFetchCPUDefinitions(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- qemuDomainAsyncJob asyncJob)
+ qemuDomainAsyncJob asyncJob,
+ virDomainCapsCPUModelsPtr *cpuModels)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainCapsCPUModelsPtr models = NULL;
+ int rc;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto error;
- models = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch);
+ rc = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch, &models);
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
goto error;
- return models;
+ *cpuModels = models;
+ return 0;
error:
virObjectUnref(models);
- return NULL;
+ return -1;
}
if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
goto cleanup;
- if (!(models = qemuProcessFetchCPUDefinitions(driver, vm, asyncJob)) ||
+ if (qemuProcessFetchCPUDefinitions(driver, vm, asyncJob, &models) < 0 ||
virCPUTranslate(vm->def->os.arch, vm->def->cpu, models) < 0)
goto cleanup;