virCPUData and struct ppc64_model structures contained a pointer to
virCPUppc64Data, which was not very nice since the real data were
accessible by yet another level of pointers from virCPUppc64Data.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/cpu/cpu.h | 2 +-
src/cpu/cpu_ppc64.c | 65 +++++++++++++++++++-----------------------------
src/cpu/cpu_ppc64_data.h | 2 ++
3 files changed, 28 insertions(+), 41 deletions(-)
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 7407e06..f1d5276 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -38,7 +38,7 @@ struct _virCPUData {
virArch arch;
union {
virCPUx86Data x86;
- virCPUppc64Data *ppc64;
+ virCPUppc64Data ppc64;
/* generic driver needs no data */
} data;
};
diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c
index 09f4596..ad2d6a7 100644
--- a/src/cpu/cpu_ppc64.c
+++ b/src/cpu/cpu_ppc64.c
@@ -47,7 +47,7 @@ struct ppc64_vendor {
struct ppc64_model {
char *name;
const struct ppc64_vendor *vendor;
- virCPUppc64Data *data;
+ virCPUppc64Data data;
};
struct ppc64_map {
@@ -133,39 +133,30 @@ ppc64CheckCompatibilityMode(const char *host_model,
}
static void
-ppc64DataFree(virCPUppc64Data *data)
+ppc64DataClear(virCPUppc64Data *data)
{
if (!data)
return;
VIR_FREE(data->pvr);
- VIR_FREE(data);
}
-static virCPUppc64Data *
-ppc64DataCopy(const virCPUppc64Data *data)
+static int
+ppc64DataCopy(virCPUppc64Data *dst, const virCPUppc64Data *src)
{
- virCPUppc64Data *copy;
size_t i;
- if (VIR_ALLOC(copy) < 0)
- goto error;
+ if (VIR_ALLOC_N(dst->pvr, src->len) < 0)
+ return -1;
- if (VIR_ALLOC_N(copy->pvr, data->len) < 0)
- goto error;
+ dst->len = src->len;
- copy->len = data->len;
-
- for (i = 0; i < data->len; i++) {
- copy->pvr[i].value = data->pvr[i].value;
- copy->pvr[i].mask = data->pvr[i].mask;
+ for (i = 0; i < src->len; i++) {
+ dst->pvr[i].value = src->pvr[i].value;
+ dst->pvr[i].mask = src->pvr[i].mask;
}
- return copy;
-
- error:
- ppc64DataFree(copy);
- return NULL;
+ return 0;
}
static void
@@ -198,7 +189,7 @@ ppc64ModelFree(struct ppc64_model *model)
if (!model)
return;
- ppc64DataFree(model->data);
+ ppc64DataClear(&model->data);
VIR_FREE(model->name);
VIR_FREE(model);
}
@@ -214,7 +205,7 @@ ppc64ModelCopy(const struct ppc64_model *model)
if (VIR_STRDUP(copy->name, model->name) < 0)
goto error;
- if (!(copy->data = ppc64DataCopy(model->data)))
+ if (ppc64DataCopy(©->data, &model->data) < 0)
goto error;
copy->vendor = model->vendor;
@@ -249,8 +240,8 @@ ppc64ModelFindPVR(const struct ppc64_map *map,
for (i = 0; i < map->nmodels; i++) {
struct ppc64_model *model = map->models[i];
- for (j = 0; j < model->data->len; j++) {
- if ((pvr & model->data->pvr[j].mask) ==
model->data->pvr[j].value)
+ for (j = 0; j < model->data.len; j++) {
+ if ((pvr & model->data.pvr[j].mask) == model->data.pvr[j].value)
return model;
}
}
@@ -359,9 +350,6 @@ ppc64ModelParse(xmlXPathContextPtr ctxt,
if (VIR_ALLOC(model) < 0)
goto error;
- if (VIR_ALLOC(model->data) < 0)
- goto error;
-
model->name = virXPathString("string(@name)", ctxt);
if (!model->name) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -399,10 +387,10 @@ ppc64ModelParse(xmlXPathContextPtr ctxt,
goto error;
}
- if (VIR_ALLOC_N(model->data->pvr, n) < 0)
+ if (VIR_ALLOC_N(model->data.pvr, n) < 0)
goto error;
- model->data->len = n;
+ model->data.len = n;
for (i = 0; i < n; i++) {
ctxt->node = nodes[i];
@@ -413,7 +401,7 @@ ppc64ModelParse(xmlXPathContextPtr ctxt,
model->name);
goto error;
}
- model->data->pvr[i].value = pvr;
+ model->data.pvr[i].value = pvr;
if (virXPathULongHex("string(./@mask)", ctxt, &pvr) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -421,7 +409,7 @@ ppc64ModelParse(xmlXPathContextPtr ctxt,
model->name);
goto error;
}
- model->data->pvr[i].mask = pvr;
+ model->data.pvr[i].mask = pvr;
}
cleanup:
@@ -510,7 +498,7 @@ ppc64MakeCPUData(virArch arch,
cpuData->arch = arch;
- if (!(cpuData->data.ppc64 = ppc64DataCopy(data)))
+ if (ppc64DataCopy(&cpuData->data.ppc64, data) < 0)
VIR_FREE(cpuData);
return cpuData;
@@ -632,7 +620,7 @@ ppc64Compute(virCPUDefPtr host,
}
if (guestData)
- if (!(*guestData = ppc64MakeCPUData(arch, guest_model->data)))
+ if (!(*guestData = ppc64MakeCPUData(arch, &guest_model->data)))
goto cleanup;
ret = VIR_CPU_COMPARE_IDENTICAL;
@@ -685,10 +673,10 @@ ppc64DriverDecode(virCPUDefPtr cpu,
if (!data || !(map = ppc64LoadMap()))
return -1;
- if (!(model = ppc64ModelFindPVR(map, data->data.ppc64->pvr[0].value))) {
+ if (!(model = ppc64ModelFindPVR(map, data->data.ppc64.pvr[0].value))) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("Cannot find CPU model with PVR 0x%08x"),
- data->data.ppc64->pvr[0].value);
+ data->data.ppc64.pvr[0].value);
goto cleanup;
}
@@ -718,7 +706,7 @@ ppc64DriverFree(virCPUDataPtr data)
if (!data)
return;
- ppc64DataFree(data->data.ppc64);
+ ppc64DataClear(&data->data.ppc64);
VIR_FREE(data);
}
@@ -731,10 +719,7 @@ ppc64DriverNodeData(virArch arch)
if (VIR_ALLOC(nodeData) < 0)
goto error;
- if (VIR_ALLOC(nodeData->data.ppc64) < 0)
- goto error;
-
- data = nodeData->data.ppc64;
+ data = &nodeData->data.ppc64;
if (VIR_ALLOC_N(data->pvr, 1) < 0)
goto error;
diff --git a/src/cpu/cpu_ppc64_data.h b/src/cpu/cpu_ppc64_data.h
index c0a130e..6c069eb 100644
--- a/src/cpu/cpu_ppc64_data.h
+++ b/src/cpu/cpu_ppc64_data.h
@@ -32,6 +32,8 @@ struct _virCPUppc64PVR {
uint32_t mask;
};
+# define VIR_CPU_PPC64_DATA_INIT { 0 }
+
typedef struct _virCPUppc64Data virCPUppc64Data;
struct _virCPUppc64Data {
size_t len;
--
2.8.3