From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xen.org
Cc: tim@xen.org, stefano.stabellini@citrix.com,
Ian Campbell <ian.campbell@citrix.com>
Subject: [PATCH 03/10] arm: avoid allocating the heaps over modules or xen itself.
Date: Fri, 18 Jan 2013 16:40:29 +0000 [thread overview]
Message-ID: <1358527236-2486-3-git-send-email-ian.campbell@citrix.com> (raw)
In-Reply-To: <1358526135.3279.103.camel@zakaz.uk.xensource.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
---
xen/arch/arm/setup.c | 89 +++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 78 insertions(+), 11 deletions(-)
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 9b5d4ed..e6cefeb 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -73,7 +73,8 @@ static void __init processor_id(void)
* with required size and alignment that does not conflict with the
* modules from first_mod to nr_modules.
*
- * For non-recursive callers first_mod should normally be 1.
+ * For non-recursive callers first_mod should normally be 0 (all
+ * modules and Xen itself) or 1 (all modules but not Xen).
*/
static paddr_t __init consider_modules(paddr_t s, paddr_t e,
uint32_t size, paddr_t align,
@@ -106,6 +107,34 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
return e;
}
+/*
+ * Return the end of the non-module region starting at s. In other
+ * words return s the start of the next modules after s.
+ *
+ * Also returns the end of that module in *n.
+ */
+static paddr_t __init next_module(paddr_t s, paddr_t *n)
+{
+ struct dt_module_info *mi = &early_info.modules;
+ paddr_t lowest = ~(paddr_t)0;
+ int i;
+
+ for ( i = 0; i <= mi->nr_mods; i++ )
+ {
+ paddr_t mod_s = mi->module[i].start;
+ paddr_t mod_e = mod_s + mi->module[i].size;
+
+ if ( mod_s < s )
+ continue;
+ if ( mod_s > lowest )
+ continue;
+ lowest = mod_s;
+ *n = mod_e;
+ }
+ return lowest;
+}
+
+
/**
* get_xen_paddr - get physical address to relocate Xen to
*
@@ -159,6 +188,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
paddr_t ram_start;
paddr_t ram_end;
paddr_t ram_size;
+ paddr_t s, e;
unsigned long ram_pages;
unsigned long heap_pages, xenheap_pages, domheap_pages;
unsigned long dtb_pages;
@@ -176,22 +206,37 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
ram_pages = ram_size >> PAGE_SHIFT;
/*
- * Calculate the sizes for the heaps using these constraints:
+ * Locate the xenheap using these constraints:
*
- * - heaps must be 32 MiB aligned
- * - must not include Xen itself
- * - xen heap must be at most 1 GiB
+ * - must be 32 MiB aligned
+ * - must not include Xen itself or the boot modules
+ * - must be at most 1 GiB
+ * - must be at least 128M
*
- * XXX: needs a platform with at least 1GiB of RAM or the dom
- * heap will be empty and no domains can be created.
+ * We try to allocate the largest xenheap possible within these
+ * constraints.
*/
- heap_pages = (ram_size >> PAGE_SHIFT) - (32 << (20 - PAGE_SHIFT));
+ heap_pages = (ram_size >> PAGE_SHIFT);
xenheap_pages = min(1ul << (30 - PAGE_SHIFT), heap_pages);
+
+ do
+ {
+ e = consider_modules(ram_start, ram_end, xenheap_pages<<PAGE_SHIFT,
+ 32<<20, 0);
+ if ( e )
+ break;
+
+ xenheap_pages >>= 1;
+ } while ( xenheap_pages > 128<<(20-PAGE_SHIFT) );
+
+ if ( ! e )
+ panic("Not not enough space for xenheap\n");
+
domheap_pages = heap_pages - xenheap_pages;
printk("Xen heap: %lu pages Dom heap: %lu pages\n", xenheap_pages, domheap_pages);
- setup_xenheap_mappings(ram_start >> PAGE_SHIFT, xenheap_pages);
+ setup_xenheap_mappings((e >> PAGE_SHIFT) - xenheap_pages, xenheap_pages);
/*
* Need a single mapped page for populating bootmem_region_list
@@ -215,8 +260,30 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
copy_from_paddr(device_tree_flattened, dtb_paddr, dtb_size, BUFFERABLE);
/* Add non-xenheap memory */
- init_boot_pages(pfn_to_paddr(xenheap_mfn_start + xenheap_pages),
- pfn_to_paddr(xenheap_mfn_start + xenheap_pages + domheap_pages));
+ s = ram_start;
+ while ( s < ram_end )
+ {
+ paddr_t n = ram_end;
+
+ e = next_module(s, &n);
+
+ if ( e == ~(paddr_t)0 )
+ {
+ e = n = ram_end;
+ }
+
+ /* Avoid the xenheap */
+ if ( s < ((xenheap_mfn_start+xenheap_pages) << PAGE_SHIFT)
+ && (xenheap_mfn_start << PAGE_SHIFT) < e )
+ {
+ e = pfn_to_paddr(xenheap_mfn_start);
+ n = pfn_to_paddr(xenheap_mfn_start+xenheap_pages);
+ }
+
+ init_boot_pages(s, e);
+
+ s = n;
+ }
setup_frametable_mappings(ram_start, ram_end);
max_page = PFN_DOWN(ram_end);
--
1.7.9.1
next prev parent reply other threads:[~2013-01-18 16:40 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-18 16:22 [PATCH 00/10 V5] arm: support for initial modules (e.g. dom0) and DTB supplied in RAM Ian Campbell
2013-01-18 16:40 ` [PATCH 01/10] xen: arm: introduce concept of modules which can be in RAM at start of day Ian Campbell
2013-01-21 11:35 ` Stefano Stabellini
2013-01-21 12:41 ` Ian Campbell
2013-01-18 16:40 ` [PATCH 02/10] arm: avoid placing Xen over any modules Ian Campbell
2013-01-18 16:40 ` Ian Campbell [this message]
2013-01-18 16:40 ` [PATCH 04/10] device-tree: get_val cannot cope with cells > 2, add early_panic Ian Campbell
2013-01-18 16:40 ` [PATCH 05/10] arm: load dom0 kernel from first boot module Ian Campbell
2013-01-18 16:40 ` [PATCH 06/10] arm: discard boot modules after building domain 0 Ian Campbell
2013-01-18 16:40 ` [PATCH 07/10] arm: use module provided command line for domain 0 command line Ian Campbell
2013-01-18 16:40 ` [PATCH 08/10] xen/arm: flush dcache after memcpy'ing the kernel image Ian Campbell
2013-01-18 16:40 ` [PATCH 09/10] xen: arm: parse modules from DT during early boot Ian Campbell
2013-01-18 16:40 ` [PATCH 10/10] xen: strip /chosen/modules/module@<N>/* from dom0 device tree Ian Campbell
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=1358527236-2486-3-git-send-email-ian.campbell@citrix.com \
--to=ian.campbell@citrix.com \
--cc=stefano.stabellini@citrix.com \
--cc=tim@xen.org \
--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).