[libvirt] [PATCH 2/2] Enable cgroup controllers as much as possible.

Daniel P. Berrange berrange at redhat.com
Fri Mar 4 11:46:37 UTC 2011


On Fri, Mar 04, 2011 at 12:06:26PM +0800, Hu Tao wrote:
> If any cgroup controller is not avaiable, libvirt disables other
> controllers as well although they are avaiable. This patch enables
> cgroup controllers as much as possible.
> 
> the kernel shipped with RHEL6 doesn't support mutli-level directory
> for blkio controller, this causes all other controllers disabled by
> libvirt and virsh memtune, schedinfo doesn't work.
> 
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
>  src/util/cgroup.c |   12 ++++++++++--
>  1 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/src/util/cgroup.c b/src/util/cgroup.c
> index c5b8cdd..30b6dd8 100644
> --- a/src/util/cgroup.c
> +++ b/src/util/cgroup.c
> @@ -507,6 +507,7 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
>  {
>      int i;
>      int rc = 0;
> +    int n = 0;
>  
>      VIR_DEBUG("Make group %s", group->path);
>      for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) {
> @@ -529,7 +530,7 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
>                  mkdir(path, 0755) < 0) {
>                  rc = -errno;
>                  VIR_FREE(path);
> -                break;
> +                continue;

IMHO, we should only 'continue' if it was the blkio controller.
All the others should treat mkdir failure as a fatal problem.
Also if we 'continue' we should not set 'rc = -errno'....

>              }
>              if (group->controllers[VIR_CGROUP_CONTROLLER_CPUSET].mountPoint != NULL &&
>                  (i == VIR_CGROUP_CONTROLLER_CPUSET ||
> @@ -556,9 +557,12 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
>              }
>          }
>  
> +        n++;
>          VIR_FREE(path);
>      }
>  
> +    if (n > 0)
> +        return 0;
>      return rc;

..then this addition is not required.

>  }
>  
> @@ -743,6 +747,7 @@ int virCgroupRemove(virCgroupPtr group)
>  int virCgroupAddTask(virCgroupPtr group, pid_t pid)
>  {
>      int rc = 0;
> +    int n = 0;
>      int i;
>  
>      for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) {
> @@ -752,9 +757,12 @@ int virCgroupAddTask(virCgroupPtr group, pid_t pid)
>  
>          rc = virCgroupSetValueU64(group, i, "tasks", (unsigned long long)pid);
>          if (rc != 0)
> -            break;
> +            continue;
> +        n++;
>      }
>  
> +    if (n > 0)
> +        return 0;
>      return rc;
>  }

Again, only do this for the 'blkio' controller and set 'rc'
back to 0 if we are ignoring the error.


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list