[libvirt] [RFC PATCH v1 6/7] deploy the newly introduced virCgroupItem.

Hu Tao hutao at cn.fujitsu.com
Thu Jan 17 04:02:52 UTC 2013


On Wed, Jan 16, 2013 at 10:10:50AM +0000, Daniel P. Berrange wrote:
> On Wed, Jan 16, 2013 at 10:53:08AM +0800, Hu Tao wrote:
> > diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> > index 7cb99b1..92e3292 100644
> > --- a/daemon/libvirtd.c
> > +++ b/daemon/libvirtd.c
> > @@ -1442,6 +1442,9 @@ int main(int argc, char **argv) {
> >          VIR_FORCE_CLOSE(statuswrite);
> >      }
> >  
> > +    if (virCgroupInit() < 0)
> > +        goto cleanup;
> > +
> 
> I don't like this addition. Our aim has been to *remove* the need
> to global initializers like this, not add new ones. AFAICT the
> reason you needed to add this is because you removed code from
> the individual drivers which would initialize the cgroups they
> required.

I think I can eliminate this init/uninit thing.

> 
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index 2ac338c..23ff2c9 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -48,6 +48,7 @@
> >  # include "device_conf.h"
> >  # include "virbitmap.h"
> >  # include "virstoragefile.h"
> > +# include "vircgroup.h"
> >  
> >  /* forward declarations of all device types, required by
> >   * virDomainDeviceDef
> > @@ -1843,6 +1844,10 @@ struct _virDomainDef {
> >  
> >      /* Application-specific custom metadata */
> >      xmlNodePtr metadata;
> > +
> > +    virCgroupItemPtr cgroup[VIR_CGROUP_CONTROLLER_LAST];
> > +    virCgroupItemPtr (*vcpuCgroups)[VIR_CGROUP_CONTROLLER_LAST];
> > +    virCgroupItemPtr emulatorCgroup[VIR_CGROUP_CONTROLLER_LAST];
> >  };
> 
> Two things here. First, this is driver state and so should *not* be
> in the virDomainDef struct - it should be in the driver specific
> private data structs.

Agreed.

> 
> Second, the new cgroups API you've got here is really bad. It was
> an explicit design decision in the original API to *not* expose
> the concept of individual cgroup controllers to the driver APIs.
> The only time the drivers should can about individual controllers
> is when they first create the cgroup and decide which controllers
> they want to use. From then onwards the virCgroupPtr APIs should
> just 'do the right thing'.

The explanation is helpful. Fortunately I think the new virCgroup
can leave the original API unchanged(let me try in v2).

What are important in the new virCgroup are:

  - the lazy creation of cgroup directories, despite of what level
    they are.
  - cgroup directories are removed if no one is using the corresponding
    virCgroup.

Do you think it's worth doing it? If yes, can you review patch 5 about
the new implementation? (forget about the API change)

> 
> >      }
> >  
> > +    cgroup = vm->def->cgroup[VIR_CGROUP_CONTROLLER_DEVICES];
> > +
> >      if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_DEVICES)) {
> >          qemuCgroupData data = { vm, cgroup };
> >          rc = virCgroupDenyAllDevices(cgroup);
> > @@ -300,6 +301,8 @@ int qemuSetupCgroup(virQEMUDriverPtr driver,
> >          }
> >      }
> >  
> > +    cgroup = vm->def->cgroup[VIR_CGROUP_CONTROLLER_BLKIO];
> > +
> >      if (vm->def->blkio.weight != 0) {
> >          if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_BLKIO)) {
> >              rc = virCgroupSetBlkioWeight(cgroup, vm->def->blkio.weight);
> > @@ -339,6 +342,8 @@ int qemuSetupCgroup(virQEMUDriverPtr driver,
> >          }
> >      }
> >  
> > +    cgroup = vm->def->cgroup[VIR_CGROUP_CONTROLLER_MEMORY];
> > +
> >      if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_MEMORY)) {
> >          unsigned long long hard_limit = vm->def->mem.hard_limit;
> >  
> > @@ -392,6 +397,8 @@ int qemuSetupCgroup(virQEMUDriverPtr driver,
> >          VIR_WARN("Could not autoset a RSS limit for domain %s", vm->def->name);
> >      }
> >  
> > +    cgroup = vm->def->cgroup[VIR_CGROUP_CONTROLLER_CPU];
> > +
> >      if (vm->def->cputune.shares != 0) {
> >          if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
> >              rc = virCgroupSetCpuShares(cgroup, vm->def->cputune.shares);
> > @@ -407,6 +414,8 @@ int qemuSetupCgroup(virQEMUDriverPtr driver,
> >          }
> >      }
> >  
> > +    cgroup = vm->def->cgroup[VIR_CGROUP_CONTROLLER_CPUSET];
> > +
> >      if ((vm->def->numatune.memory.nodemask ||
> >           (vm->def->numatune.memory.placement_mode ==
> >            VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO)) &&
> 
> These 4 additions are a perfect example of what this new API design is
> awful. The drivers now have to remember which controller they need to
> use for which tunable.

If the original API is kept, these will be the form of:

cgroup = vm->cgroup;

...

doSomethingWithCgroup(cgroup)

...

Is this acceptable?

> 
> I'm not going to review any more because this change is fatally flawed
> from a design POV.
> 
> Regards,
> 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