From 401030499bfb03b182da14f7e00f4a82beab9a8e Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 24 Jan 2019 17:20:58 +0100 Subject: [PATCH] vircgroup: Try harder to kill cgroup 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 Reviewed-by: Erik Skultety --- src/util/vircgroup.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index de2c925474..34c970f292 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -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;