diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 3a14d12c89..0916e49d6b 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -134,7 +134,7 @@ xenDomainUsedCpus(virDomainPtr dom) char *res = NULL; int ncpus; int nb_vcpu; - char *cpulist = NULL; + virBitmapPtr cpulist = NULL; unsigned char *cpumap = NULL; size_t cpumaplen; int nb = 0; @@ -156,7 +156,7 @@ xenDomainUsedCpus(virDomainPtr dom) if (xenUnifiedNodeGetInfo(dom->conn, &nodeinfo) < 0) return NULL; - if (VIR_ALLOC_N(cpulist, priv->nbNodeCpus) < 0) { + if (!(cpulist = virBitmapNew(priv->nbNodeCpus))) { virReportOOMError(); goto done; } @@ -175,9 +175,11 @@ xenDomainUsedCpus(virDomainPtr dom) cpumap, cpumaplen)) >= 0) { for (n = 0 ; n < ncpus ; n++) { for (m = 0 ; m < priv->nbNodeCpus; m++) { - if ((cpulist[m] == 0) && + bool used; + ignore_value(virBitmapGetBit(cpulist, m, &used)); + if ((!used) && (VIR_CPU_USABLE(cpumap, cpumaplen, n, m))) { - cpulist[m] = 1; + ignore_value(virBitmapSetBit(cpulist, m)); nb++; /* if all CPU are used just return NULL */ if (nb == priv->nbNodeCpus) @@ -186,11 +188,11 @@ xenDomainUsedCpus(virDomainPtr dom) } } } - res = virDomainCpuSetFormat(cpulist, priv->nbNodeCpus); + res = virBitmapFormat(cpulist); } done: - VIR_FREE(cpulist); + virBitmapFree(cpulist); VIR_FREE(cpumap); VIR_FREE(cpuinfo); return res; diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 984f0404a8..95152f8759 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -1113,7 +1113,7 @@ sexpr_to_xend_topology(const struct sexpr *root, { const char *nodeToCpu; const char *cur; - char *cpuset = NULL; + virBitmapPtr cpuset = NULL; int *cpuNums = NULL; int cell, cpu, nb_cpus; int n = 0; @@ -1126,8 +1126,6 @@ sexpr_to_xend_topology(const struct sexpr *root, numCpus = sexpr_int(root, "node/nr_cpus"); - if (VIR_ALLOC_N(cpuset, numCpus) < 0) - goto memory_error; if (VIR_ALLOC_N(cpuNums, numCpus) < 0) goto memory_error; @@ -1150,17 +1148,21 @@ sexpr_to_xend_topology(const struct sexpr *root, virSkipSpacesAndBackslash(&cur); if (STRPREFIX(cur, "no cpus")) { nb_cpus = 0; - for (cpu = 0; cpu < numCpus; cpu++) - cpuset[cpu] = 0; + if (!(cpuset = virBitmapNew(numCpus))) + goto memory_error; } else { - nb_cpus = virDomainCpuSetParse(cur, 'n', cpuset, numCpus); + nb_cpus = virBitmapParse(cur, 'n', &cpuset, numCpus); if (nb_cpus < 0) goto error; } - for (n = 0, cpu = 0; cpu < numCpus; cpu++) - if (cpuset[cpu] == 1) + for (n = 0, cpu = 0; cpu < numCpus; cpu++) { + bool used; + + ignore_value(virBitmapGetBit(cpuset, cpu, &used)); + if (used) cpuNums[n++] = cpu; + } if (virCapabilitiesAddHostNUMACell(caps, cell, @@ -1169,20 +1171,20 @@ sexpr_to_xend_topology(const struct sexpr *root, goto memory_error; } VIR_FREE(cpuNums); - VIR_FREE(cpuset); + virBitmapFree(cpuset); return 0; parse_error: virReportError(VIR_ERR_XEN_CALL, "%s", _("topology syntax error")); error: VIR_FREE(cpuNums); - VIR_FREE(cpuset); + virBitmapFree(cpuset); return -1; memory_error: VIR_FREE(cpuNums); - VIR_FREE(cpuset); + virBitmapFree(cpuset); virReportOOMError(); return -1; }