[libvirt] [PATCH RESEND RFC v4 2/6] cgroup: Implement cpu.cfs_period_us and cpu.cfs_quota_us tuning API

Daniel Veillard veillard at redhat.com
Thu Jul 21 04:06:54 UTC 2011


  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 at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list