Future IOThread setting patches would copy the code anyway, so create
and generalize the add the vcpu to a cgroup into its own API.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_driver.c | 69 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 48 insertions(+), 21 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6132674..fa880b7 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4635,9 +4635,49 @@ static void qemuProcessEventHandler(void *data, void *opaque)
VIR_FREE(processEvent);
}
-static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
- virDomainObjPtr vm,
- unsigned int nvcpus)
+typedef int cgroupNewFunc(virCgroupPtr domain,
+ int id,
+ bool create,
+ virCgroupPtr *group);
+
+static virCgroupPtr
+qemuDomainHotplugAddCgroup(virCgroupPtr cgroup,
+ cgroupNewFunc func,
+ int index,
+ char *mem_mask,
+ pid_t pid)
+{
+ virCgroupPtr new_cgroup = NULL;
+ int rv = -1;
+
+ /* Create cgroup */
+ if (func(cgroup, index, true, &new_cgroup) < 0)
+ return NULL;
+
+ if (mem_mask && virCgroupSetCpusetMems(new_cgroup, mem_mask) < 0)
+ goto error;
+
+ /* Add pid/thread to the cgroup */
+ rv = virCgroupAddTask(new_cgroup, pid);
+ if (rv < 0) {
+ virReportSystemError(-rv,
+ _("unable to add id %d task %d to cgroup"),
+ index, pid);
+ virCgroupRemove(new_cgroup);
+ goto error;
+ }
+
+ return new_cgroup;
+
+ error:
+ virCgroupFree(&new_cgroup);
+ return NULL;
+}
+
+static int
+qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ unsigned int nvcpus)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
size_t i;
@@ -4726,25 +4766,12 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
if (nvcpus > oldvcpus) {
for (i = oldvcpus; i < nvcpus; i++) {
if (priv->cgroup) {
- int rv = -1;
- /* Create cgroup for the onlined vcpu */
- if (virCgroupNewVcpu(priv->cgroup, i, true, &cgroup_vcpu) < 0)
+ cgroup_vcpu = qemuDomainHotplugAddCgroup(priv->cgroup,
+ virCgroupNewVcpu,
+ i, mem_mask,
+ cpupids[i]);
+ if (!cgroup_vcpu)
goto cleanup;
-
- if (mem_mask &&
- virCgroupSetCpusetMems(cgroup_vcpu, mem_mask) < 0)
- goto cleanup;
-
- /* Add vcpu thread to the cgroup */
- rv = virCgroupAddTask(cgroup_vcpu, cpupids[i]);
- if (rv < 0) {
- virReportSystemError(-rv,
- _("unable to add vcpu %zu task %d to
cgroup"),
- i, cpupids[i]);
- virCgroupRemove(cgroup_vcpu);
- goto cleanup;
- }
-
}
/* Inherit def->cpuset */
--
2.1.0