[libvirt] [PATCH] cpu-driver: Fix the cross driver function call
Daniel Hansel
daniel.hansel at linux.vnet.ibm.com
Tue Dec 2 14:03:54 UTC 2014
Hi again,
there were no replies or comments on my patch since nearly 2 weeks.
Please review this patch that is a preparation step to exploit the new QEMU CPU model support.
Thanks in advance.
Kind regards,
Daniel Hansel
On 20.11.2014 11:08, Daniel Hansel wrote:
> For Intel and PowerPC the implementation is calling a cpu driver
> function across driver layers (i.e. from qemu driver directly to cpu
> driver).
> The correct behavior is to use libvirt API functionality to perform such
> a inter-driver call.
>
> This patch introduces a new cpu driver API function getModels() to
> retrieve the cpu models. The currect implementation to process the
> cpu_map XML content is transferred to the INTEL and PowerPC cpu driver
> specific API functions.
> Additionally processing the cpu_map XML file is not safe due to the fact
> that the cpu map does not exist for all architectures. Therefore it is
> better to encapsulate the processing in the architecture specific cpu
> drivers.
>
> Signed-off-by: Daniel Hansel <daniel.hansel at linux.vnet.ibm.com>
> Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> Reviewed-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> ---
> src/cpu/cpu.c | 68 +++++++++------------------------------------------
> src/cpu/cpu.h | 4 +++
> src/cpu/cpu_powerpc.c | 37 ++++++++++++++++++++++++++++
> src/cpu/cpu_x86.c | 33 +++++++++++++++++++++++++
> 4 files changed, 86 insertions(+), 56 deletions(-)
>
> diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
> index 08bec5e..788f688 100644
> --- a/src/cpu/cpu.c
> +++ b/src/cpu/cpu.c
> @@ -724,43 +724,6 @@ cpuModelIsAllowed(const char *model,
> return false;
> }
>
> -struct cpuGetModelsData
> -{
> - char **data;
> - size_t len; /* It includes the last element of DATA, which is NULL. */
> -};
> -
> -static int
> -cpuGetArchModelsCb(cpuMapElement element,
> - xmlXPathContextPtr ctxt,
> - void *cbdata)
> -{
> - char *name;
> - struct cpuGetModelsData *data = cbdata;
> - if (element != CPU_MAP_ELEMENT_MODEL)
> - return 0;
> -
> - name = virXPathString("string(@name)", ctxt);
> - if (name == NULL)
> - return -1;
> -
> - if (!data->data) {
> - VIR_FREE(name);
> - data->len++;
> - return 0;
> - }
> -
> - return VIR_INSERT_ELEMENT(data->data, data->len - 1, data->len, name);
> -}
> -
> -
> -static int
> -cpuGetArchModels(const char *arch, struct cpuGetModelsData *data)
> -{
> - return cpuMapLoad(arch, cpuGetArchModelsCb, data);
> -}
> -
> -
> /**
> * cpuGetModels:
> *
> @@ -774,18 +737,17 @@ cpuGetArchModels(const char *arch, struct cpuGetModelsData *data)
> int
> cpuGetModels(const char *archName, char ***models)
> {
> - struct cpuGetModelsData data;
> - virArch arch;
> struct cpuArchDriver *driver;
> - data.data = NULL;
> - data.len = 1;
> + virArch arch;
> +
> + VIR_DEBUG("arch=%s", archName);
>
> arch = virArchFromString(archName);
> if (arch == VIR_ARCH_NONE) {
> virReportError(VIR_ERR_INVALID_ARG,
> _("cannot find architecture %s"),
> archName);
> - goto error;
> + return -1;
> }
>
> driver = cpuGetSubDriver(arch);
> @@ -793,21 +755,15 @@ cpuGetModels(const char *archName, char ***models)
> virReportError(VIR_ERR_INVALID_ARG,
> _("cannot find a driver for the architecture %s"),
> archName);
> - goto error;
> + return -1;
> }
>
> - if (models && VIR_ALLOC_N(data.data, data.len) < 0)
> - goto error;
> -
> - if (cpuGetArchModels(driver->name, &data) < 0)
> - goto error;
> -
> - if (models)
> - *models = data.data;
> -
> - return data.len - 1;
> + if (!driver->getModels) {
> + virReportError(VIR_ERR_NO_SUPPORT,
> + _("CPU driver for %s has no CPU model support"),
> + virArchToString(arch));
> + return -1;
> + }
>
> - error:
> - virStringFreeList(data.data);
> - return -1;
> + return driver->getModels(models);
> }
> diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
> index 339964c..09e9538 100644
> --- a/src/cpu/cpu.h
> +++ b/src/cpu/cpu.h
> @@ -100,6 +100,9 @@ typedef char *
> typedef virCPUDataPtr
> (*cpuArchDataParse) (const char *xmlStr);
>
> +typedef int
> +(*cpuArchGetModels) (char ***models);
> +
> struct cpuArchDriver {
> const char *name;
> const virArch *arch;
> @@ -115,6 +118,7 @@ struct cpuArchDriver {
> cpuArchHasFeature hasFeature;
> cpuArchDataFormat dataFormat;
> cpuArchDataParse dataParse;
> + cpuArchGetModels getModels;
> };
>
>
> diff --git a/src/cpu/cpu_powerpc.c b/src/cpu/cpu_powerpc.c
> index 67cb9ff..155d93e 100644
> --- a/src/cpu/cpu_powerpc.c
> +++ b/src/cpu/cpu_powerpc.c
> @@ -649,6 +649,42 @@ ppcBaseline(virCPUDefPtr *cpus,
> goto cleanup;
> }
>
> +static int
> +ppcGetModels(char ***models)
> +{
> + struct ppc_map *map;
> + struct ppc_model *model;
> + char *name;
> + size_t nmodels = 0;
> +
> + if (!(map = ppcLoadMap()))
> + goto error;
> +
> + if (models && VIR_ALLOC_N(*models, 0) < 0)
> + goto error;
> +
> + model = map->models;
> + while (model != NULL) {
> + if (VIR_STRDUP(name, model->name) < 0)
> + goto error;
> +
> + if (VIR_INSERT_ELEMENT(*models, 0, nmodels, name) < 0)
> + goto error;
> +
> + model = model->next;
> + }
> +
> + cleanup:
> + ppcMapFree(map);
> +
> + return nmodels;
> +
> + error:
> + virStringFreeList(*models);
> + nmodels = -1;
> + goto cleanup;
> +}
> +
> struct cpuArchDriver cpuDriverPowerPC = {
> .name = "ppc64",
> .arch = archs,
> @@ -662,4 +698,5 @@ struct cpuArchDriver cpuDriverPowerPC = {
> .baseline = ppcBaseline,
> .update = ppcUpdate,
> .hasFeature = NULL,
> + .getModels = ppcGetModels,
> };
> diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
> index 026b54e..f6dcba4 100644
> --- a/src/cpu/cpu_x86.c
> +++ b/src/cpu/cpu_x86.c
> @@ -2160,6 +2160,38 @@ x86HasFeature(const virCPUData *data,
> return ret;
> }
>
> +static int
> +x86GetModels(char ***models)
> +{
> + const struct x86_map *map;
> + struct x86_model *model;
> + char *name;
> + size_t nmodels = 0;
> +
> + if (!(map = virCPUx86GetMap()))
> + return -1;
> +
> + if (models && VIR_ALLOC_N(*models, 0) < 0)
> + goto error;
> +
> + model = map->models;
> + while (model != NULL) {
> + if (VIR_STRDUP(name, model->name) < 0)
> + goto error;
> +
> + if (VIR_INSERT_ELEMENT(*models, 0, nmodels, name) < 0)
> + goto error;
> +
> + model = model->next;
> + }
> +
> + return nmodels;
> +
> + error:
> + virStringFreeList(*models);
> + return -1;
> +}
> +
>
> struct cpuArchDriver cpuDriverX86 = {
> .name = "x86",
> @@ -2180,4 +2212,5 @@ struct cpuArchDriver cpuDriverX86 = {
> .hasFeature = x86HasFeature,
> .dataFormat = x86CPUDataFormat,
> .dataParse = x86CPUDataParse,
> + .getModels = x86GetModels,
> };
>
--
Mit freundlichen Grüßen / Kind regards
Daniel Hansel
IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
More information about the libvir-list
mailing list