diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 35f0f1bb83e9f07b590c9b5f78d786f0e9135916..82e3d6fc55c17c0fa652466dddd80c4d3fe14c7b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1217,6 +1217,7 @@ virCgroupSetMemory; virCgroupSetMemoryHardLimit; virCgroupSetMemorySoftLimit; virCgroupSetMemSwapHardLimit; +virCgroupSupportsCpuBW; # util/virclosecallbacks.h diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index b587c222d789b13721db86887994031c53d3b716..87ced9599ee31e4a2c9bd4a648eebab57ce426d7 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1574,45 +1574,10 @@ static char *lxcConnectGetHostname(virConnectPtr conn) } - -/* - * check whether the host supports CFS bandwidth - * - * Return 1 when CFS bandwidth is supported, 0 when CFS bandwidth is not - * supported, -1 on error. - */ -static int lxcGetCpuBWStatus(virCgroupPtr cgroup) -{ - char *cfs_period_path = NULL; - int ret = -1; - - if (!cgroup) - return 0; - - if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU, - "cpu.cfs_period_us", &cfs_period_path) < 0) { - VIR_INFO("cannot get the path of cgroup CPU controller"); - ret = 0; - goto cleanup; - } - - if (access(cfs_period_path, F_OK) < 0) { - ret = 0; - } else { - ret = 1; - } - -cleanup: - VIR_FREE(cfs_period_path); - return ret; -} - - static char *lxcDomainGetSchedulerType(virDomainPtr dom, int *nparams) { char *ret = NULL; - int rc; virDomainObjPtr vm; virLXCDomainObjPrivatePtr priv; @@ -1639,13 +1604,10 @@ static char *lxcDomainGetSchedulerType(virDomainPtr dom, } if (nparams) { - rc = lxcGetCpuBWStatus(priv->cgroup); - if (rc < 0) - goto cleanup; - else if (rc == 0) - *nparams = 1; - else + if (virCgroupSupportsCpuBW(priv->cgroup)) *nparams = 3; + else + *nparams = 1; } ignore_value(VIR_STRDUP(ret, "posix")); @@ -1872,12 +1834,8 @@ lxcDomainGetSchedulerParametersFlags(virDomainPtr dom, if (virDomainGetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; - if (*nparams > 1) { - rc = lxcGetCpuBWStatus(priv->cgroup); - if (rc < 0) - goto cleanup; - cpu_bw_status = !!rc; - } + if (*nparams > 1) + cpu_bw_status = virCgroupSupportsCpuBW(priv->cgroup); if (!(caps = virLXCDriverGetCapabilities(driver, false))) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ae1948f15a837e5bcdc398394487f16ce23ff40f..0caeb0899b1651121a98ce2f8d90b5a92f7f3579 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7325,44 +7325,10 @@ cleanup: } -/* - * check whether the host supports CFS bandwidth - * - * Return 1 when CFS bandwidth is supported, 0 when CFS bandwidth is not - * supported, -1 on error. - */ -static int qemuGetCpuBWStatus(virCgroupPtr cgroup) -{ - char *cfs_period_path = NULL; - int ret = -1; - - if (!cgroup) - return 0; - - if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU, - "cpu.cfs_period_us", &cfs_period_path) < 0) { - VIR_INFO("cannot get the path of cgroup CPU controller"); - ret = 0; - goto cleanup; - } - - if (access(cfs_period_path, F_OK) < 0) { - ret = 0; - } else { - ret = 1; - } - -cleanup: - VIR_FREE(cfs_period_path); - return ret; -} - - static char *qemuDomainGetSchedulerType(virDomainPtr dom, int *nparams) { char *ret = NULL; - int rc; virDomainObjPtr vm = NULL; qemuDomainObjPrivatePtr priv; @@ -7389,13 +7355,10 @@ static char *qemuDomainGetSchedulerType(virDomainPtr dom, } if (nparams) { - rc = qemuGetCpuBWStatus(priv->cgroup); - if (rc < 0) - goto cleanup; - else if (rc == 0) - *nparams = 1; - else + if (virCgroupSupportsCpuBW(priv->cgroup)) *nparams = 5; + else + *nparams = 1; } ignore_value(VIR_STRDUP(ret, "posix")); @@ -8728,12 +8691,8 @@ qemuDomainGetSchedulerParametersFlags(virDomainPtr dom, if (virDomainGetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; - if (*nparams > 1) { - rc = qemuGetCpuBWStatus(priv->cgroup); - if (rc < 0) - goto cleanup; - cpu_bw_status = !!rc; - } + if (*nparams > 1) + cpu_bw_status = virCgroupSupportsCpuBW(priv->cgroup); if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index a615f28fe846cf632085e7920d2cb4f60e5fd5ee..e99caf5c54fe51a554fc2b2b3b40afa73cce62b9 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -3061,6 +3061,36 @@ cleanup: } +/** + * virCgroupSupportsCpuBW(): + * Check whether the host supports CFS bandwidth. + * + * Return true when CFS bandwidth is supported, + * false when CFS bandwidth is not supported. + */ +bool +virCgroupSupportsCpuBW(virCgroupPtr cgroup) +{ + char *path = NULL; + int ret = false; + + if (!cgroup) + return false; + + if (virCgroupPathOfController(cgroup, VIR_CGROUP_CONTROLLER_CPU, + "cpu.cfs_period_us", &path) < 0) { + virResetLastError(); + goto cleanup; + } + + ret = virFileExists(path); + +cleanup: + VIR_FREE(path); + return ret; +} + + #else /* !VIR_CGROUP_SUPPORTED */ bool @@ -3646,4 +3676,12 @@ virCgroupIsolateMount(virCgroupPtr group ATTRIBUTE_UNUSED, return -1; } + +bool +virCgroupSupportsCpuBW(virCgroupPtr cgroup ATTRIBUTE_UNUSED) +{ + VIR_DEBUG("Control groups not supported on this platform"); + return false; +} + #endif /* !VIR_CGROUP_SUPPORTED */ diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 7bb4b2a4504c81c6bd5961686109437462a1bd08..835eb306896eacac5208a111fbc85ec99c112c5f 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -207,4 +207,6 @@ int virCgroupIsolateMount(virCgroupPtr group, const char *oldroot, const char *mountopts); +bool virCgroupSupportsCpuBW(virCgroupPtr cgroup); + #endif /* __VIR_CGROUP_H__ */