]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
vircgroup: Try harder to kill cgroup
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 24 Jan 2019 16:20:58 +0000 (17:20 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 7 Feb 2019 10:16:29 +0000 (11:16 +0100)
Prior to rewrite of cgroup code we only had one backend to try.
After the rewrite the virCgroupBackendGetAll() returns both
backends (for v1 and v2). However, not both have to really be
present on the system which results in killRecursive callback
failing which in turn might mean we won't try the other backend.

At the same time, this function reports no error as it should.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
src/util/vircgroup.c

index de2c925474a911d8c61af389b12dec0c77ec8c3d..34c970f292692054a4ed0f6c0883b85e88afb1b7 100644 (file)
@@ -2607,6 +2607,7 @@ virCgroupKillRecursive(virCgroupPtr group, int signum)
     int ret = 0;
     int rc;
     size_t i;
+    bool backendAvailable = false;
     virCgroupBackendPtr *backends = virCgroupBackendGetAll();
     virHashTablePtr pids = virHashCreateFull(100,
                                              NULL,
@@ -2617,13 +2618,9 @@ virCgroupKillRecursive(virCgroupPtr group, int signum)
 
     VIR_DEBUG("group=%p path=%s signum=%d", group, group->path, signum);
 
-    if (!backends) {
-        ret = -1;
-        goto cleanup;
-    }
-
     for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
-        if (backends[i]) {
+        if (backends && backends[i] && backends[i]->available()) {
+            backendAvailable = true;
             rc = backends[i]->killRecursive(group, signum, pids);
             if (rc < 0) {
                 ret = -1;
@@ -2634,6 +2631,12 @@ virCgroupKillRecursive(virCgroupPtr group, int signum)
         }
     }
 
+    if (!backends || !backendAvailable) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("no cgroup backend available"));
+        goto cleanup;
+    }
+
  cleanup:
     virHashFree(pids);
     return ret;