[libvirt] [PATCH 1/3] util: cgroups do not implicitly add task to new machine cgroup

Henning Schild henning.schild at siemens.com
Wed Dec 9 14:32:54 UTC 2015


On Tue, 8 Dec 2015 12:23:14 -0500
John Ferlan <jferlan at redhat.com> wrote:

> 
> 
> On 11/13/2015 11:56 AM, Henning Schild wrote:
> > virCgroupNewMachine used to add the pidleader to the newly created
> > machine cgroup. Do not do this implicit anymore.
> > 
> > Signed-off-by: Henning Schild <henning.schild at siemens.com>
> > ---
> >  src/lxc/lxc_cgroup.c   |  6 ++++++
> >  src/qemu/qemu_cgroup.c |  6 ++++++
> >  src/util/vircgroup.c   | 22 ----------------------
> >  3 files changed, 12 insertions(+), 22 deletions(-)
> > 
> > diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
> > index ad254e4..e5ac893 100644
> > --- a/src/lxc/lxc_cgroup.c
> > +++ b/src/lxc/lxc_cgroup.c
> > @@ -504,6 +504,12 @@ virCgroupPtr
> > virLXCCgroupCreate(virDomainDefPtr def, &cgroup) < 0)
> >          goto cleanup;
> >  
> > +    if (virCgroupAddTask(cgroup, initpid) < 0) {
> > +        virCgroupRemove(cgroup);
> > +        virCgroupFree(&cgroup);
> > +        goto cleanup;
> > +    }
> > +
> 
> For both this and qemu, the store/restore last error:
> 
>  virErrorPtr saved = virSaveLastError();
> ...
> 
>  if (saved) {
>    virSetError(saved);
>    virFreeError(saved);
>   }
> 
> Is "lost". I realize no other call to virCgroupRemove saves the error,
> but as I found in a different review:

Yes that was lost and i will get it back in. Further discussions on
where it should be are out of the scope of this series.

> http://www.redhat.com/archives/libvir-list/2015-October/msg00823.html
> 
> the call to virCgroupPathOfController from virCgroupRemove could
> overwrite the last error.
> 
> Even though others don't have it, I think perhaps we should ensure it
> still exists here. Or perhaps a patch prior to this one that would
> adjust the virCgroupRemove to "save/restore" the last error around the
> virCgroupPathOfController call...
> 
> 
> >      /* setup control group permissions for user namespace */
> >      if (def->idmap.uidmap) {
> >          if (virCgroupSetOwner(cgroup,
> > diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> > index a8e0b8c..28d2ca2 100644
> > --- a/src/qemu/qemu_cgroup.c
> > +++ b/src/qemu/qemu_cgroup.c
> > @@ -769,6 +769,12 @@ qemuInitCgroup(virQEMUDriverPtr driver,
> >          goto cleanup;
> >      }
> >  
> > +    if (virCgroupAddTask(priv->cgroup, vm->pid) < 0) {
> > +        virCgroupRemove(priv->cgroup);
> > +        virCgroupFree(&priv->cgroup);
> > +        goto cleanup;
> > +    }
> > +
> >   done:
> >      ret = 0;
> >   cleanup:
> > diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> > index 0379c2e..a07f3c2 100644
> > --- a/src/util/vircgroup.c
> > +++ b/src/util/vircgroup.c
> > @@ -1669,16 +1669,6 @@ virCgroupNewMachineSystemd(const char *name,
> >          }
> >      }
> >  
> > -    if (virCgroupAddTask(*group, pidleader) < 0) {
> > -        virErrorPtr saved = virSaveLastError();
> > -        virCgroupRemove(*group);
> > -        virCgroupFree(group);
> > -        if (saved) {
> > -            virSetError(saved);
> > -            virFreeError(saved);
> > -        }
> > -    }
> > -
> >      ret = 0;
> >   cleanup:
> >      virCgroupFree(&parent);
> > @@ -1701,7 +1691,6 @@ int virCgroupTerminateMachine(const char
> > *name, static int
> >  virCgroupNewMachineManual(const char *name,
> >                            const char *drivername,
> > -                          pid_t pidleader,
> >                            const char *partition,
> >                            int controllers,
> >                            virCgroupPtr *group)
> > @@ -1727,16 +1716,6 @@ virCgroupNewMachineManual(const char *name,
> >                                      group) < 0)
> >          goto cleanup;
> >  
> > -    if (virCgroupAddTask(*group, pidleader) < 0) {
> > -        virErrorPtr saved = virSaveLastError();
> > -        virCgroupRemove(*group);
> > -        virCgroupFree(group);
> > -        if (saved) {
> > -            virSetError(saved);
> > -            virFreeError(saved);
> > -        }
> > -    }
> > -
> >   done:
> >      ret = 0;
> >  
> > @@ -1783,7 +1762,6 @@ virCgroupNewMachine(const char *name,
> >  
> >      return virCgroupNewMachineManual(name,
> >                                       drivername,
> > -                                     pidleader,
> >                                       partition,
> >                                       controllers,
> >                                       group);
> > 
> 
> Beyond that - things seem reasonable. I usually defer to Martin or
> Peter for cgroup stuff though...
> 
> Another thought/addition/change would be to have virCgroupNewMachine
> return 'cgroup' rather than have it as the last parameter and then
> check vs. NULL for success/failure rather than 0/-1...
> 
> Weak ACK - hopefully either Peter/Martin can look. I think Peter in
> particular may be interested due to upcoming vCpu changes.
> 
> John




More information about the libvir-list mailing list