From: Juergen Gross <jgross@suse.com>
To: xen-devel@lists.xen.org, Ian.Campbell@citrix.com,
ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com,
wei.liu2@citrix.com, roger.pau@citrix.com
Cc: Juergen Gross <jgross@suse.com>
Subject: [PATCH v5 9/9] libxc: create p2m list outside of kernel mapping if supported
Date: Thu, 12 Nov 2015 14:43:36 +0100 [thread overview]
Message-ID: <1447335816-31772-10-git-send-email-jgross@suse.com> (raw)
In-Reply-To: <1447335816-31772-1-git-send-email-jgross@suse.com>
In case the kernel of a new pv-domU indicates it is supporting a p2m
list outside the initial kernel mapping by specifying INIT_P2M, let
the domain builder allocate the memory for the p2m list from physical
guest memory only and map it to the address the kernel is expecting.
This will enable loading pv-domUs larger than 512 GB.
Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
---
tools/libxc/include/xc_dom.h | 1 +
tools/libxc/xc_dom_core.c | 15 +++++++++++-
tools/libxc/xc_dom_x86.c | 56 ++++++++++++++++++++++++++++++++++++++------
3 files changed, 64 insertions(+), 8 deletions(-)
diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
index 7c157c3..ad8e47e 100644
--- a/tools/libxc/include/xc_dom.h
+++ b/tools/libxc/include/xc_dom.h
@@ -238,6 +238,7 @@ struct xc_dom_arch {
char *native_protocol;
int page_shift;
int sizeof_pfn;
+ int p2m_base_supported;
int arch_private_size;
struct xc_dom_arch *next;
diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c
index ad91b35..5d6c3ba 100644
--- a/tools/libxc/xc_dom_core.c
+++ b/tools/libxc/xc_dom_core.c
@@ -777,6 +777,7 @@ struct xc_dom_image *xc_dom_allocate(xc_interface *xch,
dom->parms.virt_hypercall = UNSET_ADDR;
dom->parms.virt_hv_start_low = UNSET_ADDR;
dom->parms.elf_paddr_offset = UNSET_ADDR;
+ dom->parms.p2m_base = UNSET_ADDR;
dom->alloc_malloc += sizeof(*dom);
return dom;
@@ -1096,7 +1097,11 @@ int xc_dom_build_image(struct xc_dom_image *dom)
}
/* allocate other pages */
- if ( dom->arch_hooks->alloc_p2m_list &&
+ if ( !dom->arch_hooks->p2m_base_supported ||
+ dom->parms.p2m_base >= dom->parms.virt_base ||
+ (dom->parms.p2m_base & (XC_DOM_PAGE_SIZE(dom) - 1)) )
+ dom->parms.p2m_base = UNSET_ADDR;
+ if ( dom->arch_hooks->alloc_p2m_list && dom->parms.p2m_base == UNSET_ADDR &&
dom->arch_hooks->alloc_p2m_list(dom) != 0 )
goto err;
if ( dom->arch_hooks->alloc_magic_pages(dom) != 0 )
@@ -1124,6 +1129,14 @@ int xc_dom_build_image(struct xc_dom_image *dom)
dom->initrd_len = page_size * dom->ramdisk_seg.pages;
}
+ /* Allocate p2m list if outside of initial kernel mapping. */
+ if ( dom->arch_hooks->alloc_p2m_list && dom->parms.p2m_base != UNSET_ADDR )
+ {
+ if ( dom->arch_hooks->alloc_p2m_list(dom) != 0 )
+ goto err;
+ dom->p2m_seg.vstart = dom->parms.p2m_base;
+ }
+
return 0;
err:
diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
index 1614354..7279fa2 100644
--- a/tools/libxc/xc_dom_x86.c
+++ b/tools/libxc/xc_dom_x86.c
@@ -69,6 +69,7 @@
#define bits_to_mask(bits) (((xen_vaddr_t)1 << (bits))-1)
#define round_down(addr, mask) ((addr) & ~(mask))
#define round_up(addr, mask) ((addr) | (mask))
+#define round_pg_up(addr) (((addr) + PAGE_SIZE_X86 - 1) & ~(PAGE_SIZE_X86 - 1))
struct xc_dom_params {
unsigned levels;
@@ -90,7 +91,7 @@ struct xc_dom_x86_mapping {
struct xc_dom_image_x86 {
unsigned n_mappings;
-#define MAPPING_MAX 1
+#define MAPPING_MAX 2
struct xc_dom_x86_mapping maps[MAPPING_MAX];
struct xc_dom_params *params;
};
@@ -484,11 +485,8 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom)
/* ------------------------------------------------------------------------ */
-static int alloc_p2m_list(struct xc_dom_image *dom)
+static int alloc_p2m_list(struct xc_dom_image *dom, size_t p2m_alloc_size)
{
- size_t p2m_alloc_size = dom->p2m_size * dom->arch_hooks->sizeof_pfn;
-
- /* allocate phys2mach table */
if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach",
0, p2m_alloc_size) )
return -1;
@@ -499,6 +497,40 @@ static int alloc_p2m_list(struct xc_dom_image *dom)
return 0;
}
+static int alloc_p2m_list_x86_32(struct xc_dom_image *dom)
+{
+ size_t p2m_alloc_size = dom->p2m_size * dom->arch_hooks->sizeof_pfn;
+
+ p2m_alloc_size = round_pg_up(p2m_alloc_size);
+ return alloc_p2m_list(dom, p2m_alloc_size);
+}
+
+static int alloc_p2m_list_x86_64(struct xc_dom_image *dom)
+{
+ struct xc_dom_image_x86 *domx86 = dom->arch_private;
+ struct xc_dom_x86_mapping *map = domx86->maps + domx86->n_mappings;
+ size_t p2m_alloc_size = dom->p2m_size * dom->arch_hooks->sizeof_pfn;
+ xen_vaddr_t from, to;
+ unsigned lvl;
+
+ p2m_alloc_size = round_pg_up(p2m_alloc_size);
+ if ( dom->parms.p2m_base != UNSET_ADDR )
+ {
+ from = dom->parms.p2m_base;
+ to = from + p2m_alloc_size - 1;
+ if ( count_pgtables(dom, from, to, dom->pfn_alloc_end) )
+ return -1;
+
+ map->area.pfn = dom->pfn_alloc_end;
+ for ( lvl = 0; lvl < 4; lvl++ )
+ map->lvls[lvl].pfn += p2m_alloc_size >> PAGE_SHIFT_X86;
+ domx86->n_mappings++;
+ p2m_alloc_size += map->area.pgtables << PAGE_SHIFT_X86;
+ }
+
+ return alloc_p2m_list(dom, p2m_alloc_size);
+}
+
/* ------------------------------------------------------------------------ */
static int alloc_magic_pages(struct xc_dom_image *dom)
@@ -717,6 +749,11 @@ static int start_info_x86_64(struct xc_dom_image *dom)
start_info->pt_base = dom->pgtables_seg.vstart;
start_info->nr_pt_frames = domx86->maps[0].area.pgtables;
start_info->mfn_list = dom->p2m_seg.vstart;
+ if ( dom->parms.p2m_base != UNSET_ADDR )
+ {
+ start_info->first_p2m_pfn = dom->p2m_seg.pfn;
+ start_info->nr_p2m_frames = dom->p2m_seg.pages;
+ }
start_info->flags = dom->flags;
start_info->store_mfn = xc_dom_p2m(dom, dom->xenstore_pfn);
@@ -1601,7 +1638,10 @@ static int bootlate_pv(struct xc_dom_image *dom)
if ( !xc_dom_feature_translated(dom) )
{
/* paravirtualized guest */
+
+ /* Drop references to all initial page tables before pinning. */
xc_dom_unmap_one(dom, dom->pgtables_seg.pfn);
+ xc_dom_unmap_one(dom, dom->p2m_seg.pfn);
rc = pin_table(dom->xch, pgd_type,
xc_dom_p2m(dom, dom->pgtables_seg.pfn),
dom->guest_domid);
@@ -1680,10 +1720,11 @@ static struct xc_dom_arch xc_dom_32_pae = {
.native_protocol = XEN_IO_PROTO_ABI_X86_32,
.page_shift = PAGE_SHIFT_X86,
.sizeof_pfn = 4,
+ .p2m_base_supported = 0,
.arch_private_size = sizeof(struct xc_dom_image_x86),
.alloc_magic_pages = alloc_magic_pages,
.alloc_pgtables = alloc_pgtables_x86_32_pae,
- .alloc_p2m_list = alloc_p2m_list,
+ .alloc_p2m_list = alloc_p2m_list_x86_32,
.setup_pgtables = setup_pgtables_x86_32_pae,
.start_info = start_info_x86_32,
.shared_info = shared_info_x86_32,
@@ -1698,10 +1739,11 @@ static struct xc_dom_arch xc_dom_64 = {
.native_protocol = XEN_IO_PROTO_ABI_X86_64,
.page_shift = PAGE_SHIFT_X86,
.sizeof_pfn = 8,
+ .p2m_base_supported = 1,
.arch_private_size = sizeof(struct xc_dom_image_x86),
.alloc_magic_pages = alloc_magic_pages,
.alloc_pgtables = alloc_pgtables_x86_64,
- .alloc_p2m_list = alloc_p2m_list,
+ .alloc_p2m_list = alloc_p2m_list_x86_64,
.setup_pgtables = setup_pgtables_x86_64,
.start_info = start_info_x86_64,
.shared_info = shared_info_x86_64,
--
2.6.2
prev parent reply other threads:[~2015-11-12 13:43 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-12 13:43 [PATCH v5 0/9] libxc: support building large pv-domains Juergen Gross
2015-11-12 13:43 ` [PATCH v5 1/9] libxc: reorganize domain builder guest memory allocator Juergen Gross
2015-11-12 13:48 ` Wei Liu
2015-11-12 14:03 ` Juergen Gross
2015-11-12 14:47 ` Wei Liu
2015-11-12 14:47 ` Ian Campbell
2015-11-12 14:48 ` Wei Liu
2015-11-12 15:27 ` Juergen Gross
2015-11-12 15:55 ` Wei Liu
2015-11-13 4:41 ` Juergen Gross
2015-11-13 9:28 ` Ian Campbell
2015-11-13 11:13 ` Wei Liu
2015-11-12 13:43 ` [PATCH v5 2/9] xen: add generic flag to elf_dom_parms indicating support of unmapped initrd Juergen Gross
2015-11-12 13:43 ` [PATCH v5 3/9] libxc: rename domain builder count_pgtables to alloc_pgtables Juergen Gross
2015-11-12 13:43 ` [PATCH v5 4/9] libxc: introduce domain builder architecture specific data Juergen Gross
2015-11-12 13:43 ` [PATCH v5 5/9] libxc: use domain builder architecture private data for x86 pv domains Juergen Gross
2015-11-12 13:43 ` [PATCH v5 6/9] libxc: create unmapped initrd in domain builder if supported Juergen Gross
2015-11-25 16:12 ` Boris Ostrovsky
2015-11-25 16:18 ` Wei Liu
2015-11-25 16:24 ` Boris Ostrovsky
2015-11-25 16:29 ` Ian Campbell
2015-11-25 16:31 ` Wei Liu
2015-11-25 16:34 ` Boris Ostrovsky
2015-11-26 5:06 ` Juergen Gross
2015-11-26 5:19 ` Juergen Gross
2015-11-26 7:35 ` Juergen Gross
2015-11-30 10:20 ` Wei Liu
2015-11-30 10:23 ` Juergen Gross
2015-11-30 10:29 ` Wei Liu
2015-11-30 10:34 ` Ian Campbell
2015-11-30 10:47 ` Juergen Gross
2015-11-30 10:51 ` Ian Campbell
2015-11-30 10:52 ` Ian Campbell
2015-11-30 11:03 ` Juergen Gross
2015-11-30 11:23 ` Ian Campbell
2015-11-30 12:20 ` Juergen Gross
2015-11-30 12:35 ` Ian Campbell
2015-11-30 12:59 ` Juergen Gross
2015-11-30 13:16 ` pvgrub "Error 9: Unknown boot failure" booting Debian Jessie kernel (Was: Re: [PATCH v5 6/9] libxc: create unmapped initrd in domain builder if supported) Ian Campbell
2015-11-30 13:41 ` Ian Campbell
2015-11-30 14:10 ` Ian Campbell
2015-11-30 16:15 ` Juergen Gross
2015-11-30 16:25 ` Ian Campbell
2015-11-30 16:56 ` Ian Campbell
2015-12-01 7:15 ` Juergen Gross
2015-12-01 7:41 ` Juergen Gross
2015-12-01 8:30 ` Ian Campbell
2015-12-01 8:53 ` Juergen Gross
2015-12-01 10:01 ` Ian Campbell
2015-12-01 10:04 ` Ian Campbell
2015-12-01 10:21 ` Wei Liu
2015-12-01 10:31 ` Ian Campbell
2015-12-01 10:33 ` Wei Liu
2015-12-01 10:35 ` Ian Campbell
2015-12-01 10:47 ` Juergen Gross
2015-12-01 8:32 ` Ian Campbell
2015-12-01 11:12 ` dom builder logging from pvgrub Ian Campbell
2015-12-01 12:17 ` Samuel Thibault
2015-11-30 10:57 ` [PATCH v5 6/9] libxc: create unmapped initrd in domain builder if supported Juergen Gross
2015-11-30 18:00 ` Boris Ostrovsky
2015-11-12 13:43 ` [PATCH v5 7/9] libxc: split p2m allocation in domain builder from other magic pages Juergen Gross
2015-11-12 13:43 ` [PATCH v5 8/9] libxc: rework of domain builder's page table handler Juergen Gross
2015-11-12 13:47 ` Wei Liu
2015-11-12 13:48 ` Juergen Gross
2015-11-16 13:40 ` Ian Campbell
2015-11-16 14:32 ` Juergen Gross
2015-11-18 16:11 ` Boris Ostrovsky
2015-11-18 16:16 ` Wei Liu
2015-11-18 16:21 ` Boris Ostrovsky
2015-11-19 6:09 ` Juergen Gross
2015-11-19 13:41 ` Boris Ostrovsky
2015-11-12 13:43 ` Juergen Gross [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1447335816-31772-10-git-send-email-jgross@suse.com \
--to=jgross@suse.com \
--cc=Ian.Campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=roger.pau@citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).