[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] libxc: remove superpages option for pv domains
commit 9b3c6b13e0c085ceb53210f8e682a073096b94fa Author: Juergen Gross <jgross@xxxxxxxx> AuthorDate: Thu Oct 8 17:23:47 2015 +0200 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Thu Oct 22 16:18:12 2015 +0100 libxc: remove superpages option for pv domains 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 its support from the xc bindings and the domain builder Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- tools/libxc/include/xc_dom.h | 1 - tools/libxc/xc_dom_x86.c | 273 ++++++++++++++++--------------------- tools/python/xen/lowlevel/xc/xc.c | 10 +- 3 files changed, 119 insertions(+), 165 deletions(-) diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h index 7cb6b0c..ccc5926 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 4c4182f..ed43c28 100644 --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -1043,181 +1043,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 ) { -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |