All APIs which expect a list of CPU models supported by hypervisors were
switched from char **models and int models to just accept a pointer to
virDomainCapsCPUModels object stored in domain capabilities. This avoids
the need to transform virDomainCapsCPUModelsPtr into a NULL-terminated
list of model names and also allows the various cpu driver APIs to
access additional details (such as its usability) about each CPU model.

Signed-off-by: Jiri Denemark <jdene...@redhat.com>
---
 src/cpu/cpu.c                  | 78 +++++++++++++-----------------------
 src/cpu/cpu.h                  | 28 +++++--------
 src/cpu/cpu_arm.c              |  3 +-
 src/cpu/cpu_ppc64.c            | 13 +++---
 src/cpu/cpu_x86.c              | 25 +++++-------
 src/libxl/libxl_capabilities.c |  2 +-
 src/libxl/libxl_driver.c       |  2 +-
 src/qemu/qemu_capabilities.c   | 63 ++++++------------------------
 src/qemu/qemu_capabilities.h   |  6 +--
 src/qemu/qemu_driver.c         |  2 +-
 src/qemu/qemu_process.c        |  9 +----
 src/test/test_driver.c         |  2 +-
 tests/cputest.c                | 89 ++++++++++++++++++++++++++++++------------
 13 files changed, 138 insertions(+), 184 deletions(-)

diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index dc72ed42d8..842b0db2cd 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -192,7 +192,6 @@ virCPUCompare(virArch arch,
  * @cpu: CPU definition stub to be filled in
  * @data: internal CPU data to be decoded into @cpu definition
  * @models: list of CPU models that can be considered when decoding @data
- * @nmodels: number of CPU models in @models
  * @preferred: CPU models that should be used if possible
  *
  * Decodes internal CPU data into a CPU definition consisting of a CPU model
@@ -214,24 +213,17 @@ virCPUCompare(virArch arch,
 int
 cpuDecode(virCPUDefPtr cpu,
           const virCPUData *data,
-          const char **models,
-          unsigned int nmodels,
+          virDomainCapsCPUModelsPtr models,
           const char *preferred)
 {
     struct cpuArchDriver *driver;
 
-    VIR_DEBUG("cpu=%p, data=%p, nmodels=%u, preferred=%s",
-              cpu, data, nmodels, NULLSTR(preferred));
+    VIR_DEBUG("cpu=%p, data=%p, models=%p, preferred=%s",
+              cpu, data, models, NULLSTR(preferred));
     if (models) {
         size_t i;
-        for (i = 0; i < nmodels; i++)
-            VIR_DEBUG("models[%zu]=%s", i, NULLSTR(models[i]));
-    }
-
-    if (models == NULL && nmodels != 0) {
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
-                       _("nonzero nmodels doesn't match with NULL models"));
-        return -1;
+        for (i = 0; i < models->nmodels; i++)
+            VIR_DEBUG("models[%zu]=%s", i, models->models[i].name);
     }
 
     if (cpu->type > VIR_CPU_TYPE_GUEST ||
@@ -251,7 +243,7 @@ cpuDecode(virCPUDefPtr cpu,
         return -1;
     }
 
-    return driver->decode(cpu, data, models, nmodels, preferred);
+    return driver->decode(cpu, data, models, preferred);
 }
 
 
@@ -384,7 +376,6 @@ virCPUGetHostIsSupported(virArch arch)
  * @type: requested type of the CPU
  * @nodeInfo: simplified CPU topology (optional)
  * @models: list of CPU models that can be considered for host CPU
- * @nmodels: number of CPU models in @models
  *
  * Create CPU definition describing the host's CPU.
  *
@@ -412,15 +403,14 @@ virCPUDefPtr
 virCPUGetHost(virArch arch,
               virCPUType type,
               virNodeInfoPtr nodeInfo,
-              const char **models,
-              unsigned int nmodels)
+              virDomainCapsCPUModelsPtr models)
 {
     struct cpuArchDriver *driver;
     virCPUDefPtr cpu = NULL;
 
-    VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p, models=%p, nmodels=%u",
+    VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p, models=%p",
               virArchToString(arch), virCPUTypeToString(type), nodeInfo,
-              models, nmodels);
+              models);
 
     if (!(driver = cpuGetSubDriver(arch)))
         return NULL;
@@ -462,7 +452,7 @@ virCPUGetHost(virArch arch,
      * filled in.
      */
     if (driver->getHost) {
-        if (driver->getHost(cpu, models, nmodels) < 0 &&
+        if (driver->getHost(cpu, models) < 0 &&
             !nodeInfo)
             goto error;
     } else if (nodeInfo) {
@@ -491,7 +481,7 @@ virCPUProbeHost(virArch arch)
     if (virCapabilitiesGetNodeInfo(&nodeinfo))
         return NULL;
 
-    return virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo, NULL, 0);
+    return virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo, NULL);
 }
 
 
@@ -501,11 +491,10 @@ virCPUProbeHost(virArch arch)
  * @cpus: list of host CPU definitions
  * @ncpus: number of CPUs in @cpus
  * @models: list of CPU models that can be considered for the baseline CPU
- * @nmodels: number of CPU models in @models
  * @migratable: requests non-migratable features to be removed from the result
  *
  * Computes the most feature-rich CPU which is compatible with all given
- * host CPUs. If @models array is NULL, all models supported by libvirt will
+ * host CPUs. If @models is NULL, all models supported by libvirt will
  * be considered when computing the baseline CPU model, otherwise the baseline
  * CPU model will be one of the provided CPU @models.
  *
@@ -514,21 +503,20 @@ virCPUProbeHost(virArch arch)
 virCPUDefPtr
 cpuBaseline(virCPUDefPtr *cpus,
             unsigned int ncpus,
-            const char **models,
-            unsigned int nmodels,
+            virDomainCapsCPUModelsPtr models,
             bool migratable)
 {
     struct cpuArchDriver *driver;
     size_t i;
 
-    VIR_DEBUG("ncpus=%u, nmodels=%u", ncpus, nmodels);
+    VIR_DEBUG("ncpus=%u", ncpus);
     if (cpus) {
         for (i = 0; i < ncpus; i++)
             VIR_DEBUG("cpus[%zu]=%p", i, cpus[i]);
     }
     if (models) {
-        for (i = 0; i < nmodels; i++)
-            VIR_DEBUG("models[%zu]=%s", i, NULLSTR(models[i]));
+        for (i = 0; i < models->nmodels; i++)
+            VIR_DEBUG("models[%zu]=%s", i, models->models[i].name);
     }
 
     if (cpus == NULL && ncpus != 0) {
@@ -555,12 +543,6 @@ cpuBaseline(virCPUDefPtr *cpus,
         }
     }
 
-    if (models == NULL && nmodels != 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       "%s", _("nonzero nmodels doesn't match with NULL 
models"));
-        return NULL;
-    }
-
     if ((driver = cpuGetSubDriver(cpus[0]->arch)) == NULL)
         return NULL;
 
@@ -571,7 +553,7 @@ cpuBaseline(virCPUDefPtr *cpus,
         return NULL;
     }
 
-    return driver->baseline(cpus, ncpus, models, nmodels, migratable);
+    return driver->baseline(cpus, ncpus, models, migratable);
 }
 
 
@@ -844,25 +826,23 @@ virCPUDataParse(const char *xmlStr)
  *
  * @model: CPU model to be checked
  * @models: list of supported CPU models
- * @nmodels: number of models in @models
  *
  * Checks whether @model can be found in the list of supported @models.
- * If @models is empty, all models are supported.
+ * If @models is NULL, all models are supported.
  *
  * Returns true if @model is supported, false otherwise.
  */
 bool
 virCPUModelIsAllowed(const char *model,
-                     const char **models,
-                     unsigned int nmodels)
+                     virDomainCapsCPUModelsPtr models)
 {
     size_t i;
 
-    if (!models || !nmodels)
+    if (!models)
         return true;
 
-    for (i = 0; i < nmodels; i++) {
-        if (models[i] && STREQ(models[i], model))
+    for (i = 0; i < models->nmodels; i++) {
+        if (STREQ(models->models[i].name, model))
             return true;
     }
     return false;
@@ -908,8 +888,7 @@ virCPUGetModels(virArch arch, char ***models)
  *
  * @arch: CPU architecture
  * @cpu: CPU definition to be translated
- * @models: NULL-terminated list of allowed CPU models (NULL if all are 
allowed)
- * @nmodels: number of CPU models in @models
+ * @models: list of allowed CPU models (NULL if all are allowed)
  *
  * Translates @cpu model (if allowed by @cpu->fallback) to a closest CPU model
  * from @models list.
@@ -922,13 +901,12 @@ virCPUGetModels(virArch arch, char ***models)
 int
 virCPUTranslate(virArch arch,
                 virCPUDefPtr cpu,
-                const char **models,
-                unsigned int nmodels)
+                virDomainCapsCPUModelsPtr models)
 {
     struct cpuArchDriver *driver;
 
-    VIR_DEBUG("arch=%s, cpu=%p, model=%s, models=%p, nmodels=%u",
-              virArchToString(arch), cpu, NULLSTR(cpu->model), models, 
nmodels);
+    VIR_DEBUG("arch=%s, cpu=%p, model=%s, models=%p",
+              virArchToString(arch), cpu, NULLSTR(cpu->model), models);
 
     if (!(driver = cpuGetSubDriver(arch)))
         return -1;
@@ -937,7 +915,7 @@ virCPUTranslate(virArch arch,
         cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
         return 0;
 
-    if (virCPUModelIsAllowed(cpu->model, models, nmodels))
+    if (virCPUModelIsAllowed(cpu->model, models))
         return 0;
 
     if (cpu->fallback != VIR_CPU_FALLBACK_ALLOW) {
@@ -954,7 +932,7 @@ virCPUTranslate(virArch arch,
         return -1;
     }
 
-    if (driver->translate(cpu, models, nmodels) < 0)
+    if (driver->translate(cpu, models) < 0)
         return -1;
 
     VIR_DEBUG("model=%s", NULLSTR(cpu->model));
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 5daff186c4..d325fe3d04 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -27,6 +27,7 @@
 # include "virerror.h"
 # include "datatypes.h"
 # include "virarch.h"
+# include "domain_capabilities.h"
 # include "cpu_conf.h"
 # include "cpu_x86_data.h"
 # include "cpu_ppc64_data.h"
@@ -52,8 +53,7 @@ typedef virCPUCompareResult
 typedef int
 (*cpuArchDecode)    (virCPUDefPtr cpu,
                      const virCPUData *data,
-                     const char **models,
-                     unsigned int nmodels,
+                     virDomainCapsCPUModelsPtr models,
                      const char *preferred);
 
 typedef int
@@ -71,14 +71,12 @@ typedef void
 
 typedef int
 (*virCPUArchGetHost)(virCPUDefPtr cpu,
-                     const char **models,
-                     unsigned int nmodels);
+                     virDomainCapsCPUModelsPtr models);
 
 typedef virCPUDefPtr
 (*cpuArchBaseline)  (virCPUDefPtr *cpus,
                      unsigned int ncpus,
-                     const char **models,
-                     unsigned int nmodels,
+                     virDomainCapsCPUModelsPtr models,
                      bool migratable);
 
 typedef int
@@ -109,8 +107,7 @@ typedef int
 
 typedef int
 (*virCPUArchTranslate)(virCPUDefPtr cpu,
-                       const char **models,
-                       unsigned int nmodels);
+                       virDomainCapsCPUModelsPtr models);
 
 typedef int
 (*virCPUArchConvertLegacy)(virCPUDefPtr cpu);
@@ -165,8 +162,7 @@ virCPUCompare(virArch arch,
 int
 cpuDecode   (virCPUDefPtr cpu,
              const virCPUData *data,
-             const char **models,
-             unsigned int nmodels,
+             virDomainCapsCPUModelsPtr models,
              const char *preferred)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
@@ -194,8 +190,7 @@ virCPUDefPtr
 virCPUGetHost(virArch arch,
               virCPUType type,
               virNodeInfoPtr nodeInfo,
-              const char **models,
-              unsigned int nmodels);
+              virDomainCapsCPUModelsPtr models);
 
 virCPUDefPtr
 virCPUProbeHost(virArch arch);
@@ -203,8 +198,7 @@ virCPUProbeHost(virArch arch);
 virCPUDefPtr
 cpuBaseline (virCPUDefPtr *cpus,
              unsigned int ncpus,
-             const char **models,
-             unsigned int nmodels,
+             virDomainCapsCPUModelsPtr models,
              bool migratable);
 
 int
@@ -235,8 +229,7 @@ virCPUDataCheckFeature(const virCPUData *data,
 
 bool
 virCPUModelIsAllowed(const char *model,
-                     const char **models,
-                     unsigned int nmodels)
+                     virDomainCapsCPUModelsPtr models)
     ATTRIBUTE_NONNULL(1);
 
 int
@@ -245,8 +238,7 @@ virCPUGetModels(virArch arch, char ***models);
 int
 virCPUTranslate(virArch arch,
                 virCPUDefPtr cpu,
-                const char **models,
-                unsigned int nmodels)
+                virDomainCapsCPUModelsPtr models)
     ATTRIBUTE_NONNULL(2);
 
 int
diff --git a/src/cpu/cpu_arm.c b/src/cpu/cpu_arm.c
index 474777656c..44cb4fea68 100644
--- a/src/cpu/cpu_arm.c
+++ b/src/cpu/cpu_arm.c
@@ -75,8 +75,7 @@ virCPUarmUpdate(virCPUDefPtr guest,
 static virCPUDefPtr
 armBaseline(virCPUDefPtr *cpus,
             unsigned int ncpus ATTRIBUTE_UNUSED,
-            const char **models ATTRIBUTE_UNUSED,
-            unsigned int nmodels ATTRIBUTE_UNUSED,
+            virDomainCapsCPUModelsPtr models ATTRIBUTE_UNUSED,
             bool migratable ATTRIBUTE_UNUSED)
 {
     virCPUDefPtr cpu = NULL;
diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c
index b58e80a647..e5ae3a609f 100644
--- a/src/cpu/cpu_ppc64.c
+++ b/src/cpu/cpu_ppc64.c
@@ -663,8 +663,7 @@ virCPUppc64Compare(virCPUDefPtr host,
 static int
 ppc64DriverDecode(virCPUDefPtr cpu,
                   const virCPUData *data,
-                  const char **models,
-                  unsigned int nmodels,
+                  virDomainCapsCPUModelsPtr models,
                   const char *preferred ATTRIBUTE_UNUSED)
 {
     int ret = -1;
@@ -681,7 +680,7 @@ ppc64DriverDecode(virCPUDefPtr cpu,
         goto cleanup;
     }
 
-    if (!virCPUModelIsAllowed(model->name, models, nmodels)) {
+    if (!virCPUModelIsAllowed(model->name, models)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("CPU model %s is not supported by hypervisor"),
                        model->name);
@@ -714,8 +713,7 @@ virCPUppc64DataFree(virCPUDataPtr data)
 
 static int
 virCPUppc64GetHost(virCPUDefPtr cpu,
-                   const char **models,
-                   unsigned int nmodels)
+                   virDomainCapsCPUModelsPtr models)
 {
     virCPUDataPtr cpuData = NULL;
     virCPUppc64Data *data;
@@ -737,7 +735,7 @@ virCPUppc64GetHost(virCPUDefPtr cpu,
 #endif
     data->pvr[0].mask = 0xfffffffful;
 
-    ret = ppc64DriverDecode(cpu, cpuData, models, nmodels, NULL);
+    ret = ppc64DriverDecode(cpu, cpuData, models, NULL);
 
  cleanup:
     virCPUppc64DataFree(cpuData);
@@ -766,8 +764,7 @@ virCPUppc64Update(virCPUDefPtr guest,
 static virCPUDefPtr
 ppc64DriverBaseline(virCPUDefPtr *cpus,
                     unsigned int ncpus,
-                    const char **models ATTRIBUTE_UNUSED,
-                    unsigned int nmodels ATTRIBUTE_UNUSED,
+                    virDomainCapsCPUModelsPtr models ATTRIBUTE_UNUSED,
                     bool migratable ATTRIBUTE_UNUSED)
 {
     struct ppc64_map *map;
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 5ce205f9c1..3f9e83ca72 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -1820,8 +1820,7 @@ x86DataFilterTSX(virCPUx86Data *data,
 static int
 x86Decode(virCPUDefPtr cpu,
           const virCPUx86Data *cpuData,
-          const char **models,
-          unsigned int nmodels,
+          virDomainCapsCPUModelsPtr models,
           const char *preferred,
           bool migratable)
 {
@@ -1855,7 +1854,7 @@ x86Decode(virCPUDefPtr cpu,
      */
     for (i = map->nmodels - 1; i >= 0; i--) {
         candidate = map->models[i];
-        if (!virCPUModelIsAllowed(candidate->name, models, nmodels)) {
+        if (!virCPUModelIsAllowed(candidate->name, models)) {
             if (preferred && STREQ(candidate->name, preferred)) {
                 if (cpu->fallback != VIR_CPU_FALLBACK_ALLOW) {
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -1946,11 +1945,10 @@ x86Decode(virCPUDefPtr cpu,
 static int
 x86DecodeCPUData(virCPUDefPtr cpu,
                  const virCPUData *data,
-                 const char **models,
-                 unsigned int nmodels,
+                 virDomainCapsCPUModelsPtr models,
                  const char *preferred)
 {
-    return x86Decode(cpu, &data->data.x86, models, nmodels, preferred, false);
+    return x86Decode(cpu, &data->data.x86, models, preferred, false);
 }
 
 
@@ -2402,8 +2400,7 @@ cpuidSet(uint32_t base, virCPUDataPtr data)
 
 static int
 virCPUx86GetHost(virCPUDefPtr cpu,
-                 const char **models,
-                 unsigned int nmodels)
+                 virDomainCapsCPUModelsPtr models)
 {
     virCPUDataPtr cpuData = NULL;
     int ret = -1;
@@ -2415,7 +2412,7 @@ virCPUx86GetHost(virCPUDefPtr cpu,
         cpuidSet(CPUX86_EXTENDED, cpuData) < 0)
         goto cleanup;
 
-    ret = x86DecodeCPUData(cpu, cpuData, models, nmodels, NULL);
+    ret = x86DecodeCPUData(cpu, cpuData, models, NULL);
 
  cleanup:
     virCPUx86DataFree(cpuData);
@@ -2427,8 +2424,7 @@ virCPUx86GetHost(virCPUDefPtr cpu,
 static virCPUDefPtr
 x86Baseline(virCPUDefPtr *cpus,
             unsigned int ncpus,
-            const char **models,
-            unsigned int nmodels,
+            virDomainCapsCPUModelsPtr models,
             bool migratable)
 {
     virCPUx86MapPtr map = NULL;
@@ -2523,7 +2519,7 @@ x86Baseline(virCPUDefPtr *cpus,
         virCPUx86DataAddCPUIDInt(&base_model->data, &vendor->cpuid) < 0)
         goto error;
 
-    if (x86Decode(cpu, &base_model->data, models, nmodels, modelName, 
migratable) < 0)
+    if (x86Decode(cpu, &base_model->data, models, modelName, migratable) < 0)
         goto error;
 
     if (STREQ_NULLABLE(cpu->model, modelName))
@@ -2805,8 +2801,7 @@ virCPUx86GetModels(char ***models)
 
 static int
 virCPUx86Translate(virCPUDefPtr cpu,
-                   const char **models,
-                   unsigned int nmodels)
+                   virDomainCapsCPUModelsPtr models)
 {
     virCPUDefPtr translated = NULL;
     virCPUx86MapPtr map;
@@ -2830,7 +2825,7 @@ virCPUx86Translate(virCPUDefPtr cpu,
     if (!(translated = virCPUDefCopyWithoutModel(cpu)))
         goto cleanup;
 
-    if (x86Decode(translated, &model->data, models, nmodels, NULL, false) < 0)
+    if (x86Decode(translated, &model->data, models, NULL, false) < 0)
         goto cleanup;
 
     for (i = 0; i < cpu->nfeatures; i++) {
diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
index e0959202b3..4def561143 100644
--- a/src/libxl/libxl_capabilities.c
+++ b/src/libxl/libxl_capabilities.c
@@ -192,7 +192,7 @@ libxlCapsInitCPU(virCapsPtr caps, libxl_physinfo *phy_info,
     ret = 0;
 
     if (!(data = libxlCapsNodeData(cpu, phy_info->hw_cap, version)) ||
-        cpuDecode(cpu, data, NULL, 0, NULL) < 0) {
+        cpuDecode(cpu, data, NULL, NULL) < 0) {
         VIR_WARN("Failed to initialize host cpu features");
         goto error;
     }
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index bf3625e34a..34235fc57d 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -6463,7 +6463,7 @@ libxlConnectBaselineCPU(virConnectPtr conn,
     if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
         goto cleanup;
 
-    if (!(cpu = cpuBaseline(cpus, ncpus, NULL, 0,
+    if (!(cpu = cpuBaseline(cpus, ncpus, NULL,
                             !!(flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE))))
         goto cleanup;
 
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 7ddc6cafd4..225cee4ef9 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -1167,18 +1167,8 @@ virQEMUCapsProbeHostCPUForEmulator(virArch hostArch,
                                    virQEMUCapsPtr qemuCaps,
                                    virDomainVirtType type)
 {
-    size_t nmodels;
-    char **models;
-    virCPUDefPtr cpu;
-
-    if (virQEMUCapsGetCPUDefinitions(qemuCaps, type, &models, &nmodels) < 0)
-        return NULL;
-
-    cpu = virCPUGetHost(hostArch, VIR_CPU_TYPE_GUEST, NULL,
-                        (const char **) models, nmodels);
-
-    virStringListFreeCount(models, nmodels);
-    return cpu;
+    return virCPUGetHost(hostArch, VIR_CPU_TYPE_GUEST, NULL,
+                         virQEMUCapsGetCPUDefinitions(qemuCaps, type));
 }
 
 
@@ -2532,45 +2522,16 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
 }
 
 
-int
+virDomainCapsCPUModelsPtr
 virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
-                             virDomainVirtType type,
-                             char ***names,
-                             size_t *count)
+                             virDomainVirtType type)
 {
-    size_t i;
-    char **models = NULL;
-    virDomainCapsCPUModelsPtr cpus;
-
-    *count = 0;
-    if (names)
-        *names = NULL;
-
     if (type == VIR_DOMAIN_VIRT_KVM)
-        cpus = qemuCaps->kvmCPUModels;
+        return qemuCaps->kvmCPUModels;
     else
-        cpus = qemuCaps->tcgCPUModels;
+        return qemuCaps->tcgCPUModels;
 
-    if (!cpus)
-        return 0;
-
-    if (names && VIR_ALLOC_N(models, cpus->nmodels) < 0)
-        return -1;
-
-    for (i = 0; i < cpus->nmodels; i++) {
-        virDomainCapsCPUModelPtr cpu = cpus->models + i;
-        if (models && VIR_STRDUP(models[i], cpu->name) < 0)
-            goto error;
-    }
-
-    if (names)
-        *names = models;
-    *count = cpus->nmodels;
-    return 0;
-
- error:
-    virStringListFreeCount(models, i);
-    return -1;
+    return NULL;
 }
 
 
@@ -3392,8 +3353,6 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
     virCPUDataPtr data = NULL;
     unsigned long long sigFamily = 0;
     unsigned long long sigModel = 0;
-    size_t nmodels = 0;
-    char **models = NULL;
     int ret = -1;
     size_t i;
 
@@ -3438,15 +3397,15 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps,
     if (virCPUx86DataSetSignature(data, sigFamily, sigModel) < 0)
         goto cleanup;
 
-    if (virQEMUCapsGetCPUDefinitions(qemuCaps, type, &models, &nmodels) < 0 ||
-        cpuDecode(cpu, data, (const char **) models, nmodels, NULL) < 0)
+    if (cpuDecode(cpu, data,
+                  virQEMUCapsGetCPUDefinitions(qemuCaps, type),
+                  NULL) < 0)
         goto cleanup;
 
     ret = 0;
 
  cleanup:
     virCPUDataFree(data);
-    virStringListFreeCount(models, nmodels);
     return ret;
 }
 
@@ -3532,7 +3491,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
     } else if (type == VIR_DOMAIN_VIRT_KVM &&
                virCPUGetHostIsSupported(qemuCaps->arch)) {
         if (!(fullCPU = virCPUGetHost(qemuCaps->arch, VIR_CPU_TYPE_GUEST,
-                                      NULL, NULL, 0)))
+                                      NULL, NULL)))
             goto error;
 
         for (i = 0; i < cpu->nfeatures; i++) {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 214734ff2c..3b6fd26109 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -469,10 +469,8 @@ int virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
                                  const char **name,
                                  size_t count,
                                  virDomainCapsCPUUsable usable);
-int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
-                                 virDomainVirtType type,
-                                 char ***names,
-                                 size_t *count);
+virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
+                                                       virDomainVirtType type);
 
 typedef enum {
     /* Host CPU definition reported in domain capabilities. */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4855c9047d..55d8616ada 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13051,7 +13051,7 @@ qemuConnectBaselineCPU(virConnectPtr conn 
ATTRIBUTE_UNUSED,
     if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
         goto cleanup;
 
-    if (!(baseline = cpuBaseline(cpus, ncpus, NULL, 0,
+    if (!(baseline = cpuBaseline(cpus, ncpus, NULL,
                                  !!(flags & 
VIR_CONNECT_BASELINE_CPU_MIGRATABLE))))
         goto cleanup;
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index bde3ba462a..4341187852 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5157,8 +5157,6 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                           unsigned int flags)
 {
     int ret = -1;
-    size_t nmodels = 0;
-    char **models = NULL;
 
     if (!def->cpu)
         return 0;
@@ -5210,17 +5208,14 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                                              
VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0)
         goto cleanup;
 
-    if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType,
-                                     &models, &nmodels) < 0 ||
-        virCPUTranslate(def->os.arch, def->cpu,
-                        (const char **) models, nmodels) < 0)
+    if (virCPUTranslate(def->os.arch, def->cpu,
+                        virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) 
< 0)
         goto cleanup;
 
     def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
     ret = 0;
 
  cleanup:
-    virStringListFreeCount(models, nmodels);
     return ret;
 }
 
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 9b434e9a04..eeda5b224c 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1545,7 +1545,7 @@ testConnectBaselineCPU(virConnectPtr conn 
ATTRIBUTE_UNUSED,
     if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
         goto cleanup;
 
-    if (!(cpu = cpuBaseline(cpus, ncpus, NULL, 0, false)))
+    if (!(cpu = cpuBaseline(cpus, ncpus, NULL, false)))
         goto cleanup;
 
     if ((flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) &&
diff --git a/tests/cputest.c b/tests/cputest.c
index 913ca77231..552c07e2c5 100644
--- a/tests/cputest.c
+++ b/tests/cputest.c
@@ -61,9 +61,8 @@ struct data {
     virArch arch;
     const char *host;
     const char *name;
-    const char **models;
+    virDomainCapsCPUModelsPtr models;
     const char *modelsName;
-    unsigned int nmodels;
     unsigned int flags;
     int result;
 };
@@ -264,13 +263,13 @@ cpuTestGuestCPU(const void *arg)
     }
 
     if (virCPUUpdate(host->arch, cpu, host) < 0 ||
-        virCPUTranslate(host->arch, cpu, data->models, data->nmodels) < 0) {
+        virCPUTranslate(host->arch, cpu, data->models) < 0) {
         ret = -1;
         goto cleanup;
     }
 
     virBufferAsprintf(&buf, "%s+%s", data->host, data->name);
-    if (data->nmodels)
+    if (data->modelsName)
         virBufferAsprintf(&buf, ",%s", data->modelsName);
     virBufferAddLit(&buf, "-result");
 
@@ -322,7 +321,7 @@ cpuTestBaseline(const void *arg)
     if (!(cpus = cpuTestLoadMultiXML(data->arch, data->name, &ncpus)))
         goto cleanup;
 
-    baseline = cpuBaseline(cpus, ncpus, NULL, 0,
+    baseline = cpuBaseline(cpus, ncpus, NULL,
                            !!(data->flags & 
VIR_CONNECT_BASELINE_CPU_MIGRATABLE));
 
     if (baseline &&
@@ -492,7 +491,7 @@ cpuTestCPUID(bool guest, const void *arg)
         cpu->type = VIR_CPU_TYPE_HOST;
     }
 
-    if (cpuDecode(cpu, hostData, NULL, 0, NULL) < 0)
+    if (cpuDecode(cpu, hostData, NULL, NULL) < 0)
         goto cleanup;
 
     if (virAsprintf(&result, "cpuid-%s-%s",
@@ -729,15 +728,43 @@ cpuTestJSONCPUID(const void *arg)
 #endif
 
 
-static const char *model486[]   = { "486" };
-static const char *nomodel[]    = { "nomodel" };
-static const char *models[]     = { "qemu64", "core2duo", "Nehalem" };
-static const char *haswell[]    = { "SandyBridge", "Haswell" };
-static const char *ppc_models[] = { "POWER6", "POWER7", "POWER8" };
+static const char *model486_list[]   = { "486", NULL };
+static const char *nomodel_list[]    = { "nomodel", NULL };
+static const char *models_list[]     = { "qemu64", "core2duo", "Nehalem", NULL 
};
+static const char *haswell_list[]    = { "SandyBridge", "Haswell", NULL };
+static const char *ppc_models_list[] = { "POWER6", "POWER7", "POWER8", NULL };
+
+static virDomainCapsCPUModelsPtr
+cpuTestInitModels(const char **list)
+{
+    virDomainCapsCPUModelsPtr cpus;
+    const char **model;
+
+    if (!(cpus = virDomainCapsCPUModelsNew(0)))
+        return NULL;
+
+    for (model = list; *model; model++) {
+        if (virDomainCapsCPUModelsAdd(cpus, *model, -1,
+                                      VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL) < 
0)
+            goto error;
+    }
+
+    return cpus;
+
+ error:
+    virObjectUnref(cpus);
+    return NULL;
+}
+
 
 static int
 mymain(void)
 {
+    virDomainCapsCPUModelsPtr model486 = NULL;
+    virDomainCapsCPUModelsPtr nomodel = NULL;
+    virDomainCapsCPUModelsPtr models = NULL;
+    virDomainCapsCPUModelsPtr haswell = NULL;
+    virDomainCapsCPUModelsPtr ppc_models = NULL;
     int ret = 0;
 
 #if WITH_QEMU && WITH_YAJL
@@ -747,13 +774,22 @@ mymain(void)
     virEventRegisterDefaultImpl();
 #endif
 
+    if (!(model486 = cpuTestInitModels(model486_list)) ||
+        !(nomodel = cpuTestInitModels(nomodel_list)) ||
+        !(models = cpuTestInitModels(models_list)) ||
+        !(haswell = cpuTestInitModels(haswell_list)) ||
+        !(ppc_models = cpuTestInitModels(ppc_models_list))) {
+        ret = -1;
+        goto cleanup;
+    }
+
 #define DO_TEST(arch, api, name, host, cpu,                             \
-                models, nmodels, flags, result)                         \
+                models, flags, result)                                  \
     do {                                                                \
         struct data data = {                                            \
             arch, host, cpu, models,                                    \
             models == NULL ? NULL : #models,                            \
-            nmodels, flags, result                                      \
+            flags, result                                               \
         };                                                              \
         char *testLabel;                                                \
         char *tmp;                                                      \
@@ -784,12 +820,12 @@ mymain(void)
 #define DO_TEST_COMPARE(arch, host, cpu, result)                        \
     DO_TEST(arch, cpuTestCompare,                                       \
             host "/" cpu " (" #result ")",                              \
-            host, cpu, NULL, 0, 0, result)
+            host, cpu, NULL, 0, result)
 
 #define DO_TEST_UPDATE_ONLY(arch, host, cpu)                            \
     DO_TEST(arch, cpuTestUpdate,                                        \
             cpu " on " host,                                            \
-            host, cpu, NULL, 0, 0, 0)
+            host, cpu, NULL, 0, 0)
 
 #define DO_TEST_UPDATE(arch, host, cpu, result)                         \
     do {                                                                \
@@ -809,7 +845,7 @@ mymain(void)
             ret = -1;                                                   \
         } else {                                                        \
             DO_TEST(arch, cpuTestBaseline, label, NULL,                 \
-                    "baseline-" name, NULL, 0, flags, result);          \
+                    "baseline-" name, NULL, flags, result);             \
         }                                                               \
         VIR_FREE(label);                                                \
     } while (0)
@@ -817,21 +853,19 @@ mymain(void)
 #define DO_TEST_HASFEATURE(arch, host, feature, result)                 \
     DO_TEST(arch, cpuTestHasFeature,                                    \
             host "/" feature " (" #result ")",                          \
-            host, feature, NULL, 0, 0, result)
+            host, feature, NULL, 0, result)
 
 #define DO_TEST_GUESTCPU(arch, host, cpu, models, result)               \
     DO_TEST(arch, cpuTestGuestCPU,                                      \
             host "/" cpu " (" #models ")",                              \
-            host, cpu, models,                                          \
-            models == NULL ? 0 : sizeof(models) / sizeof(char *),       \
-            0, result)
+            host, cpu, models, 0, result)
 
 #if WITH_QEMU && WITH_YAJL
 # define DO_TEST_CPUID_JSON(arch, host, json)                           \
     do {                                                                \
         if (json) {                                                     \
             DO_TEST(arch, cpuTestJSONCPUID, host, host,                 \
-                    NULL, NULL, 0, 0, 0);                               \
+                    NULL, NULL, 0, 0);                                  \
         }                                                               \
     } while (0)
 #else
@@ -841,13 +875,13 @@ mymain(void)
 #define DO_TEST_CPUID(arch, host, json)                                 \
     do {                                                                \
         DO_TEST(arch, cpuTestHostCPUID, host, host,                     \
-                NULL, NULL, 0, 0, 0);                                   \
+                NULL, NULL, 0, 0);                                      \
         DO_TEST(arch, cpuTestGuestCPUID, host, host,                    \
-                NULL, NULL, 0, 0, 0);                                   \
+                NULL, NULL, 0, 0);                                      \
         DO_TEST_CPUID_JSON(arch, host, json);                           \
         if (json) {                                                     \
             DO_TEST(arch, cpuTestUpdateLive, host, host,                \
-                    NULL, NULL, 0, 0, 0);                               \
+                    NULL, NULL, 0, 0);                                  \
         }                                                               \
     } while (0)
 
@@ -1012,10 +1046,17 @@ mymain(void)
     DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-W3520", true);
     DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-X5460", false);
 
+ cleanup:
 #if WITH_QEMU && WITH_YAJL
     qemuTestDriverFree(&driver);
 #endif
 
+    virObjectUnref(model486);
+    virObjectUnref(nomodel);
+    virObjectUnref(models);
+    virObjectUnref(haswell);
+    virObjectUnref(ppc_models);
+
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
-- 
2.14.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to