[libvirt] [PATCH 1/2] numatune: add check for memnode.nodeset range

Chen, Fan chen.fan.fnst at cn.fujitsu.com
Wed Sep 24 02:04:36 UTC 2014


On Tue, 2014-09-23 at 14:41 +0200, Michal Privoznik wrote: 
> On 23.09.2014 11:34, Chen Fan wrote:
> > For memnode in numatune element, the range of attribute 'nodeset'
> > was not validated. on my host maxnodes was 1, but when setting nodeset
> > to '0-2' or more, guest also started succuss. there probably was qemu's
> > bug too.
> >
> > Signed-off-by: Chen Fan <chen.fan.fnst at cn.fujitsu.com>
> > ---
> >   src/conf/numatune_conf.c | 29 +++++++++++++++++++++++++++++
> >   src/conf/numatune_conf.h |  4 ++++
> >   2 files changed, 33 insertions(+)
> >
> > diff --git a/src/conf/numatune_conf.c b/src/conf/numatune_conf.c
> > index 21d9a64..a9b20aa 100644
> > --- a/src/conf/numatune_conf.c
> > +++ b/src/conf/numatune_conf.c
> > @@ -183,6 +183,9 @@ virDomainNumatuneNodeParseXML(virDomainNumatunePtr *numatunePtr,
> >                              VIR_DOMAIN_CPUMASK_LEN) < 0)
> >               goto cleanup;
> >           VIR_FREE(tmp);
> > +
> > +        if (!virDomainNumatuneNodeSetIsAvailable(numatune, cellid))
> > +            goto cleanup;
> 
> Well, if there already exists such configuration within an existing 
> domain, this will cause a failure on XML parsing when the daemon is 
> starting and hence domain is lost.
Right, I would move this check to VM start routine.


> 
> >       }
> >
> >       ret = 0;
> > @@ -612,3 +615,29 @@ virDomainNumatuneHasPerNodeBinding(virDomainNumatunePtr numatune)
> >
> >       return false;
> >   }
> > +
> > +bool
> > +virDomainNumatuneNodeSetIsAvailable(virDomainNumatunePtr numatune,
> > +                                    int cellid)
> > +{
> > +    int maxnode;
> > +    int bit = -1;
> > +    virBitmapPtr nodemask = NULL;
> > +
> > +    nodemask = virDomainNumatuneGetNodeset(numatune, NULL, cellid);
> > +    if (!nodemask)
> > +        return false;
> > +
> > +    if ((maxnode = virNumaGetMaxNode()) < 0)
> > +        return false;
> 
> This will work in real environment, but won't work in tests. You need to 
> mock this to get predictable max numa node.
I will add test case for this.


Thanks,
Chen 
> 
> > +
> > +    while ((bit = virBitmapNextSetBit(nodemask, bit)) >= 0) {
> > +        if (bit > maxnode) {
> > +            virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                           _("NUMA node %d is out of range"), bit);
> > +            return false;
> > +        }
> > +    }
> > +
> > +    return true;
> > +}
> > diff --git a/src/conf/numatune_conf.h b/src/conf/numatune_conf.h
> > index 5254629..cab0b83 100644
> > --- a/src/conf/numatune_conf.h
> > +++ b/src/conf/numatune_conf.h
> > @@ -102,4 +102,8 @@ bool virDomainNumatuneHasPlacementAuto(virDomainNumatunePtr numatune);
> >
> >   bool virDomainNumatuneHasPerNodeBinding(virDomainNumatunePtr numatune);
> >
> > +extern int virNumaGetMaxNode(void);
> > +bool virDomainNumatuneNodeSetIsAvailable(virDomainNumatunePtr numatune,
> > +                                         int cellid);
> > +
> >   #endif /* __NUMATUNE_CONF_H__ */
> >
> 
> Michal





More information about the libvir-list mailing list