Two places would call to qemuPrepareCpumap() with priv->autoNodeset to
convert it to a cpuset. Remove the function and use the prepared cpuset
automatically.
---
src/qemu/qemu_cgroup.c | 18 +++--------
src/qemu/qemu_cgroup.h | 3 +-
src/qemu/qemu_process.c | 82 ++++++++++++-------------------------------------
src/qemu/qemu_process.h | 2 --
4 files changed, 25 insertions(+), 80 deletions(-)
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 8674ab8..7ba3059 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -1099,11 +1099,9 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
}
int
-qemuSetupCgroupForEmulator(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+qemuSetupCgroupForEmulator(virDomainObjPtr vm)
{
virBitmapPtr cpumask = NULL;
- virBitmapPtr cpumap = NULL;
virCgroupPtr cgroup_emulator = NULL;
virDomainDefPtr def = vm->def;
qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -1135,15 +1133,12 @@ qemuSetupCgroupForEmulator(virQEMUDriverPtr driver,
if (virCgroupMoveTask(priv->cgroup, cgroup_emulator) < 0)
goto cleanup;
- if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
- if (!(cpumap = qemuPrepareCpumap(driver, priv->autoNodeset)))
- goto cleanup;
- cpumask = cpumap;
- } else if (def->cputune.emulatorpin) {
+ if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
+ cpumask = priv->autoCpuset;
+ else if (def->cputune.emulatorpin)
cpumask = def->cputune.emulatorpin->cpumask;
- } else if (def->cpumask) {
+ else if (def->cpumask)
cpumask = def->cpumask;
- }
if (cpumask) {
if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)
&&
@@ -1159,12 +1154,9 @@ qemuSetupCgroupForEmulator(virQEMUDriverPtr driver,
}
virCgroupFree(&cgroup_emulator);
- virBitmapFree(cpumap);
return 0;
cleanup:
- virBitmapFree(cpumap);
-
if (cgroup_emulator) {
virCgroupRemove(cgroup_emulator);
virCgroupFree(&cgroup_emulator);
diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h
index b311af3..11893ef 100644
--- a/src/qemu/qemu_cgroup.h
+++ b/src/qemu/qemu_cgroup.h
@@ -63,8 +63,7 @@ int qemuSetupCgroupIOThreadsPin(virCgroupPtr cgroup,
int iothreadid);
int qemuSetupCgroupForVcpu(virDomainObjPtr vm);
int qemuSetupCgroupForIOThreads(virDomainObjPtr vm);
-int qemuSetupCgroupForEmulator(virQEMUDriverPtr driver,
- virDomainObjPtr vm);
+int qemuSetupCgroupForEmulator(virDomainObjPtr vm);
int qemuRemoveCgroup(virQEMUDriverPtr driver, virDomainObjPtr vm);
int qemuAddToCgroup(virDomainObjPtr vm);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 4a786b1..69c44d9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2273,67 +2273,12 @@ qemuProcessDetectIOThreadPIDs(virQEMUDriverPtr driver,
return ret;
}
-/* Helper to prepare cpumap for affinity setting, convert
- * NUMA nodeset into cpuset if @nodemask is not NULL, otherwise
- * just return a new allocated bitmap.
- */
-virBitmapPtr
-qemuPrepareCpumap(virQEMUDriverPtr driver,
- virBitmapPtr nodemask)
-{
- size_t i;
- int hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
- virBitmapPtr cpumap = NULL;
- virCapsPtr caps = NULL;
-
- /* setaffinity fails if you set bits for CPUs which
- * aren't present, so we have to limit ourselves */
- if ((hostcpus = nodeGetCPUCount()) < 0)
- return NULL;
-
- if (maxcpu > hostcpus)
- maxcpu = hostcpus;
-
- if (!(cpumap = virBitmapNew(maxcpu)))
- return NULL;
-
- if (nodemask) {
- if (!(caps = virQEMUDriverGetCapabilities(driver, false))) {
- virBitmapFree(cpumap);
- cpumap = NULL;
- goto cleanup;
- }
-
- for (i = 0; i < caps->host.nnumaCell; i++) {
- size_t j;
- int cur_ncpus = caps->host.numaCell[i]->ncpus;
- bool result;
- if (virBitmapGetBit(nodemask, caps->host.numaCell[i]->num, &result)
< 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Failed to convert nodeset to cpuset"));
- virBitmapFree(cpumap);
- cpumap = NULL;
- goto cleanup;
- }
- if (result) {
- for (j = 0; j < cur_ncpus; j++)
- ignore_value(virBitmapSetBit(cpumap,
-
caps->host.numaCell[i]->cpus[j].id));
- }
- }
- }
-
- cleanup:
- virObjectUnref(caps);
- return cpumap;
-}
/*
* To be run between fork/exec of QEMU only
*/
static int
-qemuProcessInitCpuAffinity(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+qemuProcessInitCpuAffinity(virDomainObjPtr vm)
{
int ret = -1;
virBitmapPtr cpumap = NULL;
@@ -2346,23 +2291,34 @@ qemuProcessInitCpuAffinity(virQEMUDriverPtr driver,
return -1;
}
- if (!(cpumap = qemuPrepareCpumap(driver, priv->autoNodeset)))
- return -1;
-
if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
VIR_DEBUG("Set CPU affinity with advisory nodeset from numad");
- cpumapToSet = cpumap;
+ cpumapToSet = priv->autoCpuset;
} else {
VIR_DEBUG("Set CPU affinity with specified cpuset");
if (vm->def->cpumask) {
cpumapToSet = vm->def->cpumask;
} else {
- cpumapToSet = cpumap;
/* You may think this is redundant, but we can't assume libvirtd
* itself is running on all pCPUs, so we need to explicitly set
* the spawned QEMU instance to all pCPUs if no map is given in
* its config file */
+ int hostcpus;
+
+ /* setaffinity fails if you set bits for CPUs which
+ * aren't present, so we have to limit ourselves */
+ if ((hostcpus = nodeGetCPUCount()) < 0)
+ goto cleanup;
+
+ if (hostcpus > QEMUD_CPUMASK_LEN)
+ hostcpus = QEMUD_CPUMASK_LEN;
+
+ if (!(cpumap = virBitmapNew(hostcpus)))
+ goto cleanup;
+
virBitmapSetAll(cpumap);
+
+ cpumapToSet = cpumap;
}
}
@@ -4787,7 +4743,7 @@ int qemuProcessStart(virConnectPtr conn,
/* This must be done after cgroup placement to avoid resetting CPU
* affinity */
if (!vm->def->cputune.emulatorpin &&
- qemuProcessInitCpuAffinity(driver, vm) < 0)
+ qemuProcessInitCpuAffinity(vm) < 0)
goto cleanup;
VIR_DEBUG("Setting domain security labels");
@@ -4834,7 +4790,7 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup;
VIR_DEBUG("Setting cgroup for emulator (if required)");
- if (qemuSetupCgroupForEmulator(driver, vm) < 0)
+ if (qemuSetupCgroupForEmulator(vm) < 0)
goto cleanup;
VIR_DEBUG("Setting affinity of emulator threads");
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 3c04179..c67b0cb 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -99,8 +99,6 @@ int qemuProcessAutoDestroyRemove(virQEMUDriverPtr driver,
virDomainObjPtr vm);
bool qemuProcessAutoDestroyActive(virQEMUDriverPtr driver,
virDomainObjPtr vm);
-virBitmapPtr qemuPrepareCpumap(virQEMUDriverPtr driver,
- virBitmapPtr nodemask);
int qemuProcessReadLog(int fd, char *buf, int buflen, int off, bool skipchar);
--
2.2.2