* [PATCH] libxc: remove superpages option for pv domains
@ 2015-10-08 15:23 Juergen Gross
2015-10-08 15:36 ` Wei Liu
2015-10-09 15:12 ` Ian Campbell
0 siblings, 2 replies; 6+ messages in thread
From: Juergen Gross @ 2015-10-08 15:23 UTC (permalink / raw)
To: xen-devel, Ian.Campbell, ian.jackson, stefano.stabellini,
wei.liu2
Cc: Juergen Gross
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@suse.com>
---
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 ) {
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] libxc: remove superpages option for pv domains
2015-10-08 15:23 [PATCH] libxc: remove superpages option for pv domains Juergen Gross
@ 2015-10-08 15:36 ` Wei Liu
2015-10-09 15:12 ` Ian Campbell
1 sibling, 0 replies; 6+ messages in thread
From: Wei Liu @ 2015-10-08 15:36 UTC (permalink / raw)
To: Juergen Gross
Cc: wei.liu2, stefano.stabellini, ian.jackson, Ian.Campbell,
xen-devel
On Thu, Oct 08, 2015 at 05:23:47PM +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
"its"
> builder
>
> Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] libxc: remove superpages option for pv domains
2015-10-08 15:23 [PATCH] libxc: remove superpages option for pv domains Juergen Gross
2015-10-08 15:36 ` Wei Liu
@ 2015-10-09 15:12 ` Ian Campbell
2015-10-09 19:08 ` Konrad Rzeszutek Wilk
1 sibling, 1 reply; 6+ messages in thread
From: Ian Campbell @ 2015-10-09 15:12 UTC (permalink / raw)
To: Juergen Gross, xen-devel, ian.jackson, stefano.stabellini,
wei.liu2
Cc: Konrad Rzeszutek Wilk
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@suse.com>
Konrad,
In <20151008011056.GA22076@andromeda.dapyr.net> you indicated you were ok
with this, may we take that as an:
Acked-by: Konrad Rzeszutek Wilk < konrad@darnok.org >
for this change?
(Or maybe even an
Acked-by: Konrad Rzeszutek Wilk < konrad.wilk@oracle.com>
?)
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 ) {
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] libxc: remove superpages option for pv domains
2015-10-09 15:12 ` Ian Campbell
@ 2015-10-09 19:08 ` Konrad Rzeszutek Wilk
2015-10-19 10:39 ` Juergen Gross
0 siblings, 1 reply; 6+ messages in thread
From: Konrad Rzeszutek Wilk @ 2015-10-09 19:08 UTC (permalink / raw)
To: Ian Campbell
Cc: Juergen Gross, wei.liu2, stefano.stabellini, ian.jackson,
xen-devel, Konrad Rzeszutek Wilk
On Fri, Oct 09, 2015 at 04:12:12PM +0100, Ian Campbell wrote:
> 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@suse.com>
>
> Konrad,
>
> In <20151008011056.GA22076@andromeda.dapyr.net> you indicated you were ok
> with this, may we take that as an:
>
> Acked-by: Konrad Rzeszutek Wilk < konrad@darnok.org >
>
> for this change?
>
> (Or maybe even an
> Acked-by: Konrad Rzeszutek Wilk < konrad.wilk@oracle.com>
> ?)
That one.
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>
> 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@lists.xen.org
> http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] libxc: remove superpages option for pv domains
2015-10-09 19:08 ` Konrad Rzeszutek Wilk
@ 2015-10-19 10:39 ` Juergen Gross
2015-10-22 15:56 ` Ian Campbell
0 siblings, 1 reply; 6+ messages in thread
From: Juergen Gross @ 2015-10-19 10:39 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk, Ian Campbell
Cc: ian.jackson, Konrad Rzeszutek Wilk, xen-devel, wei.liu2,
stefano.stabellini
On 10/09/2015 09:08 PM, Konrad Rzeszutek Wilk wrote:
> On Fri, Oct 09, 2015 at 04:12:12PM +0100, Ian Campbell wrote:
>> 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@suse.com>
>>
>> Konrad,
>>
>> In <20151008011056.GA22076@andromeda.dapyr.net> you indicated you were ok
>> with this, may we take that as an:
>>
>> Acked-by: Konrad Rzeszutek Wilk < konrad@darnok.org >
>>
>> for this change?
>>
>> (Or maybe even an
>> Acked-by: Konrad Rzeszutek Wilk < konrad.wilk@oracle.com>
>> ?)
> That one.
>
>
> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Any further comments?
Juergen
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] libxc: remove superpages option for pv domains
2015-10-19 10:39 ` Juergen Gross
@ 2015-10-22 15:56 ` Ian Campbell
0 siblings, 0 replies; 6+ messages in thread
From: Ian Campbell @ 2015-10-22 15:56 UTC (permalink / raw)
To: Juergen Gross, Konrad Rzeszutek Wilk
Cc: ian.jackson, Konrad Rzeszutek Wilk, xen-devel, wei.liu2,
stefano.stabellini
On Mon, 2015-10-19 at 12:39 +0200, Juergen Gross wrote:
> On 10/09/2015 09:08 PM, Konrad Rzeszutek Wilk wrote:
> > On Fri, Oct 09, 2015 at 04:12:12PM +0100, Ian Campbell wrote:
> > > 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@suse.com>
> > >
> > > Konrad,
> > >
> > > In <20151008011056.GA22076@andromeda.dapyr.net> you indicated you
> > > were ok
> > > with this, may we take that as an:
> > >
> > > Acked-by: Konrad Rzeszutek Wilk < konrad@darnok.org >
> > >
> > > for this change?
> > >
> > > (Or maybe even an
> > > Acked-by: Konrad Rzeszutek Wilk < konrad.wilk@oracle.com>
> > > ?)
> > That one.
> >
> >
> > Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>
> Any further comments?
None. Applied, fixing the "it's" which Wei mentioned.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-22 15:56 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-08 15:23 [PATCH] libxc: remove superpages option for pv domains Juergen Gross
2015-10-08 15:36 ` Wei Liu
2015-10-09 15:12 ` Ian Campbell
2015-10-09 19:08 ` Konrad Rzeszutek Wilk
2015-10-19 10:39 ` Juergen Gross
2015-10-22 15:56 ` Ian Campbell
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.