Plase add a small comment before commit On Thu, Jul 21, 2011 at 10:08:47AM +0800, Wen Congyang wrote: > --- > 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); Okay, the check for overflow could probably be done with some kind of MAX_INT but for ULL , but that sounds right too, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list