The mask was stored both as a bitmap and as a string. The string is used
for XML output only. Remove the string, as it can be reconstructed from
the bitmap.
The test change is necessary as the bitmap formatter doesn't "optimize"
using the '^' operator.
---
src/conf/cpu_conf.c | 14 +++++++-------
src/conf/cpu_conf.h | 1 -
src/conf/numa_conf.c | 3 +--
tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml | 2 +-
.../qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml | 2 +-
5 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 98b309b..11ad5f4 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -86,10 +86,8 @@ virCPUDefFree(virCPUDefPtr def)
virCPUDefFreeModel(def);
- for (i = 0; i < def->ncells; i++) {
+ for (i = 0; i < def->ncells; i++)
virBitmapFree(def->cells[i].cpumask);
- VIR_FREE(def->cells[i].cpustr);
- }
VIR_FREE(def->cells);
VIR_FREE(def->vendor_id);
@@ -162,9 +160,6 @@ virCPUDefCopy(const virCPUDef *cpu)
if (!copy->cells[i].cpumask)
goto error;
-
- if (VIR_STRDUP(copy->cells[i].cpustr, cpu->cells[i].cpustr) < 0)
- goto error;
}
copy->cells_cpus = cpu->cells_cpus;
}
@@ -601,16 +596,21 @@ virCPUDefFormatBuf(virBufferPtr buf,
virBufferAdjustIndent(buf, 2);
for (i = 0; i < def->ncells; i++) {
virMemAccess memAccess = def->cells[i].memAccess;
+ char *cpustr = NULL;
+
+ if (!(cpustr = virBitmapFormat(def->cells[i].cpumask)))
+ return -1;
virBufferAddLit(buf, "<cell");
virBufferAsprintf(buf, " id='%zu'", i);
- virBufferAsprintf(buf, " cpus='%s'",
def->cells[i].cpustr);
+ virBufferAsprintf(buf, " cpus='%s'", cpustr);
virBufferAsprintf(buf, " memory='%llu'",
def->cells[i].mem);
virBufferAddLit(buf, " unit='KiB'");
if (memAccess)
virBufferAsprintf(buf, " memAccess='%s'",
virMemAccessTypeToString(memAccess));
virBufferAddLit(buf, "/>\n");
+ VIR_FREE(cpustr);
}
virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</numa>\n");
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
index e201656..d6efba7 100644
--- a/src/conf/cpu_conf.h
+++ b/src/conf/cpu_conf.h
@@ -104,7 +104,6 @@ typedef struct _virCellDef virCellDef;
typedef virCellDef *virCellDefPtr;
struct _virCellDef {
virBitmapPtr cpumask; /* CPUs that are part of this node */
- char *cpustr; /* CPUs stored in string form for dumpxml */
unsigned long long mem; /* Node memory in kB */
virMemAccess memAccess;
};
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index c50369d..965d67b 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -749,8 +749,7 @@ virDomainNumaDefCPUParseXML(virCPUDefPtr def,
if (ncpus <= 0)
goto cleanup;
def->cells_cpus += ncpus;
-
- def->cells[cur_cell].cpustr = tmp;
+ VIR_FREE(tmp);
ctxt->node = nodes[i];
if (virDomainParseMemory("./@memory", "./@unit", ctxt,
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
index 8912017..73dfdf5 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-memnode.xml
@@ -17,7 +17,7 @@
<numa>
<cell id='0' cpus='0' memory='20002'
unit='KiB'/>
<cell id='1' cpus='1-27,29' memory='660066'
unit='KiB'/>
- <cell id='2' cpus='28-31,^29' memory='24002400'
unit='KiB'/>
+ <cell id='2' cpus='28,30-31' memory='24002400'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
index ffc57cf..7542125 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-numatune-memnode.xml
@@ -17,7 +17,7 @@
<numa>
<cell id='0' cpus='0' memory='20002'
unit='KiB'/>
<cell id='1' cpus='1-27,29' memory='660066'
unit='KiB'/>
- <cell id='2' cpus='28-31,^29' memory='24002400'
unit='KiB'/>
+ <cell id='2' cpus='28,30-31' memory='24002400'
unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
--
2.2.2