The function existed in two identical instances in lxc and qemu. Move it to vircgroup.c and simplify it. Refactor the callers too. --- src/libvirt_private.syms | 1 + src/lxc/lxc_driver.c | 52 +++++------------------------------------------- src/qemu/qemu_driver.c | 51 +++++------------------------------------------ src/util/vircgroup.c | 29 +++++++++++++++++++++++++++ src/util/vircgroup.h | 2 ++ 5 files changed, 42 insertions(+), 93 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 35f0f1b..82e3d6f 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 b587c22..87ced95 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 ae1948f..0caeb08 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 626bbc6..0b4e901 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -3647,3 +3647,32 @@ virCgroupIsolateMount(virCgroupPtr group ATTRIBUTE_UNUSED, } #endif /* !VIR_CGROUP_SUPPORTED */ + +/** + * 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; +} diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 7bb4b2a..835eb30 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__ */ -- 1.8.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list