The drivers for QEMU and LXC use virNodeGetInfo only to determine
the number of host CPUs. On Linux hosts nodeGetCPUCount has less
overhead.
---
V3 Changes:
Commit message wording, since Peter's fix, nodeGetInfo will return
correct/consistent topology. Still, this here is more efficient.
V2 Changes:
Implemented Eric Blake's suggestion to remove code bloat
introduced by first patch version.
New helper function getPyNodeCPUCount is now used to calculate
the number of node CPUs.
src/lxc/lxc_controller.c | 8 +++-----
src/qemu/qemu_driver.c | 14 +++++---------
src/qemu/qemu_process.c | 8 +++-----
3 files changed, 11 insertions(+), 19 deletions(-)
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index a41c903..ed3d3d0 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -492,17 +492,15 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr
ctrl)
static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
{
int hostcpus, maxcpu = CPU_SETSIZE;
- virNodeInfo nodeinfo;
virBitmapPtr cpumap, cpumapToSet;
VIR_DEBUG("Setting CPU affinity");
- if (nodeGetInfo(NULL, &nodeinfo) < 0)
- return -1;
-
/* setaffinity fails if you set bits for CPUs which
* aren't present, so we have to limit ourselves */
- hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+ if ((hostcpus = nodeGetCPUCount()) < 0)
+ return -1;
+
if (maxcpu > hostcpus)
maxcpu = hostcpus;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5556f1e..826efe6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4170,7 +4170,6 @@ qemudDomainGetVcpuPinInfo(virDomainPtr dom,
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
- virNodeInfo nodeinfo;
virDomainDefPtr targetDef = NULL;
int ret = -1;
int maxcpu, hostcpus, vcpu, pcpu;
@@ -4206,9 +4205,9 @@ qemudDomainGetVcpuPinInfo(virDomainPtr dom,
/* Coverity didn't realize that targetDef must be set if we got here. */
sa_assert(targetDef);
- if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
+ if ((hostcpus = nodeGetCPUCount()) < 0)
goto cleanup;
- hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+
maxcpu = maplen * 8;
if (maxcpu > hostcpus)
maxcpu = hostcpus;
@@ -4421,7 +4420,6 @@ qemudDomainGetEmulatorPinInfo(virDomainPtr dom,
{
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
- virNodeInfo nodeinfo;
virDomainDefPtr targetDef = NULL;
int ret = -1;
int maxcpu, hostcpus, pcpu;
@@ -4453,9 +4451,9 @@ qemudDomainGetEmulatorPinInfo(virDomainPtr dom,
/* Coverity didn't realize that targetDef must be set if we got here. */
sa_assert(targetDef);
- if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
+ if ((hostcpus = nodeGetCPUCount()) < 0)
goto cleanup;
- hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+
maxcpu = maplen * 8;
if (maxcpu > hostcpus)
maxcpu = hostcpus;
@@ -4498,7 +4496,6 @@ qemudDomainGetVcpus(virDomainPtr dom,
int maplen) {
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
- virNodeInfo nodeinfo;
int i, v, maxcpu, hostcpus;
int ret = -1;
qemuDomainObjPrivatePtr priv;
@@ -4524,10 +4521,9 @@ qemudDomainGetVcpus(virDomainPtr dom,
priv = vm->privateData;
- if (nodeGetInfo(dom->conn, &nodeinfo) < 0)
+ if ((hostcpus = nodeGetCPUCount()) < 0)
goto cleanup;
- hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
maxcpu = maplen * 8;
if (maxcpu > hostcpus)
maxcpu = hostcpus;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 8bf80e7..29b7ae1 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1902,15 +1902,13 @@ qemuPrepareCpumap(struct qemud_driver *driver,
virBitmapPtr nodemask)
{
int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
- virNodeInfo nodeinfo;
virBitmapPtr cpumap = NULL;
- if (nodeGetInfo(NULL, &nodeinfo) < 0)
- return NULL;
-
/* setaffinity fails if you set bits for CPUs which
* aren't present, so we have to limit ourselves */
- hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+ if ((hostcpus = nodeGetCPUCount()) < 0)
+ return NULL;
+
if (maxcpu > hostcpus)
maxcpu = hostcpus;
--
1.7.12.4