[libvirt] [PATCH 04/10] remove dependence on libnuma

Hu Tao hutao at cn.fujitsu.com
Fri Nov 4 06:37:40 UTC 2011


On Thu, Nov 03, 2011 at 12:13:27PM +0000, Daniel P. Berrange wrote:
> On Thu, Nov 03, 2011 at 07:55:19PM +0800, Hu Tao wrote:
> > Since we use cpuset to manage numa, we can safely remove dependence
> > on libnuma.
> > ---
> >  src/conf/domain_conf.c  |   24 +----------
> >  src/conf/domain_conf.h  |    1 -
> >  src/qemu/qemu_process.c |  111 -----------------------------------------------
> >  3 files changed, 1 insertions(+), 135 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 6e2d421..0cf3bb7 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -583,11 +583,6 @@ VIR_ENUM_IMPL(virDomainTimerMode, VIR_DOMAIN_TIMER_MODE_LAST,
> >                "paravirt",
> >                "smpsafe");
> >  
> > -VIR_ENUM_IMPL(virDomainNumatuneMemMode, VIR_DOMAIN_NUMATUNE_MEM_LAST,
> > -              "strict",
> > -              "preferred",
> > -              "interleave");
> > -
> >  VIR_ENUM_IMPL(virDomainStartupPolicy, VIR_DOMAIN_STARTUP_POLICY_LAST,
> >                "default",
> >                "mandatory",
> > @@ -6834,20 +6829,6 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> >                                  "%s", _("nodeset for NUMA memory tuning must be set"));
> >              goto error;
> >          }
> > -
> > -        tmp = virXPathString("string(./numatune/memory/@mode)", ctxt);
> > -        if (tmp) {
> > -            if ((def->numatune.memory.mode =
> > -                virDomainNumatuneMemModeTypeFromString(tmp)) < 0) {
> > -                virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> > -                                    _("Unsupported NUMA memory tuning mode '%s'"),
> > -                                    tmp);
> > -                goto error;
> > -            }
> > -            VIR_FREE(tmp);
> > -        } else {
> > -            def->numatune.memory.mode = VIR_DOMAIN_NUMATUNE_MEM_STRICT;
> > -        }
> >      }
> >  
> >      n = virXPathNodeSet("./features/*", ctxt, &nodes);
> > @@ -10882,7 +10863,6 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> >          virBufferAddLit(buf, "  </cputune>\n");
> >  
> >      if (def->numatune.memory.nodemask) {
> > -        const char *mode;
> >          char *nodemask = NULL;
> >  
> >          virBufferAddLit(buf, "  <numatune>\n");
> > @@ -10894,9 +10874,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> >              goto cleanup;
> >          }
> >  
> > -        mode = virDomainNumatuneMemModeTypeToString(def->numatune.memory.mode);
> > -        virBufferAsprintf(buf, "    <memory mode='%s' nodeset='%s'/>\n",
> > -                          mode, nodemask);
> > +        virBufferAsprintf(buf, "    <memory nodeset='%s'/>\n", nodemask);
> >          VIR_FREE(nodemask);
> >          virBufferAddLit(buf, "  </numatune>\n");
> >      }
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index f74f4bb..ca68437 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -1353,7 +1353,6 @@ typedef virDomainNumatuneDef *virDomainNumatuneDefPtr;
> >  struct _virDomainNumatuneDef {
> >      struct {
> >          char *nodemask;
> > -        int mode;
> >      } memory;
> >  
> >      /* Future NUMA tuning related stuff should go here. */
> 
> You can't remove this stuff from the XML - this is part of our public
> stability guarentee. The way it is modelled is not specific to libnuma
> anyway, so there shouldn't be this tie.
> 
> 
> > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> > index 47164f7..5969b34 100644
> > --- a/src/qemu/qemu_process.c
> > +++ b/src/qemu/qemu_process.c
> > @@ -39,11 +39,6 @@
> >  #include "qemu_bridge_filter.h"
> >  #include "qemu_migration.h"
> >  
> > -#if HAVE_NUMACTL
> > -# define NUMA_VERSION1_COMPATIBILITY 1
> > -# include <numa.h>
> > -#endif
> > -
> >  #include "datatypes.h"
> >  #include "logging.h"
> >  #include "virterror_internal.h"
> > @@ -1314,109 +1309,6 @@ qemuProcessDetectVcpuPIDs(struct qemud_driver *driver,
> >      return 0;
> >  }
> >  
> > -
> > -/*
> > - * Set NUMA memory policy for qemu process, to be run between
> > - * fork/exec of QEMU only.
> > - */
> > -#if HAVE_NUMACTL
> > -static int
> > -qemuProcessInitNumaMemoryPolicy(virDomainObjPtr vm)
> > -{
> > -    nodemask_t mask;
> > -    int mode = -1;
> > -    int node = -1;
> > -    int ret = -1;
> > -    int i = 0;
> > -    int maxnode = 0;
> > -    bool warned = false;
> > -
> > -    if (!vm->def->numatune.memory.nodemask)
> > -        return 0;
> > -
> > -    VIR_DEBUG("Setting NUMA memory policy");
> > -
> > -    if (numa_available() < 0) {
> > -        qemuReportError(VIR_ERR_INTERNAL_ERROR,
> > -                        "%s", _("Host kernel is not aware of NUMA."));
> > -        return -1;
> > -    }
> > -
> > -    maxnode = numa_max_node() + 1;
> > -
> > -    /* Convert nodemask to NUMA bitmask. */
> > -    nodemask_zero(&mask);
> > -    for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
> > -        if (vm->def->numatune.memory.nodemask[i]) {
> > -            if (i > NUMA_NUM_NODES) {
> > -                qemuReportError(VIR_ERR_INTERNAL_ERROR,
> > -                                _("Host cannot support NUMA node %d"), i);
> > -                return -1;
> > -            }
> > -            if (i > maxnode && !warned) {
> > -                VIR_WARN("nodeset is out of range, there is only %d NUMA "
> > -                         "nodes on host", maxnode);
> > -                warned = true;
> > -             }
> > -            nodemask_set(&mask, i);
> > -        }
> > -    }
> > -
> > -    mode = vm->def->numatune.memory.mode;
> > -
> > -    if (mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
> > -        numa_set_bind_policy(1);
> > -        numa_set_membind(&mask);
> > -        numa_set_bind_policy(0);
> > -    } else if (mode == VIR_DOMAIN_NUMATUNE_MEM_PREFERRED) {
> > -        int nnodes = 0;
> > -        for (i = 0; i < NUMA_NUM_NODES; i++) {
> > -            if (nodemask_isset(&mask, i)) {
> > -                node = i;
> > -                nnodes++;
> > -            }
> > -        }
> > -
> > -        if (nnodes != 1) {
> > -            qemuReportError(VIR_ERR_INTERNAL_ERROR,
> > -                            "%s", _("NUMA memory tuning in 'preferred' mode "
> > -                                    "only supports single node"));
> > -            goto cleanup;
> > -        }
> > -
> > -        numa_set_bind_policy(0);
> > -        numa_set_preferred(node);
> > -    } else if (mode == VIR_DOMAIN_NUMATUNE_MEM_INTERLEAVE) {
> > -        numa_set_interleave_mask(&mask);
> > -    } else {
> > -        /* XXX: Shouldn't go here, as we already do checking when
> > -         * parsing domain XML.
> > -         */
> > -        qemuReportError(VIR_ERR_XML_ERROR,
> > -                        "%s", _("Invalid mode for memory NUMA tuning."));
> > -        goto cleanup;
> > -    }
> > -
> > -    ret = 0;
> > -
> > -cleanup:
> > -    return ret;
> > -}
> > -#else
> > -static int
> > -qemuProcessInitNumaMemoryPolicy(virDomainObjPtr vm)
> > -{
> > -    if (vm->def->numatune.memory.nodemask) {
> > -        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > -                        _("libvirt is compiled without NUMA tuning support"));
> > -
> > -        return -1;
> > -    }
> > -
> > -    return 0;
> > -}
> > -#endif
> > -
> >  /*
> >   * To be run between fork/exec of QEMU only
> >   */
> > @@ -2179,9 +2071,6 @@ static int qemuProcessHook(void *data)
> >      if (qemuProcessInitCpuAffinity(h->vm) < 0)
> >          goto cleanup;
> >  
> > -    if (qemuProcessInitNumaMemoryPolicy(h->vm) < 0)
> > -        return -1;
> > -
> >      VIR_DEBUG("Setting up security labelling");
> >      if (virSecurityManagerSetProcessLabel(h->driver->securityManager, h->vm) < 0)
> >          goto cleanup;
> 
> NACK to this removal of libnuma. The libvirt QEMU driver still supports
> deployment on RHEL5 vintage hosts where there is no cgroups mechanism
> at all.
> 
> I'm all for using the cpuset controller *if* it is available. We must
> fallback to libnuma if it is not present though, to prevent functional
> regressions for existing users of libvirt

I will add the fallback code in v2. Thanks for comment.

-- 
Thanks,
Hu Tao




More information about the libvir-list mailing list