virCgroupBindMount(virCgroup *group, const char *oldroot,
const char *mountopts)
{
- ssize_t i;
+ size_t i;
virCgroup *parent = virCgroupGetNested(group);
- /* In hybrid environments, V2 may be mounted over V1.
- * Mount the backends in reverse order. */
- for (i = VIR_CGROUP_BACKEND_TYPE_LAST - 1; i >= 0; i--) {
+ for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
if (parent->backends[i] &&
parent->backends[i]->bindMount(parent, oldroot, mountopts) < 0) {
return -1;
return false;
while (getmntent_r(mounts, &entry, buf, sizeof(buf)) != NULL) {
+ g_autofree char *contFile = NULL;
+ g_autofree char *contStr = NULL;
+
if (STRNEQ(entry.mnt_type, "cgroup2"))
continue;
+ /* Systemd uses cgroup v2 for process tracking but no controller is
+ * available. We should consider this configuration as cgroup v2 is
+ * not available. */
+ contFile = g_strdup_printf("%s/cgroup.controllers", entry.mnt_dir);
+
+ if (virFileReadAll(contFile, 1024 * 1024, &contStr) < 0)
+ goto cleanup;
+
+ if (STREQ(contStr, ""))
+ continue;
+
ret = true;
break;
}
+ cleanup:
VIR_FORCE_FCLOSE(mounts);
return ret;
}