[libvirt] [PATCH 3/7] qemu: qemuDomainHotplugVcpus - separate out the add cgroup

John Ferlan jferlan at redhat.com
Thu Mar 19 17:08:24 UTC 2015


Impending 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 at 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 6d9217b..b7ddca3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4630,9 +4630,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;
@@ -4721,25 +4761,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




More information about the libvir-list mailing list