On Wed, Jun 28, 2017 at 03:56:37PM +0200, Wim Ten Have wrote: > From: Wim ten Have <wim.ten.have@xxxxxxxxxx> > > This patch generates a NUMA distance-aware libxl description from the > information extracted from a NUMA distance-aware libvirt XML file. > > By default, if no NUMA node distance information is supplied in the > libvirt XML file, this patch uses the distances 10 for local and 21 for > remote nodes/sockets." > > Signed-off-by: Wim ten Have <wim.ten.have@xxxxxxxxxx> > --- > src/libxl/libxl_conf.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 124 insertions(+) > > diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c > index 938e09d..7d22229 100644 > --- a/src/libxl/libxl_conf.c > +++ b/src/libxl/libxl_conf.c > @@ -617,6 +617,125 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, > return 0; > } > > +#ifdef LIBXL_HAVE_VNUMA > +static int > +libxlMakeVnumaList(virDomainDefPtr def, > + libxl_ctx *ctx, > + libxl_domain_config *d_config) > +{ > + int ret = -1; > + size_t i, j; > + size_t nr_nodes; > + size_t num_vnuma; > + virBitmapPtr bitmap = NULL; > + virDomainNumaPtr numa = def->numa; > + libxl_domain_build_info *b_info = &d_config->b_info; > + libxl_physinfo physinfo; > + libxl_vnode_info *vnuma_nodes = NULL; > + > + if (!numa) > + return 0; > + > + num_vnuma = virDomainNumaGetNodeCount(numa); > + if (!num_vnuma) > + return 0; > + > + libxl_physinfo_init(&physinfo); > + if (libxl_get_physinfo(ctx, &physinfo) < 0) { > + libxl_physinfo_dispose(&physinfo); > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("libxl_get_physinfo_info failed")); > + return -1; > + } > + nr_nodes = physinfo.nr_nodes; > + libxl_physinfo_dispose(&physinfo); > + > + if (num_vnuma > nr_nodes) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + _("Number of configured numa cells %zu exceeds the physical available nodes %zu"), > + num_vnuma, nr_nodes); > + return -1; > + } > + > + /* > + * allocate the vnuma_nodes for assignment under b_info. > + */ > + if (VIR_ALLOC_N(vnuma_nodes, num_vnuma) < 0) > + return -1; > + > + /* > + * parse the vnuma vnodes data. > + */ > + for (i = 0; i < num_vnuma; i++) { > + int cpu; > + libxl_bitmap vcpu_bitmap; > + libxl_vnode_info *p = &vnuma_nodes[i]; > + > + libxl_vnode_info_init(p); > + > + /* pnode */ > + p->pnode = i; > + > + /* memory size */ > + p->memkb = virDomainNumaGetNodeMemorySize(numa, i); > + > + /* vcpus */ > + bitmap = virDomainNumaGetNodeCpumask(numa, i); > + if (bitmap == NULL) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("vnuma sibling %zu missing vcpus set"), i); > + goto cleanup; > + } > + > + if ((cpu = virBitmapNextSetBit(bitmap, -1)) < 0) > + goto cleanup; > + > + libxl_bitmap_init(&vcpu_bitmap); > + if (libxl_cpu_bitmap_alloc(ctx, &vcpu_bitmap, b_info->max_vcpus)) { > + virReportOOMError(); > + goto cleanup; > + } > + > + do { > + libxl_bitmap_set(&vcpu_bitmap, cpu); > + } while ((cpu = virBitmapNextSetBit(bitmap, cpu)) >= 0); > + > + libxl_bitmap_copy_alloc(ctx, &p->vcpus, &vcpu_bitmap); > + libxl_bitmap_dispose(&vcpu_bitmap); > + > + /* vdistances */ > + if (VIR_ALLOC_N(p->distances, num_vnuma) < 0) > + goto cleanup; > + p->num_distances = num_vnuma; > + > + /* > + * Apply the configured distance value. If not > + * available set 10 for local or 21 for remote nodes. > + */ > + for (j = 0; j < num_vnuma; j++) > + if (!(p->distances[j] = virDomainNumaGetNodeDistance(numa, i, j))) > + p->distances[j] = (i == j) ? 10 : 21; These defaults should be applied in virDomainNumaGetNodeDistance itself, also dealing with symmetry > + } Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list