|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxc: remove superpages option for pv domains
On Thu, 2015-10-08 at 17:23 +0200, Juergen Gross wrote:
> The pv domain builder currently supports the additional flag
> "superpages" to build a pv domain with 2MB pages. This feature isn't
> being used by any component other than the python xc bindings.
>
> Remove the flag and it's support from the xc bindings and the domain
> builder
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Konrad,
In <20151008011056.GA22076@xxxxxxxxxxxxxxxxxxx> you indicated you were ok
with this, may we take that as an:
Acked-by: Konrad Rzeszutek Wilk < konrad@xxxxxxxxxx >
for this change?
(Or maybe even an
Acked-by: Konrad Rzeszutek Wilk < konrad.wilk@xxxxxxxxxx>
?)
Thanks,
Ian.
> ---
> tools/libxc/include/xc_dom.h | 1 -
> tools/libxc/xc_dom_x86.c | 271 ++++++++++++++++----------------
> ------
> tools/python/xen/lowlevel/xc/xc.c | 10 +-
> 3 files changed, 118 insertions(+), 164 deletions(-)
>
> diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
> index e52b023..ae2b985 100644
> --- a/tools/libxc/include/xc_dom.h
> +++ b/tools/libxc/include/xc_dom.h
> @@ -157,7 +157,6 @@ struct xc_dom_image {
>
> xc_interface *xch;
> domid_t guest_domid;
> - int8_t superpages;
> int claim_enabled; /* 0 by default, 1 enables it */
> int shadow_enabled;
>
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index dd331bf..9d11dd3 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -1005,181 +1005,140 @@ static int meminit_pv(struct xc_dom_image *dom)
> return rc;
> }
>
> - if ( dom->superpages )
> + /* try to claim pages for early warning of insufficient memory avail
> */
> + if ( dom->claim_enabled )
> {
> - int count = dom->total_pages >> SUPERPAGE_2MB_SHIFT;
> - xen_pfn_t extents[count];
> -
> - dom->p2m_size = dom->total_pages;
> - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) *
> - dom->p2m_size);
> - if ( dom->p2m_host == NULL )
> - return -EINVAL;
> -
> - DOMPRINTF("Populating memory with %d superpages", count);
> - for ( pfn = 0; pfn < count; pfn++ )
> - extents[pfn] = pfn << SUPERPAGE_2MB_SHIFT;
> - rc = xc_domain_populate_physmap_exact(dom->xch, dom
> ->guest_domid,
> - count,
> SUPERPAGE_2MB_SHIFT, 0,
> - extents);
> + rc = xc_domain_claim_pages(dom->xch, dom->guest_domid,
> + dom->total_pages);
> if ( rc )
> return rc;
> + }
>
> - /* Expand the returned mfn into the p2m array */
> - pfn = 0;
> - for ( i = 0; i < count; i++ )
> - {
> - mfn = extents[i];
> - for ( j = 0; j < SUPERPAGE_2MB_NR_PFNS; j++, pfn++ )
> - dom->p2m_host[pfn] = mfn + j;
> - }
> + /* Setup dummy vNUMA information if it's not provided. Note
> + * that this is a valid state if libxl doesn't provide any
> + * vNUMA information.
> + *
> + * The dummy values make libxc allocate all pages from
> + * arbitrary physical nodes. This is the expected behaviour if
> + * no vNUMA configuration is provided to libxc.
> + *
> + * Note that the following hunk is just for the convenience of
> + * allocation code. No defaulting happens in libxc.
> + */
> + if ( dom->nr_vmemranges == 0 )
> + {
> + nr_vmemranges = 1;
> + vmemranges = dummy_vmemrange;
> + vmemranges[0].start = 0;
> + vmemranges[0].end = (uint64_t)dom->total_pages << PAGE_SHIFT;
> + vmemranges[0].flags = 0;
> + vmemranges[0].nid = 0;
> +
> + nr_vnodes = 1;
> + vnode_to_pnode = dummy_vnode_to_pnode;
> + vnode_to_pnode[0] = XC_NUMA_NO_NODE;
> }
> else
> {
> - /* try to claim pages for early warning of insufficient memory
> avail */
> - if ( dom->claim_enabled ) {
> - rc = xc_domain_claim_pages(dom->xch, dom->guest_domid,
> - dom->total_pages);
> - if ( rc )
> - return rc;
> - }
> + nr_vmemranges = dom->nr_vmemranges;
> + nr_vnodes = dom->nr_vnodes;
> + vmemranges = dom->vmemranges;
> + vnode_to_pnode = dom->vnode_to_pnode;
> + }
>
> - /* Setup dummy vNUMA information if it's not provided. Note
> - * that this is a valid state if libxl doesn't provide any
> - * vNUMA information.
> - *
> - * The dummy values make libxc allocate all pages from
> - * arbitrary physical nodes. This is the expected behaviour if
> - * no vNUMA configuration is provided to libxc.
> - *
> - * Note that the following hunk is just for the convenience of
> - * allocation code. No defaulting happens in libxc.
> - */
> - if ( dom->nr_vmemranges == 0 )
> - {
> - nr_vmemranges = 1;
> - vmemranges = dummy_vmemrange;
> - vmemranges[0].start = 0;
> - vmemranges[0].end = (uint64_t)dom->total_pages <<
> PAGE_SHIFT;
> - vmemranges[0].flags = 0;
> - vmemranges[0].nid = 0;
> -
> - nr_vnodes = 1;
> - vnode_to_pnode = dummy_vnode_to_pnode;
> - vnode_to_pnode[0] = XC_NUMA_NO_NODE;
> - }
> - else
> - {
> - nr_vmemranges = dom->nr_vmemranges;
> - nr_vnodes = dom->nr_vnodes;
> - vmemranges = dom->vmemranges;
> - vnode_to_pnode = dom->vnode_to_pnode;
> - }
> + total = dom->p2m_size = 0;
> + for ( i = 0; i < nr_vmemranges; i++ )
> + {
> + total += ((vmemranges[i].end - vmemranges[i].start) >>
> PAGE_SHIFT);
> + dom->p2m_size = max(dom->p2m_size,
> + (xen_pfn_t)(vmemranges[i].end >>
> PAGE_SHIFT));
> + }
> + if ( total != dom->total_pages )
> + {
> + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> + "%s: vNUMA page count mismatch (0x%"PRIpfn" !=
> 0x%"PRIpfn")",
> + __func__, total, dom->total_pages);
> + return -EINVAL;
> + }
>
> - total = dom->p2m_size = 0;
> - for ( i = 0; i < nr_vmemranges; i++ )
> - {
> - total += ((vmemranges[i].end - vmemranges[i].start)
> - >> PAGE_SHIFT);
> - dom->p2m_size =
> - dom->p2m_size > (vmemranges[i].end >> PAGE_SHIFT) ?
> - dom->p2m_size : (vmemranges[i].end >> PAGE_SHIFT);
> - }
> - if ( total != dom->total_pages )
> - {
> - xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> - "%s: vNUMA page count mismatch (0x%"PRIpfn" !=
> 0x%"PRIpfn")",
> - __func__, total, dom->total_pages);
> - return -EINVAL;
> - }
> + dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom
> ->p2m_size);
> + if ( dom->p2m_host == NULL )
> + return -EINVAL;
> + for ( pfn = 0; pfn < dom->p2m_size; pfn++ )
> + dom->p2m_host[pfn] = INVALID_P2M_ENTRY;
>
> - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) *
> - dom->p2m_size);
> - if ( dom->p2m_host == NULL )
> - return -EINVAL;
> - for ( pfn = 0; pfn < dom->p2m_size; pfn++ )
> - dom->p2m_host[pfn] = INVALID_P2M_ENTRY;
> + /* allocate guest memory */
> + for ( i = 0; i < nr_vmemranges; i++ )
> + {
> + unsigned int memflags;
> + uint64_t pages, super_pages;
> + unsigned int pnode = vnode_to_pnode[vmemranges[i].nid];
> + xen_pfn_t extents[SUPERPAGE_BATCH_SIZE];
> + xen_pfn_t pfn_base_idx;
>
> - /* allocate guest memory */
> - for ( i = 0; i < nr_vmemranges; i++ )
> - {
> - unsigned int memflags;
> - uint64_t pages, super_pages;
> - unsigned int pnode = vnode_to_pnode[vmemranges[i].nid];
> - xen_pfn_t extents[SUPERPAGE_BATCH_SIZE];
> - xen_pfn_t pfn_base_idx;
> -
> - memflags = 0;
> - if ( pnode != XC_NUMA_NO_NODE )
> - memflags |= XENMEMF_exact_node(pnode);
> -
> - pages = (vmemranges[i].end - vmemranges[i].start)
> - >> PAGE_SHIFT;
> - super_pages = pages >> SUPERPAGE_2MB_SHIFT;
> - pfn_base = vmemranges[i].start >> PAGE_SHIFT;
> -
> - for ( pfn = pfn_base; pfn < pfn_base+pages; pfn++ )
> - dom->p2m_host[pfn] = pfn;
> -
> - pfn_base_idx = pfn_base;
> - while (super_pages) {
> - uint64_t count =
> - min_t(uint64_t, super_pages,SUPERPAGE_BATCH_SIZE);
> - super_pages -= count;
> -
> - for ( pfn = pfn_base_idx, j = 0;
> - pfn < pfn_base_idx + (count <<
> SUPERPAGE_2MB_SHIFT);
> - pfn += SUPERPAGE_2MB_NR_PFNS, j++ )
> - extents[j] = dom->p2m_host[pfn];
> - rc = xc_domain_populate_physmap(dom->xch, dom
> ->guest_domid, count,
> - SUPERPAGE_2MB_SHIFT,
> memflags,
> - extents);
> - if ( rc < 0 )
> - return rc;
> -
> - /* Expand the returned mfns into the p2m array. */
> - pfn = pfn_base_idx;
> - for ( j = 0; j < rc; j++ )
> - {
> - mfn = extents[j];
> - for ( k = 0; k < SUPERPAGE_2MB_NR_PFNS; k++, pfn++ )
> - dom->p2m_host[pfn] = mfn + k;
> - }
> - pfn_base_idx = pfn;
> - }
> + memflags = 0;
> + if ( pnode != XC_NUMA_NO_NODE )
> + memflags |= XENMEMF_exact_node(pnode);
>
> - for ( j = pfn_base_idx - pfn_base; j < pages; j += allocsz )
> - {
> - allocsz = pages - j;
> - if ( allocsz > 1024*1024 )
> - allocsz = 1024*1024;
> + pages = (vmemranges[i].end - vmemranges[i].start) >> PAGE_SHIFT;
> + super_pages = pages >> SUPERPAGE_2MB_SHIFT;
> + pfn_base = vmemranges[i].start >> PAGE_SHIFT;
>
> - rc = xc_domain_populate_physmap_exact(dom->xch,
> - dom->guest_domid, allocsz, 0, memflags,
> - &dom->p2m_host[pfn_base+j]);
> + for ( pfn = pfn_base; pfn < pfn_base+pages; pfn++ )
> + dom->p2m_host[pfn] = pfn;
>
> - if ( rc )
> - {
> - if ( pnode != XC_NUMA_NO_NODE )
> - xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> - "%s: failed to allocate 0x%"PRIx64"
> pages (v=%d, p=%d)",
> - __func__, pages, i, pnode);
> - else
> - xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> - "%s: failed to allocate 0x%"PRIx64"
> pages",
> - __func__, pages);
> - return rc;
> - }
> + pfn_base_idx = pfn_base;
> + while ( super_pages ) {
> + uint64_t count = min_t(uint64_t, super_pages,
> SUPERPAGE_BATCH_SIZE);
> + super_pages -= count;
> +
> + for ( pfn = pfn_base_idx, j = 0;
> + pfn < pfn_base_idx + (count << SUPERPAGE_2MB_SHIFT);
> + pfn += SUPERPAGE_2MB_NR_PFNS, j++ )
> + extents[j] = dom->p2m_host[pfn];
> + rc = xc_domain_populate_physmap(dom->xch, dom->guest_domid,
> count,
> + SUPERPAGE_2MB_SHIFT,
> memflags,
> + extents);
> + if ( rc < 0 )
> + return rc;
> +
> + /* Expand the returned mfns into the p2m array. */
> + pfn = pfn_base_idx;
> + for ( j = 0; j < rc; j++ )
> + {
> + mfn = extents[j];
> + for ( k = 0; k < SUPERPAGE_2MB_NR_PFNS; k++, pfn++ )
> + dom->p2m_host[pfn] = mfn + k;
> }
> - rc = 0;
> + pfn_base_idx = pfn;
> }
>
> - /* Ensure no unclaimed pages are left unused.
> - * OK to call if hadn't done the earlier claim call. */
> - (void)xc_domain_claim_pages(dom->xch, dom->guest_domid,
> - 0 /* cancels the claim */);
> + for ( j = pfn_base_idx - pfn_base; j < pages; j += allocsz )
> + {
> + allocsz = min_t(uint64_t, 1024 * 1024, pages - j);
> + rc = xc_domain_populate_physmap_exact(dom->xch, dom
> ->guest_domid,
> + allocsz, 0, memflags, &dom->p2m_host[pfn_base +
> j]);
> +
> + if ( rc )
> + {
> + if ( pnode != XC_NUMA_NO_NODE )
> + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> + "%s: failed to allocate 0x%"PRIx64"
> pages (v=%d, p=%d)",
> + __func__, pages, i, pnode);
> + else
> + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> + "%s: failed to allocate 0x%"PRIx64"
> pages",
> + __func__, pages);
> + return rc;
> + }
> + }
> + rc = 0;
> }
>
> + /* Ensure no unclaimed pages are left unused.
> + * OK to call if hadn't done the earlier claim call. */
> + xc_domain_claim_pages(dom->xch, dom->guest_domid, 0 /* cancel claim
> */);
> +
> return rc;
> }
>
> diff --git a/tools/python/xen/lowlevel/xc/xc.c
> b/tools/python/xen/lowlevel/xc/xc.c
> index b441777..26290a3 100644
> --- a/tools/python/xen/lowlevel/xc/xc.c
> +++ b/tools/python/xen/lowlevel/xc/xc.c
> @@ -463,7 +463,6 @@ static PyObject *pyxc_linux_build(XcObject *self,
> char *image, *ramdisk = NULL, *cmdline = "", *features = NULL;
> int flags = 0;
> int store_evtchn, console_evtchn;
> - int superpages = 0;
> unsigned int mem_mb;
> unsigned long store_mfn = 0;
> unsigned long console_mfn = 0;
> @@ -476,22 +475,19 @@ static PyObject *pyxc_linux_build(XcObject *self,
> "console_evtchn", "image",
> /* optional */
> "ramdisk", "cmdline", "flags",
> - "features", "superpages", NULL };
> + "features", NULL };
>
> - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssisi",
> kwd_list,
> + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssis",
> kwd_list,
> &domid, &store_evtchn, &mem_mb,
> &console_evtchn, &image,
> /* optional */
> - &ramdisk, &cmdline, &flags,
> - &features, &superpages) )
> + &ramdisk, &cmdline, &flags,
> &features) )
> return NULL;
>
> xc_dom_loginit(self->xc_handle);
> if (!(dom = xc_dom_allocate(self->xc_handle, cmdline, features)))
> return pyxc_error_to_exception(self->xc_handle);
>
> - dom->superpages = superpages;
> -
> if ( xc_dom_linux_build(self->xc_handle, dom, domid, mem_mb, image,
> ramdisk, flags, store_evtchn, &store_mfn,
> console_evtchn, &console_mfn) != 0 ) {
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |