---
src/libvirt_private.syms | 4 ++
src/util/cgroup.c | 81 ++++++++++++++++++++++++++++++++++++++++++++--
src/util/cgroup.h | 6 +++
3 files changed, 88 insertions(+), 3 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 30804eb..8b73ec3 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -71,6 +71,8 @@ virCgroupForVcpu;
virCgroupFree;
virCgroupGetBlkioWeight;
virCgroupGetCpuShares;
+virCgroupGetCpuCfsPeriod;
+virCgroupGetCpuCfsQuota;
virCgroupGetCpuacctUsage;
virCgroupGetFreezerState;
virCgroupGetMemoryHardLimit;
@@ -85,6 +87,8 @@ virCgroupPathOfController;
virCgroupRemove;
virCgroupSetBlkioWeight;
virCgroupSetCpuShares;
+virCgroupSetCpuCfsPeriod;
+virCgroupSetCpuCfsQuota;
virCgroupSetFreezerState;
virCgroupSetMemory;
virCgroupSetMemoryHardLimit;
diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index 8994aca..378e08a 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -398,8 +398,6 @@ static int virCgroupSetValueI64(virCgroupPtr group,
return rc;
}
-#if 0
-/* This is included for completeness, but not yet used */
static int virCgroupGetValueI64(virCgroupPtr group,
int controller,
const char *key,
@@ -419,7 +417,6 @@ out:
return rc;
}
-#endif
static int virCgroupGetValueU64(virCgroupPtr group,
int controller,
@@ -1384,6 +1381,84 @@ int virCgroupGetCpuShares(virCgroupPtr group, unsigned long long
*shares)
"cpu.shares", shares);
}
+/**
+ * virCgroupSetCpuCfsPeriod:
+ *
+ * @group: The cgroup to change cpu.cfs_period_us for
+ * @cfs_period: The bandwidth period in usecs
+ *
+ * Returns: 0 on success
+ */
+int virCgroupSetCpuCfsPeriod(virCgroupPtr group, unsigned long long cfs_period)
+{
+ /* The cfs_period shoule be greater or equal than 1ms, and less or equal
+ * than 1s.
+ */
+ if (cfs_period < 1000 || cfs_period > 1000000)
+ return -EINVAL;
+
+ return virCgroupSetValueU64(group,
+ VIR_CGROUP_CONTROLLER_CPU,
+ "cpu.cfs_period_us", cfs_period);
+}
+
+/**
+ * virCgroupGetCpuCfsPeriod:
+ *
+ * @group: The cgroup to get cpu.cfs_period_us for
+ * @cfs_period: Pointer to the returned bandwidth period in usecs
+ *
+ * Returns: 0 on success
+ */
+int virCgroupGetCpuCfsPeriod(virCgroupPtr group, unsigned long long *cfs_period)
+{
+ return virCgroupGetValueU64(group,
+ VIR_CGROUP_CONTROLLER_CPU,
+ "cpu.cfs_period_us", cfs_period);
+}
+
+/**
+ * virCgroupSetCpuCfsQuota:
+ *
+ * @group: The cgroup to change cpu.cfs_quota_us for
+ * @cfs_quota: the cpu bandwidth (in usecs) that this tg will be allowed to
+ * consume over period
+ *
+ * Returns: 0 on success
+ */
+int virCgroupSetCpuCfsQuota(virCgroupPtr group, long long cfs_quota)
+{
+ if (cfs_quota >= 0) {
+ /* The cfs_quota shoule be greater or equal than 1ms */
+ if (cfs_quota < 1000)
+ return -EINVAL;
+
+ /* check overflow */
+ if (cfs_quota > (unsigned long long)~0ULL / 1000)
+ return -EINVAL;
+ }
+
+ return virCgroupSetValueI64(group,
+ VIR_CGROUP_CONTROLLER_CPU,
+ "cpu.cfs_quota_us", cfs_quota);
+}
+
+/**
+ * virCgroupGetCpuCfsQuota:
+ *
+ * @group: The cgroup to get cpu.cfs_quota_us for
+ * @cfs_quota: Pointer to the returned cpu bandwidth (in usecs) that this tg
+ * will be allowed to consume over period
+ *
+ * Returns: 0 on success
+ */
+int virCgroupGetCpuCfsQuota(virCgroupPtr group, long long *cfs_quota)
+{
+ return virCgroupGetValueI64(group,
+ VIR_CGROUP_CONTROLLER_CPU,
+ "cpu.cfs_quota_us", cfs_quota);
+}
+
int virCgroupGetCpuacctUsage(virCgroupPtr group, unsigned long long *usage)
{
return virCgroupGetValueU64(group,
diff --git a/src/util/cgroup.h b/src/util/cgroup.h
index 1d04418..d190bb3 100644
--- a/src/util/cgroup.h
+++ b/src/util/cgroup.h
@@ -104,6 +104,12 @@ int virCgroupDenyDevicePath(virCgroupPtr group,
int virCgroupSetCpuShares(virCgroupPtr group, unsigned long long shares);
int virCgroupGetCpuShares(virCgroupPtr group, unsigned long long *shares);
+int virCgroupSetCpuCfsPeriod(virCgroupPtr group, unsigned long long cfs_period);
+int virCgroupGetCpuCfsPeriod(virCgroupPtr group, unsigned long long *cfs_period);
+
+int virCgroupSetCpuCfsQuota(virCgroupPtr group, long long cfs_quota);
+int virCgroupGetCpuCfsQuota(virCgroupPtr group, long long *cfs_quota);
+
int virCgroupGetCpuacctUsage(virCgroupPtr group, unsigned long long *usage);
int virCgroupSetFreezerState(virCgroupPtr group, const char *state);
--
1.7.1