Continue converting to VIR_CGROUP_SUPPORTED --- src/util/vircgroup.c | 378 +++++++++++++++++++++++++++------------------------ 1 file changed, 202 insertions(+), 176 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 3640fbd..795897b 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -74,157 +74,6 @@ typedef enum { */ } virCgroupFlags; -bool virCgroupAvailable(void) -{ - bool ret = false; -#ifdef HAVE_GETMNTENT_R - FILE *mounts = NULL; - struct mntent entry; - char buf[CGROUP_MAX_VAL]; - - if (!virFileExists("/proc/cgroups")) - return false; - - if (!(mounts = fopen("/proc/mounts", "r"))) - return false; - - while (getmntent_r(mounts, &entry, buf, sizeof(buf)) != NULL) { - if (STREQ(entry.mnt_type, "cgroup")) { - ret = true; - break; - } - } - - VIR_FORCE_FCLOSE(mounts); -#endif - return ret; -} - -#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R - -static int virCgroupPartitionEscape(char **path); - -static bool -virCgroupValidateMachineGroup(virCgroupPtr group, - const char *name, - const char *drivername, - const char *partition, - bool stripEmulatorSuffix) -{ - size_t i; - bool valid = false; - char *partname; - char *scopename; - - if (virAsprintf(&partname, "%s.libvirt-%s", - name, drivername) < 0) - goto cleanup; - - if (virCgroupPartitionEscape(&partname) < 0) - goto cleanup; - - if (!partition) - partition = "/machine"; - - if (!(scopename = virSystemdMakeScopeName(name, drivername, partition))) - goto cleanup; - - if (virCgroupPartitionEscape(&scopename) < 0) - goto cleanup; - - for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { - char *tmp; - - if (i == VIR_CGROUP_CONTROLLER_SYSTEMD) - continue; - - if (!group->controllers[i].placement) - continue; - - tmp = strrchr(group->controllers[i].placement, '/'); - if (!tmp) - goto cleanup; - - if (stripEmulatorSuffix && - (i == VIR_CGROUP_CONTROLLER_CPU || - i == VIR_CGROUP_CONTROLLER_CPUACCT || - i == VIR_CGROUP_CONTROLLER_CPUSET)) { - if (STREQ(tmp, "/emulator")) - *tmp = '\0'; - tmp = strrchr(group->controllers[i].placement, '/'); - if (!tmp) - goto cleanup; - } - - tmp++; - - if (STRNEQ(tmp, name) && - STRNEQ(tmp, partname) && - STRNEQ(tmp, scopename)) { - VIR_DEBUG("Name '%s' for controller '%s' does not match '%s', '%s' or '%s'", - tmp, virCgroupControllerTypeToString(i), name, partname, scopename); - goto cleanup; - } - } - - valid = true; - - cleanup: - VIR_FREE(partname); - VIR_FREE(scopename); - return valid; -} -#else -static bool -virCgroupValidateMachineGroup(virCgroupPtr group ATTRIBUTE_UNUSED, - const char *name ATTRIBUTE_UNUSED, - const char *drivername ATTRIBUTE_UNUSED, - bool stripEmulatorSuffix ATTRIBUTE_UNUSED) -{ - return true; -} -#endif - -/** - * virCgroupFree: - * - * @group: The group structure to free - */ -void virCgroupFree(virCgroupPtr *group) -{ - size_t i; - - if (*group == NULL) - return; - - for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { - VIR_FREE((*group)->controllers[i].mountPoint); - VIR_FREE((*group)->controllers[i].linkPoint); - VIR_FREE((*group)->controllers[i].placement); - } - - VIR_FREE((*group)->path); - VIR_FREE(*group); -} - -/** - * virCgroupHasController: query whether a cgroup controller is present - * - * @cgroup: The group structure to be queried, or NULL - * @controller: cgroup subsystem id - * - * Returns true if a cgroup controller is mounted and is associated - * with this cgroup object. - */ -bool virCgroupHasController(virCgroupPtr cgroup, int controller) -{ - if (!cgroup) - return false; - if (controller < 0 || controller >= VIR_CGROUP_CONTROLLER_LAST) - return false; - return cgroup->controllers[controller].mountPoint != NULL; -} - #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R static int virCgroupCopyMounts(virCgroupPtr group, virCgroupPtr parent) @@ -1605,31 +1454,6 @@ int virCgroupNewDetect(pid_t pid ATTRIBUTE_UNUSED, } #endif -/* - * Returns 0 on success (but @group may be NULL), -1 on fatal error - */ -int virCgroupNewDetectMachine(const char *name, - const char *drivername, - pid_t pid, - const char *partition, - int controllers, - virCgroupPtr *group) -{ - if (virCgroupNewDetect(pid, controllers, group) < 0) { - if (virCgroupNewIgnoreError()) - return 0; - return -1; - } - - if (!virCgroupValidateMachineGroup(*group, name, drivername, partition, true)) { - VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'", - name, drivername); - virCgroupFree(group); - return 0; - } - - return 0; -} /* * Returns 0 on success, -1 on fatal error, -2 on systemd not available @@ -2530,6 +2354,173 @@ int virCgroupSetCpuCfsQuota(virCgroupPtr group, long long cfs_quota) #ifdef VIR_CGROUP_SUPPORTED +bool virCgroupAvailable(void) +{ + bool ret = false; + FILE *mounts = NULL; + struct mntent entry; + char buf[CGROUP_MAX_VAL]; + + if (!virFileExists("/proc/cgroups")) + return false; + + if (!(mounts = fopen("/proc/mounts", "r"))) + return false; + + while (getmntent_r(mounts, &entry, buf, sizeof(buf)) != NULL) { + if (STREQ(entry.mnt_type, "cgroup")) { + ret = true; + break; + } + } + + VIR_FORCE_FCLOSE(mounts); + return ret; +} + + +static int virCgroupPartitionEscape(char **path); + +static bool +virCgroupValidateMachineGroup(virCgroupPtr group, + const char *name, + const char *drivername, + const char *partition, + bool stripEmulatorSuffix) +{ + size_t i; + bool valid = false; + char *partname; + char *scopename; + + if (virAsprintf(&partname, "%s.libvirt-%s", + name, drivername) < 0) + goto cleanup; + + if (virCgroupPartitionEscape(&partname) < 0) + goto cleanup; + + if (!partition) + partition = "/machine"; + + if (!(scopename = virSystemdMakeScopeName(name, drivername, partition))) + goto cleanup; + + if (virCgroupPartitionEscape(&scopename) < 0) + goto cleanup; + + for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { + char *tmp; + + if (i == VIR_CGROUP_CONTROLLER_SYSTEMD) + continue; + + if (!group->controllers[i].placement) + continue; + + tmp = strrchr(group->controllers[i].placement, '/'); + if (!tmp) + goto cleanup; + + if (stripEmulatorSuffix && + (i == VIR_CGROUP_CONTROLLER_CPU || + i == VIR_CGROUP_CONTROLLER_CPUACCT || + i == VIR_CGROUP_CONTROLLER_CPUSET)) { + if (STREQ(tmp, "/emulator")) + *tmp = '\0'; + tmp = strrchr(group->controllers[i].placement, '/'); + if (!tmp) + goto cleanup; + } + + tmp++; + + if (STRNEQ(tmp, name) && + STRNEQ(tmp, partname) && + STRNEQ(tmp, scopename)) { + VIR_DEBUG("Name '%s' for controller '%s' does not match '%s', '%s' or '%s'", + tmp, virCgroupControllerTypeToString(i), name, partname, scopename); + goto cleanup; + } + } + + valid = true; + + cleanup: + VIR_FREE(partname); + VIR_FREE(scopename); + return valid; +} + + +/* + * Returns 0 on success (but @group may be NULL), -1 on fatal error + */ +int virCgroupNewDetectMachine(const char *name, + const char *drivername, + pid_t pid, + const char *partition, + int controllers, + virCgroupPtr *group) +{ + if (virCgroupNewDetect(pid, controllers, group) < 0) { + if (virCgroupNewIgnoreError()) + return 0; + return -1; + } + + if (!virCgroupValidateMachineGroup(*group, name, drivername, partition, true)) { + VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'", + name, drivername); + virCgroupFree(group); + return 0; + } + + return 0; +} + + +/** + * virCgroupFree: + * + * @group: The group structure to free + */ +void virCgroupFree(virCgroupPtr *group) +{ + size_t i; + + if (*group == NULL) + return; + + for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) { + VIR_FREE((*group)->controllers[i].mountPoint); + VIR_FREE((*group)->controllers[i].linkPoint); + VIR_FREE((*group)->controllers[i].placement); + } + + VIR_FREE((*group)->path); + VIR_FREE(*group); +} + + +/** + * virCgroupHasController: query whether a cgroup controller is present + * + * @cgroup: The group structure to be queried, or NULL + * @controller: cgroup subsystem id + * + * Returns true if a cgroup controller is mounted and is associated + * with this cgroup object. + */ +bool virCgroupHasController(virCgroupPtr cgroup, int controller) +{ + if (!cgroup) + return false; + if (controller < 0 || controller >= VIR_CGROUP_CONTROLLER_LAST) + return false; + return cgroup->controllers[controller].mountPoint != NULL; +} + int virCgroupRemoveRecursively(char *grppath) { DIR *grpdir; @@ -3016,6 +3007,41 @@ cleanup: return ret; } #else /* VIR_CGROUP_SUPPORTED */ +bool virCgroupAvailable(void) +{ + return false; +} + + +int virCgroupNewDetectMachine(const char *name ATTRIBUTE_UNUSED, + const char *drivername ATTRIBUTE_UNUSED, + pid_t pid ATTRIBUTE_UNUSED, + const char *partition ATTRIBUTE_UNUSED, + int controllers ATTRIBUTE_UNUSED, + virCgroupPtr *group ATTRIBUTE_UNUSED) +{ + virReportSystemError(ENXIO, "%s", + _("Control groups not supported on this platform")); + return -1; +} + + +void virCgroupFree(virCgroupPtr *group ATTRIBUTE_UNUSED) +{ + virReportSystemError(ENXIO, "%s", + _("Control groups not supported on this platform")); +} + + +bool virCgroupHasController(virCgroupPtr cgroup ATTRIBUTE_UNUSED, + int controller ATTRIBUTE_UNUSED) +{ + virReportSystemError(ENXIO, "%s", + _("Control groups not supported on this platform")); + return false; +} + + int virCgroupRemoveRecursively(char *grppath ATTRIBUTE_UNUSED) { virReportSystemError(ENXIO, "%s", -- 1.8.2.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list