virCgroupSetMemoryHardLimit;
virCgroupSetMemorySoftLimit;
virCgroupSetMemSwapHardLimit;
+virCgroupSupportsCpuBW;
# util/virclosecallbacks.h
}
-
-/*
- * 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;
}
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"));
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;
}
-/*
- * 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;
}
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"));
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;
}
+/**
+ * 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
return -1;
}
+
+bool
+virCgroupSupportsCpuBW(virCgroupPtr cgroup ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("Control groups not supported on this platform");
+ return false;
+}
+
#endif /* !VIR_CGROUP_SUPPORTED */
const char *oldroot,
const char *mountopts);
+bool virCgroupSupportsCpuBW(virCgroupPtr cgroup);
+
#endif /* __VIR_CGROUP_H__ */