From 1bc8484326ef363dac8ab33fd2a498dae732f492 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Tue, 14 Jun 2016 11:12:49 +0200 Subject: [PATCH] cpu: Special case models == NULL in cpuGetModels Some CPU drivers (such as arm) do not provide list of CPUs libvirt supports and just pass any CPU model from domain XML directly to QEMU. Such driver need to return models == NULL and success from cpuGetModels. Signed-off-by: Jiri Denemark --- src/cpu/cpu.c | 15 +++++++++------ src/libvirt-host.c | 3 ++- tools/virsh-host.c | 10 +++++++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 19afeab7b9..d2b7ce3da9 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -750,9 +750,13 @@ cpuModelIsAllowed(const char *model, * @arch: CPU architecture * @models: where to store the NULL-terminated list of supported models * - * Fetches all CPU models supported by libvirt on @archName. + * Fetches all CPU models supported by libvirt on @archName. If there are + * no restrictions on CPU models on @archName (i.e., the CPU model is just + * passed directly to a hypervisor), this function returns 0 and sets + * @models to NULL. * - * Returns number of supported CPU models or -1 on error. + * Returns number of supported CPU models, 0 if any CPU model is supported, + * or -1 on error. */ int cpuGetModels(virArch arch, char ***models) @@ -770,10 +774,9 @@ cpuGetModels(virArch arch, char ***models) } if (!driver->getModels) { - virReportError(VIR_ERR_NO_SUPPORT, - _("CPU driver for %s has no CPU model support"), - virArchToString(arch)); - return -1; + if (models) + *models = NULL; + return 0; } return driver->getModels(models); diff --git a/src/libvirt-host.c b/src/libvirt-host.c index 2a3de03115..335798abf7 100644 --- a/src/libvirt-host.c +++ b/src/libvirt-host.c @@ -1005,7 +1005,8 @@ virConnectCompareCPU(virConnectPtr conn, * * Get the list of supported CPU models for a specific architecture. * - * Returns -1 on error, number of elements in @models on success. + * Returns -1 on error, number of elements in @models on success (0 means + * libvirt accepts any CPU model). */ int virConnectGetCPUModelNames(virConnectPtr conn, const char *arch, char ***models, diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 2337ce8e6e..2fd368662a 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -1149,9 +1149,13 @@ cmdCPUModelNames(vshControl *ctl, const vshCmd *cmd) return false; } - for (i = 0; i < nmodels; i++) { - vshPrint(ctl, "%s\n", models[i]); - VIR_FREE(models[i]); + if (nmodels == 0) { + vshPrintExtra(ctl, "%s\n", _("all CPU models are accepted")); + } else { + for (i = 0; i < nmodels; i++) { + vshPrint(ctl, "%s\n", models[i]); + VIR_FREE(models[i]); + } } VIR_FREE(models);