[libvirt] [PATCH 04/47] vircgroup: detect available backend for cgroup
Fabiano Fidêncio
fidencio at redhat.com
Thu Sep 20 08:25:18 UTC 2018
On Thu, Sep 20, 2018 at 10:03 AM, Pavel Hrdina <phrdina at redhat.com> wrote:
> On Thu, Sep 20, 2018 at 08:28:57AM +0200, Fabiano Fidêncio wrote:
> > On Tue, Sep 18, 2018 at 5:45 PM, Pavel Hrdina <phrdina at redhat.com>
> wrote:
> >
> > > We need to update one test-case because now new cgroup object will be
> > > created only if there is any cgroup backend available.
> > >
> > > Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> > > ---
> > > src/util/vircgroup.c | 18 ++++++++++++++++++
> > > src/util/vircgrouppriv.h | 3 +++
> > > tests/vircgrouptest.c | 38 +++-----------------------------------
> > > 3 files changed, 24 insertions(+), 35 deletions(-)
> > >
> > > diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> > > index a5478a3fa4..0ffb5db93c 100644
> > > --- a/src/util/vircgroup.c
> > > +++ b/src/util/vircgroup.c
> > > @@ -713,10 +713,28 @@ virCgroupDetect(virCgroupPtr group,
> > > virCgroupPtr parent)
> > > {
> > > int rc;
> > > + size_t i;
> > > + virCgroupBackendPtr *backends = virCgroupBackendGetAll();
> > >
> > > VIR_DEBUG("group=%p controllers=%d path=%s parent=%p",
> > > group, controllers, path, parent);
> > >
> > > + if (!backends)
> > > + return -1;
> > > +
> > > + for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
> > > + if (backends[i] && backends[i]->available()) {
> > > + group->backend = backends[i];
> > > + break;
> > > + }
> > > + }
> > > +
> > > + if (!group->backend) {
> > > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > > + _("no cgroup backend available"));
> > > + return -1;
> > > + }
> > > +
> > > if (parent) {
> > > if (virCgroupCopyMounts(group, parent) < 0)
> > > return -1;
> > > diff --git a/src/util/vircgrouppriv.h b/src/util/vircgrouppriv.h
> > > index 046c96c52c..2caa966fee 100644
> > > --- a/src/util/vircgrouppriv.h
> > > +++ b/src/util/vircgrouppriv.h
> > > @@ -30,6 +30,7 @@
> > > # define __VIR_CGROUP_PRIV_H__
> > >
> > > # include "vircgroup.h"
> > > +# include "vircgroupbackend.h"
> > >
> > > struct _virCgroupController {
> > > int type;
> > > @@ -47,6 +48,8 @@ typedef virCgroupController *virCgroupControllerPtr;
> > > struct _virCgroup {
> > > char *path;
> > >
> > > + virCgroupBackendPtr backend;
> > > +
> > > virCgroupController controllers[VIR_CGROUP_CONTROLLER_LAST];
> > > };
> > >
> > > diff --git a/tests/vircgrouptest.c b/tests/vircgrouptest.c
> > > index bbbe6ffbe5..be3143ea52 100644
> > > --- a/tests/vircgrouptest.c
> > > +++ b/tests/vircgrouptest.c
> > > @@ -114,16 +114,6 @@ const char *mountsAllInOne[VIR_CGROUP_
> CONTROLLER_LAST]
> > > = {
> > > [VIR_CGROUP_CONTROLLER_BLKIO] = "/not/really/sys/fs/cgroup",
> > > [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
> > > };
> > > -const char *mountsLogind[VIR_CGROUP_CONTROLLER_LAST] = {
> > > - [VIR_CGROUP_CONTROLLER_CPU] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/not/really/sys/fs/cgroup/sys
> > > temd",
> > > -};
> > >
> > > const char *links[VIR_CGROUP_CONTROLLER_LAST] = {
> > > [VIR_CGROUP_CONTROLLER_CPU] = "/not/really/sys/fs/cgroup/cpu",
> > > @@ -147,17 +137,6 @@ const char *linksAllInOne[VIR_CGROUP_
> CONTROLLER_LAST]
> > > = {
> > > [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
> > > };
> > >
> > > -const char *linksLogind[VIR_CGROUP_CONTROLLER_LAST] = {
> > > - [VIR_CGROUP_CONTROLLER_CPU] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_SYSTEMD] = NULL,
> > > -};
> > > -
> > >
> > > static int
> > > testCgroupDetectMounts(const void *args)
> > > @@ -541,24 +520,13 @@ static int testCgroupNewForSelfLogind(const void
> > > *args ATTRIBUTE_UNUSED)
> > > {
> > > virCgroupPtr cgroup = NULL;
> > > int ret = -1;
> > > - const char *placement[VIR_CGROUP_CONTROLLER_LAST] = {
> > > - [VIR_CGROUP_CONTROLLER_CPU] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUACCT] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_CPUSET] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_MEMORY] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_DEVICES] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_FREEZER] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_BLKIO] = NULL,
> > > - [VIR_CGROUP_CONTROLLER_SYSTEMD] = "/",
> > > - };
> > >
> > > - if (virCgroupNewSelf(&cgroup) < 0) {
> > > - fprintf(stderr, "Cannot create cgroup for self\n");
> > > + if (virCgroupNewSelf(&cgroup) == 0) {
> > > + fprintf(stderr, "Expected cgroup creation to fail.\n");
> > >
> >
> > Seems that code here would fit quite well in the last patch of the
> previous
> > series in order to avoid the test failure introduced there.
>
> I'm not sure if I follow. This patch introduces a new restriction in
> the code that if no backend is available the creation of new cgroup will
> fail. In the previous series there is no such thing as backend.
>
> I cannot move only the test code into different patch because the test
> suit would start failing.
>
> The only thing I would be able to do is add the virCgroupAvailable()
> check into virCgroupDetect() without any backend code which would
> require the same test code change but still it would be separate patch,
> it would not be simple enough to fit into the last patch of the previous
> series.
>
Aha, I see!
I'll leave it for you to decide what's the best way to handle the failure
in the previous series and just wait for v2.
>
> Pavel
>
> >
> >
> > > goto cleanup;
> > > }
> > >
> > > - ret = validateCgroup(cgroup, "", mountsLogind, linksLogind,
> > > placement);
> > > -
> > > + ret = 0;
> > > cleanup:
> > > virCgroupFree(&cgroup);
> > > return ret;
> > > --
> > > 2.17.1
> > >
> > > --
> > > libvir-list mailing list
> > > libvir-list at redhat.com
> > > https://www.redhat.com/mailman/listinfo/libvir-list
> > >
>
> > --
> > libvir-list mailing list
> > libvir-list at redhat.com
> > https://www.redhat.com/mailman/listinfo/libvir-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180920/b38222b3/attachment-0001.htm>
More information about the libvir-list
mailing list