On 03/19/2015 01:08 PM, John Ferlan wrote:
Impending IOThread setting patches would copy the code anyway, so
create
and generalize the adding of pindef for the vcpu into its own API
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_driver.c | 104 +++++++++++++++++++++++++++++--------------------
1 file changed, 62 insertions(+), 42 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 673b95e..1fca43c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4669,6 +4669,63 @@ qemuDomainHotplugAddCgroup(virCgroupPtr cgroup,
return NULL;
}
+typedef int cgroupSetupFunc(virCgroupPtr cgroup,
+ virDomainPinDefPtr *pindef,
+ int npin,
+ int id);
+
+static int
+qemuDomainHotplugAddPin(virBitmapPtr cpumask,
+ int index,
+ pid_t pid,
+ virDomainPinDefPtr **pindef_list,
+ size_t *npin,
+ cgroupSetupFunc func,
+ virCgroupPtr cgroup)
+{
+ int ret = -1;
+ virDomainPinDefPtr pindef = NULL;
+
+ /* vm->def->cputune.* arrays can't be NULL if
+ * vm->def->cpumask is not NULL.
+ */
+ if (VIR_ALLOC(pindef) < 0)
+ goto cleanup;
+
+ if (!(pindef->cpumask = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN))) {
+ VIR_FREE(pindef);
+ goto cleanup;
+ }
+ virBitmapCopy(pindef->cpumask, cpumask);
+ pindef->id = index;
+ if (VIR_APPEND_ELEMENT_COPY(*pindef_list, *npin, pindef) < 0) {
+ virBitmapFree(pindef->cpumask);
+ VIR_FREE(pindef);
+ goto cleanup;
+ }
+
+ if (cgroup) {
+ if (func(cgroup, *pindef_list, *npin, index) < 0) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("failed to set cpuset.cpus in cgroup for id
%d"),
+ index);
+ goto cleanup;
+ }
+ } else {
+ if (virProcessSetAffinity(pid, pindef->cpumask) < 0) {
+ virReportError(VIR_ERR_SYSTEM_ERROR,
+ _("failed to set cpu affinity for id %d"),
+ index);
+ goto cleanup;
+ }
+ }
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
static int
qemuDomainHotplugDelCgroupPin(virCgroupPtr cgroup,
cgroupNewFunc func,
@@ -4795,51 +4852,14 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
/* Inherit def->cpuset */
if (vm->def->cpumask) {
- /* vm->def->cputune.vcpupin can't be NULL if
- * vm->def->cpumask is not NULL.
- */
- virDomainPinDefPtr vcpupin = NULL;
-
- if (VIR_ALLOC(vcpupin) < 0)
- goto cleanup;
-
- if (!(vcpupin->cpumask =
- virBitmapNew(VIR_DOMAIN_CPUMASK_LEN))) {
- VIR_FREE(vcpupin);
- goto cleanup;
- }
- virBitmapCopy(vcpupin->cpumask, vm->def->cpumask);
- vcpupin->id = i;
- if (VIR_APPEND_ELEMENT_COPY(vm->def->cputune.vcpupin,
- vm->def->cputune.nvcpupin, vcpupin)
< 0) {
- virBitmapFree(vcpupin->cpumask);
- VIR_FREE(vcpupin);
+ if (qemuDomainHotplugAddPin(vm->def->cpumask, i, cpupids[i],
+ &vm->def->cputune.vcpupin,
+ &vm->def->cputune.nvcpupin,
+ qemuSetupCgroupVcpuPin,
+ cgroup_vcpu) < 0)
ret = -1;
goto cleanup;
Ran my changes againt Coverity - looks like I missed something right
here - consider the following squashed in:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1fca43c..496a4af 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4856,9 +4856,10 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
&vm->def->cputune.vcpupin,
&vm->def->cputune.nvcpupin,
qemuSetupCgroupVcpuPin,
- cgroup_vcpu) < 0)
+ cgroup_vcpu) < 0) {
ret = -1;
goto cleanup;
+ }
}
virCgroupFree(&cgroup_vcpu);
- }
-
- if (cgroup_vcpu) {
- if (qemuSetupCgroupVcpuPin(cgroup_vcpu,
- vm->def->cputune.vcpupin,
- vm->def->cputune.nvcpupin, i) <
0) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("failed to set cpuset.cpus in
cgroup"
- " for vcpu %zu"), i);
- ret = -1;
- goto cleanup;
- }
- } else {
- if (virProcessSetAffinity(cpupids[i],
- vcpupin->cpumask) < 0) {
- virReportError(VIR_ERR_SYSTEM_ERROR,
- _("failed to set cpu affinity for vcpu
%zu"),
- i);
- ret = -1;
- goto cleanup;
- }
- }
}
-
virCgroupFree(&cgroup_vcpu);
if (qemuProcessSetSchedParams(i, cpupids[i],