[libvirt] [RFC PATCH v2 2/4] libxl: vnuma support
Daniel P. Berrange
berrange at redhat.com
Wed Jun 28 14:22:22 UTC 2017
On Wed, Jun 28, 2017 at 03:56:37PM +0200, Wim Ten Have wrote:
> From: Wim ten Have <wim.ten.have at oracle.com>
>
> 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 at oracle.com>
> ---
> 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 :|
More information about the libvir-list
mailing list