|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 08/24] libxl: introduce libxl__vnuma_config_check
On Fri, Feb 13, 2015 at 03:40:32PM +0000, Andrew Cooper wrote:
[...]
> > + return 0;
> > +}
> > +
> > +/* Check if vNUMA configuration is valid:
> > + * 1. all pnodes inside vnode_to_pnode array are valid
> > + * 2. one vcpu belongs to and only belongs to one vnode
> > + * 3. each vmemrange is valid and doesn't overlap with each other
> > + */
> > +int libxl__vnuma_config_check(libxl__gc *gc,
> > + const libxl_domain_build_info *b_info,
> > + const libxl__domain_build_state *state)
> > +{
> > + int i, j, rc = ERROR_VNUMA_CONFIG_INVALID, nr_nodes;
>
> i, j and nr_nodes are all semantically unsigned.
>
Fixed.
> > + libxl_numainfo *ninfo = NULL;
> > + uint64_t total_memkb = 0;
> > + libxl_bitmap cpumap;
> > + libxl_vnode_info *p;
> > +
> > + libxl_bitmap_init(&cpumap);
> > +
> > + /* Check pnode specified is valid */
> > + ninfo = libxl_get_numainfo(CTX, &nr_nodes);
> > + if (!ninfo) {
> > + LOG(ERROR, "libxl_get_numainfo failed");
> > + goto out;
> > + }
> > +
> > + for (i = 0; i < b_info->num_vnuma_nodes; i++) {
> > + uint32_t pnode;
> > +
> > + p = &b_info->vnuma_nodes[i];
> > + pnode = p->pnode;
> > +
> > + /* The pnode specified is not valid? */
> > + if (pnode >= nr_nodes) {
> > + LOG(ERROR, "Invalid pnode %d specified", pnode);
>
> pnode is uint32_t, so should be %u
>
Fixed.
> > + goto out;
> > + }
> > +
> > + total_memkb += p->memkb;
> > + }
> > +
> > + if (total_memkb != b_info->max_memkb) {
> > + LOG(ERROR, "Amount of memory mismatch (0x%"PRIx64" !=
> > 0x%"PRIx64")",
> > + total_memkb, b_info->max_memkb);
> > + goto out;
> > + }
> > +
> > + /* Check vcpu mapping */
> > + libxl_cpu_bitmap_alloc(CTX, &cpumap, b_info->max_vcpus);
> > + libxl_bitmap_set_none(&cpumap);
>
> Worth using/making libxl_cpu_bitmap_zalloc(), or perhaps making this a
> defined semantic of the alloc() function? This would seem to be a very
> common pair of operations to perform.
>
Actually libxl_bitmap_alloc already uses calloc, so the bitmap is always
set to all zeros.
> > + for (i = 0; i < b_info->num_vnuma_nodes; i++) {
> > + p = &b_info->vnuma_nodes[i];
> > + libxl_for_each_set_bit(j, p->vcpus) {
> > + if (!libxl_bitmap_test(&cpumap, j))
> > + libxl_bitmap_set(&cpumap, j);
> > + else {
> > + LOG(ERROR, "Vcpu %d assigned more than once", j);
> > + goto out;
> > + }
> > + }
>
> This libxl_for_each_set_bit() loop can be optimised to a
> bitmap_intersects() for the error condition, and bitmap_or() for the
> success case.
>
> > + }
> > +
> > + for (i = 0; i < b_info->max_vcpus; i++) {
> > + if (!libxl_bitmap_test(&cpumap, i)) {
> > + LOG(ERROR, "Vcpu %d is not assigned to any vnode", i);
> > + goto out;
> > + }
>
> This loop can be optimised to !bitmap_all_set().
>
I can introduce a new patch set of bitmap operations and switch to that
later. Now this series has grown to almost 30 patches and I would like
to keep this series focus mostly on vNUMA related stuffs.
Wei.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |