|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 03/19] libxc: allocate memory with vNUMA information for PV guest
On Tue, Jan 13, 2015 at 08:02:17PM +0000, Andrew Cooper wrote:
[...]
> > + /* vNUMA information */
> > + unsigned int *vnode_to_pnode; /* vnode to pnode mapping array */
> > + uint64_t *vnode_size; /* vnode size array */
>
> Please make it very clear in the comment here that "size" is in MB (at
> least I presume so, given the shifts by 20). There are currently no
> specified units.
>
The size will be in pages.
> > + unsigned int nr_vnodes; /* number of elements of above arrays */
> > +
> > /* kernel loader */
> > struct xc_dom_arch *arch_hooks;
> > /* allocate up to virt_alloc_end */
> > diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> > index bf06fe4..06a7e54 100644
> > --- a/tools/libxc/xc_dom_x86.c
> > +++ b/tools/libxc/xc_dom_x86.c
> > @@ -759,7 +759,8 @@ static int x86_shadow(xc_interface *xch, domid_t domid)
> > int arch_setup_meminit(struct xc_dom_image *dom)
> > {
> > int rc;
> > - xen_pfn_t pfn, allocsz, i, j, mfn;
> > + xen_pfn_t pfn, allocsz, mfn, total, pfn_base;
> > + int i, j;
> >
> > rc = x86_compat(dom->xch, dom->guest_domid, dom->guest_type);
> > if ( rc )
> > @@ -811,18 +812,74 @@ int arch_setup_meminit(struct xc_dom_image *dom)
> > /* setup initial p2m */
> > for ( pfn = 0; pfn < dom->total_pages; pfn++ )
> > dom->p2m_host[pfn] = pfn;
> > -
> > +
> > + /* Setup dummy vNUMA information if it's not provided. Not
> > + * that this is a valid state if libxl doesn't provide any
> > + * vNUMA information.
> > + *
> > + * In this case we setup some dummy value for the convenience
> > + * of the allocation code. Note that from the user's PoV the
> > + * guest still has no vNUMA configuration.
> > + */
> > + if ( dom->nr_vnodes == 0 )
> > + {
> > + dom->nr_vnodes = 1;
> > + dom->vnode_to_pnode = xc_dom_malloc(dom,
> > +
> > sizeof(*dom->vnode_to_pnode));
> > + dom->vnode_to_pnode[0] = XC_VNUMA_NO_NODE;
> > + dom->vnode_size = xc_dom_malloc(dom, sizeof(*dom->vnode_size));
> > + dom->vnode_size[0] = (dom->total_pages << PAGE_SHIFT) >> 20;
> > + }
> > +
> > + total = 0;
> > + for ( i = 0; i < dom->nr_vnodes; i++ )
> > + total += ((dom->vnode_size[i] << 20) >> PAGE_SHIFT);
>
> Can I suggest a "mb_to_pages()" helper rather than opencoding this in
> several locations.
>
Sure. If I end up needing one I will add that helper.
> > + if ( total != dom->total_pages )
> > + {
> > + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> > + "%s: vNUMA page count mismatch (0x%"PRIpfn" !=
> > 0x%"PRIpfn")\n",
> > + __FUNCTION__, total, dom->total_pages);
>
> __func__ please. It is part of C99 unlike __FUNCTION__ which is a gnuism.
>
> andrewcoop:xen.git$ git grep __FUNCTION__ | wc -l
> 230
> andrewcoop:xen.git$ git grep __func__ | wc -l
> 194
>
> Looks like the codebase is very mixed, but best to err on the side of
> the standard.
>
No problem.
> > + return -EINVAL;
> > + }
> > +
> > /* allocate guest memory */
> > - for ( i = rc = allocsz = 0;
> > - (i < dom->total_pages) && !rc;
> > - i += allocsz )
> > + pfn_base = 0;
> > + for ( i = 0; i < dom->nr_vnodes; i++ )
> > {
> > - allocsz = dom->total_pages - i;
> > - if ( allocsz > 1024*1024 )
> > - allocsz = 1024*1024;
> > - rc = xc_domain_populate_physmap_exact(
> > - dom->xch, dom->guest_domid, allocsz,
> > - 0, 0, &dom->p2m_host[i]);
> > + unsigned int memflags;
> > + uint64_t pages;
> > +
> > + memflags = 0;
> > + if ( dom->vnode_to_pnode[i] != XC_VNUMA_NO_NODE )
> > + {
> > + memflags |= XENMEMF_exact_node(dom->vnode_to_pnode[i]);
> > + memflags |= XENMEMF_exact_node_request;
> > + }
> > +
> > + pages = (dom->vnode_size[i] << 20) >> PAGE_SHIFT;
> > +
> > + for ( j = 0; j < pages; j += allocsz )
> > + {
> > + allocsz = pages - j;
> > + if ( allocsz > 1024*1024 )
> > + allocsz = 1024*1024;
> > +
> > + rc = xc_domain_populate_physmap_exact(dom->xch,
> > + dom->guest_domid, allocsz, 0, memflags,
> > + &dom->p2m_host[pfn_base+j]);
> > +
> > + if ( rc )
> > + {
> > + if ( dom->vnode_to_pnode[i] != XC_VNUMA_NO_NODE )
> > + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> > + "%s: fail to allocate
> > 0x%"PRIx64"/0x%"PRIpfn" pages (v=%d, p=%d)\n",
> > + __FUNCTION__, pages,
> > dom->total_pages, i,
> > + dom->vnode_to_pnode[i]);
>
> "failed to allocate"
>
Fixed.
> I am not sure the total number of pages is useful here, especially as
> you don't know how many pages have successfully been allocated first.
>
Are you suggesting we don't print any number of print more numbers?
> Finally, please also print an error for the non-vnuma case. Failing to
> populate memory is not something which should go without an error message.
>
Sure.
Wei.
> ~Andrew
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |