virCPUDefFreeModel(def);
for (i = 0 ; i < def->ncells ; i++) {
- VIR_FREE(def->cells[i].cpumask);
+ virBitmapFree(def->cells[i].cpumask);
VIR_FREE(def->cells[i].cpustr);
}
VIR_FREE(def->cells);
copy->cells[i].cellid = cpu->cells[i].cellid;
copy->cells[i].mem = cpu->cells[i].mem;
- if (VIR_ALLOC_N(copy->cells[i].cpumask,
- VIR_DOMAIN_CPUMASK_LEN) < 0)
+ copy->cells[i].cpumask = virBitmapNewCopy(cpu->cells[i].cpumask);
+
+ if (!copy->cells[i].cpumask)
goto no_memory;
- memcpy(copy->cells[i].cpumask, cpu->cells[i].cpumask,
- VIR_DOMAIN_CPUMASK_LEN);
if (!(copy->cells[i].cpustr = strdup(cpu->cells[i].cpustr)))
goto no_memory;
for (i = 0 ; i < n ; i++) {
char *cpus, *memory;
- int cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
int ret, ncpus = 0;
def->cells[i].cellid = i;
}
def->cells[i].cpustr = cpus;
- if (VIR_ALLOC_N(def->cells[i].cpumask, cpumasklen) < 0)
- goto no_memory;
-
- ncpus = virDomainCpuSetParse(cpus, 0, def->cells[i].cpumask,
- cpumasklen);
+ ncpus = virBitmapParse(cpus, 0, &def->cells[i].cpumask,
+ VIR_DOMAIN_CPUMASK_LEN);
if (ncpus <= 0)
goto error;
def->cells_cpus += ncpus;
# include "util.h"
# include "buf.h"
# include "xml.h"
+# include "bitmap.h"
# define VIR_CPU_VENDOR_ID_LENGTH 12
typedef virCellDef *virCellDefPtr;
struct _virCellDef {
int cellid;
- char *cpumask; /* CPUs that are part of this node */
+ virBitmapPtr cpumask; /* CPUs that are part of this node */
char *cpustr; /* CPUs stored in string form for dumpxml */
unsigned int mem; /* Node memory in kB */
};
return virBufferContentAndReset(&buf);
}
-static void
-qemuBuildNumaCPUArgStr(char *cpumask, virBufferPtr buf)
-{
- int i, first, last;
- int cpuSet = 0;
-
- first = last = 0;
- for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
- if (cpumask[i]) {
- if (cpuSet) {
- last = i;
- } else {
- first = last = i;
- cpuSet = 1;
- }
- } else {
- if (!cpuSet)
- continue;
- if (first == last)
- virBufferAsprintf(buf, "%d,", first);
- else
- virBufferAsprintf(buf, "%d-%d,", first, last);
- cpuSet = 0;
- }
- }
-
- if (cpuSet) {
- if (first == last)
- virBufferAsprintf(buf, "%d,", first);
- else
- virBufferAsprintf(buf, "%d-%d,", first, last);
- }
-}
-
static int
qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
{
int i;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ char *cpumask;
for (i = 0; i < def->cpu->ncells; i++) {
virCommandAddArg(cmd, "-numa");
virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
virBufferAddLit(&buf, ",cpus=");
- qemuBuildNumaCPUArgStr(def->cpu->cells[i].cpumask, &buf);
+ cpumask = virBitmapFormat(def->cpu->cells[i].cpumask);
+ if (cpumask) {
+ virBufferAsprintf(&buf, "%s", cpumask);
+ VIR_FREE(cpumask);
+ }
def->cpu->cells[i].mem = VIR_DIV_UP(def->cpu->cells[i].mem,
1024) * 1024;
- virBufferAsprintf(&buf, "mem=%d", def->cpu->cells[i].mem / 1024);
+ virBufferAsprintf(&buf, ",mem=%d", def->cpu->cells[i].mem / 1024);
if (virBufferError(&buf))
goto error;