On Thu, 26 Oct 2017 17:40:37 -0600
Jim Fehlig <jfeh...@suse.com> wrote:

> On 10/12/2017 01:31 PM, Wim Ten Have wrote:
> > From: Wim ten Have <wim.ten.h...@oracle.com>
> > 
> > This patch generates a NUMA distance-aware libxl description from the
> > information extracted from a NUMA distance-aware libvirt XML file.
        ...
> > +        /* pnode */
> > +        p->pnode = simulate ? 0 : i;  
> 
> So any time the number of vnuma nodes exceeds the number of physical nodes, 
> all 
> vnuma nodes are confined to physical node 0?

  Yes.
>                                              Does xl behave this way too?

  Yes.

> > +
> > +        /* 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;
> > +
> > +        for (j = 0; j < num_vnuma; j++)
> > +            p->distances[j] = virDomainNumaGetNodeDistance(numa, i, j);
> > +    }
> > +
> > +    b_info->vnuma_nodes = vnuma_nodes;
> > +    b_info->num_vnuma_nodes = num_vnuma;
> > +
> > +    ret = 0;
> > +
> > + cleanup:
> > +    if (ret) {
> > +        for (i = 0; i < num_vnuma; i++) {
> > +            libxl_vnode_info *p = &vnuma_nodes[i];
> > +
> > +            VIR_FREE(p->distances);
> > +        }
> > +        VIR_FREE(vnuma_nodes);
> > +    }
> > +
> > +    return ret;
> > +}
> > +#endif
> > +
> >   static int
> >   libxlDiskSetDiscard(libxl_device_disk *x_disk, int discard)
> >   {
> > @@ -2209,6 +2325,11 @@ libxlBuildDomainConfig(virPortAllocatorPtr 
> > graphicsports,
> >       if (libxlMakeDomBuildInfo(def, ctx, caps, d_config) < 0)
> >           return -1;
> >   
> > +#ifdef LIBXL_HAVE_VNUMA
> > +    if (libxlMakeVnumaList(def, ctx, d_config) < 0)
> > +        return -1;
> > +#endif
> > +
> >       if (libxlMakeDiskList(def, d_config) < 0)
> >           return -1;
> >   
> > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> > index 8483d6ecf..656f4a82d 100644
> > --- a/src/libxl/libxl_driver.c
> > +++ b/src/libxl/libxl_driver.c
> > @@ -2788,7 +2788,8 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const 
> > char *xml, unsigned int flag
> >       virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
> >   
> >       if (flags & VIR_DOMAIN_DEFINE_VALIDATE)
> > -        parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA;
> > +        parse_flags |= (VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA |
> > +                        VIR_DOMAIN_DEF_PARSE_ABI_UPDATE);  
> 
> Why is this change needed? In its current form, the patch doesn't touch any 
> code 
> in the domain def post parse callback.

  I remove this.  I added this to forcibly recompute memory size in case 
total_memory
  held a value not matching the numa cells setting. (!= 0)
  See virDomainDefPostParseMemory()
  
    /* Attempt to infer the initial memory size from the sum NUMA memory sizes
     * in case ABI updates are allowed or the <memory> element wasn't specified 
*/
    if (def->mem.total_memory == 0 ||
        parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE ||
        parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION)
        numaMemory = virDomainNumaGetMemorySize(def->numa);

  Will address all other brought comments under v6.

Regards,
- Wim.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to