[libvirt] [PATCH 02/53] vircgroup: introduce virCgroupV2Available

Pavel Hrdina phrdina at redhat.com
Wed Oct 3 17:04:08 UTC 2018


On Wed, Oct 03, 2018 at 04:49:35PM +0200, Michal Privoznik wrote:
> On 10/02/2018 10:43 AM, Pavel Hrdina wrote:
> > We cannot detect only mount points to figure out whether cgroup v2
> > is available because systemd uses cgroup v2 for process tracking and
> > all controllers are mounted as cgroup v1 controllers.
> > 
> > To make sure that this is no the situation we need to check
> > 'cgroup.controllers' file if it's not empty to make sure that cgroup
> > v2 is not mounted only for process tracking.
> > 
> > Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> > ---
> >  src/util/vircgroupv2.c | 52 ++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 52 insertions(+)
> > 
> > diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
> > index 23bf81dae2..78497bd31d 100644
> > --- a/src/util/vircgroupv2.c
> > +++ b/src/util/vircgroupv2.c
> > @@ -19,6 +19,10 @@
> >   */
> >  #include <config.h>
> >  
> > +#ifdef __linux__
> > +# include <mntent.h>
> > +#endif /* __linux__ */
> > +
> >  #include "internal.h"
> >  
> >  #define __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
> > @@ -28,7 +32,9 @@
> >  #include "vircgroup.h"
> >  #include "vircgroupbackend.h"
> >  #include "vircgroupv2.h"
> > +#include "virfile.h"
> >  #include "virlog.h"
> > +#include "virstring.h"
> >  
> >  VIR_LOG_INIT("util.cgroup");
> >  
> > @@ -41,8 +47,54 @@ VIR_ENUM_IMPL(virCgroupV2Controller, VIR_CGROUP_CONTROLLER_LAST,
> >  
> >  #ifdef __linux__
> >  
> > +/* We're looking for one 'cgroup2' fs mount which has some
> > + * controllers enabled. */
> > +static bool
> > +virCgroupV2Available(void)
> > +{
> > +    bool ret = false;
> > +    FILE *mounts = NULL;
> > +    struct mntent entry;
> > +    char buf[CGROUP_MAX_VAL];
> > +
> > +    if (!(mounts = fopen("/proc/mounts", "r")))
> > +        return false;
> > +
> > +    while (getmntent_r(mounts, &entry, buf, sizeof(buf)) != NULL) {
> > +        if (STREQ(entry.mnt_type, "cgroup2")) {
> > +            ret = true;
> > +            break;
> > +        }
> > +    }
> > +
> > +    /* Systemd uses cgroup v2 for process tracking but no controller is
> > +     * available. We should consider this configuration as cgroup v2 is
> > +     * not available. */
> > +    if (ret) {
> > +        int rc;
> > +        VIR_AUTOFREE(char *) contFile = NULL;
> > +        VIR_AUTOFREE(char *) contStr = NULL;
> > +
> > +        if (virAsprintf(&contFile, "%s/cgroup.controllers", entry.mnt_dir) < 0)
> > +            return false;
> > +
> > +        rc = virFileReadAll(contFile, 1024 * 1024, &contStr);
> > +        if (rc < 0)
> > +            return false;
> > +
> > +        if (STREQ(contStr, ""))
> > +            return false;
> > +    }
> > +
> > +    VIR_FORCE_FCLOSE(mounts);
> > +    return ret;
> 
> This is wrong on two levels. Firstly, if any of those conditions under
> 'if (ret)' fail, then @mounts is leaked. Secondly, @ret is set but then
> it's ignored and false is returned regardless.

/me hides under table

Right, I totally missed that with all the rebases and code movement.
I'll fix that.

Thanks

Pavel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20181003/c6c07fb9/attachment-0001.sig>


More information about the libvir-list mailing list