# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 14e7c2948115b2f7ba82e37df571447c0428b8e5
# Parent 3d60bf30dff21fec2fdc8a931c725c23508cb94c
[XEN][POWERPC] support non-RMA memory in domU
- domU device tree now gets two /memory nodes; the first is the RMA
- the tools now call increase_reservation() in 16MB increments (hardcoded)
- memory is stored in a linked list of 16MB extents, which will definitely need
replacing in the future
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
tools/libxc/powerpc64/xc_linux_build.c | 30 ++++++++++++++++++++++++------
tools/python/xen/xend/FlatDeviceTree.py | 24 ++++++++++++++++++------
tools/python/xen/xend/XendDomainInfo.py | 19 ++++++++++++-------
xen/arch/powerpc/mm.c | 27 +++++++++++++++++++--------
xen/arch/powerpc/ofd_fixup_memory.c | 4 +++-
xen/arch/powerpc/shadow.c | 3 ---
xen/common/memory.c | 3 +++
xen/include/asm-ia64/mm.h | 6 ++++++
xen/include/asm-powerpc/mm.h | 4 +++-
xen/include/asm-x86/mm.h | 6 ++++++
10 files changed, 94 insertions(+), 32 deletions(-)
diff -r 3d60bf30dff2 -r 14e7c2948115 tools/libxc/powerpc64/xc_linux_build.c
--- a/tools/libxc/powerpc64/xc_linux_build.c Thu Sep 14 14:20:48 2006 -0400
+++ b/tools/libxc/powerpc64/xc_linux_build.c Thu Sep 14 14:53:32 2006 -0500
@@ -334,22 +334,39 @@ out:
return rc;
}
-static unsigned long create_start_info(start_info_t *si,
+static unsigned long create_start_info(void *devtree, start_info_t *si,
unsigned int console_evtchn, unsigned int store_evtchn,
unsigned long nr_pages)
{
+ void *rma;
unsigned long si_addr;
+ uint64_t rma_reg[2];
+ uint64_t rma_top;
+ int rc;
memset(si, 0, sizeof(*si));
snprintf(si->magic, sizeof(si->magic), "xen-%d.%d-powerpc64HV", 3, 0);
+ rma = ft_find_node(devtree, "/memory@0");
+ if (rma == NULL) {
+ DPRINTF("couldn't find /memory@0\n");
+ return ~0UL;
+ }
+ rc = ft_get_prop(devtree, rma, "reg", rma_reg, sizeof(rma_reg));
+ if (rc < 0) {
+ DPRINTF("couldn't get /memory@0/reg\n");
+ return ~0UL;
+ }
+ rma_top = rma_reg[0] + rma_reg[1];
+ DPRINTF("RMA top = 0x%"PRIX64"\n", rma_top);
+
si->nr_pages = nr_pages;
- si->shared_info = (nr_pages - 1) << PAGE_SHIFT;
- si->store_mfn = si->nr_pages - 2;
+ si->shared_info = rma_top - PAGE_SIZE;
+ si->store_mfn = (rma_top >> PAGE_SHIFT) - 2;
si->store_evtchn = store_evtchn;
- si->console.domU.mfn = si->nr_pages - 3;
+ si->console.domU.mfn = (rma_top >> PAGE_SHIFT) - 3;
si->console.domU.evtchn = console_evtchn;
- si_addr = (si->nr_pages - 4) << PAGE_SHIFT;
+ si_addr = rma_top - 4*PAGE_SIZE;
return si_addr;
}
@@ -434,7 +451,8 @@ int xc_linux_build(int xc_handle,
}
/* start_info stuff: about to be removed */
- si_addr = create_start_info(&si, console_evtchn, store_evtchn, nr_pages);
+ si_addr = create_start_info(devtree, &si, console_evtchn, store_evtchn,
+ nr_pages);
*console_mfn = page_array[si.console.domU.mfn];
*store_mfn = page_array[si.store_mfn];
if (install_image(xc_handle, domid, page_array, &si, si_addr,
diff -r 3d60bf30dff2 -r 14e7c2948115 tools/python/xen/xend/FlatDeviceTree.py
--- a/tools/python/xen/xend/FlatDeviceTree.py Thu Sep 14 14:20:48 2006 -0400
+++ b/tools/python/xen/xend/FlatDeviceTree.py Thu Sep 14 14:53:32 2006 -0500
@@ -288,12 +288,24 @@ def build(imghandler):
xencons = xen.addnode('console')
xencons.addprop('interrupts', 1, 0)
- # XXX split out RMA node
- mem = root.addnode('memory@0')
+ # add memory nodes
totalmem = imghandler.vm.getMemoryTarget() * 1024
- mem.addprop('reg', 0, 0, 0, totalmem)
- mem.addprop('device_type', 'memory\0')
-
+ rma_log = imghandler.vm.info.get('rma_log')
+ rma_bytes = 1 << rma_log
+
+ # RMA node
+ rma = root.addnode('memory@0')
+ rma.addprop('reg', 0, 0, 0, rma_bytes)
+ rma.addprop('device_type', 'memory\0')
+
+ # all the rest in a single node
+ remaining = totalmem - rma_bytes
+ if remaining > 0:
+ mem = root.addnode('memory@1')
+ mem.addprop('reg', 0, rma_bytes, 0, remaining)
+ mem.addprop('device_type', 'memory\0')
+
+ # add CPU nodes
cpus = root.addnode('cpus')
cpus.addprop('smp-enabled')
cpus.addprop('#size-cells', 0)
@@ -323,7 +335,7 @@ def build(imghandler):
chosen = root.addnode('chosen')
chosen.addprop('cpu', cpu0.get_phandle())
- chosen.addprop('memory', mem.get_phandle())
+ chosen.addprop('memory', rma.get_phandle())
chosen.addprop('linux,stdout-path', '/xen/console\0')
chosen.addprop('interrupt-controller', xen.get_phandle())
chosen.addprop('bootargs', imghandler.cmdline + '\0')
diff -r 3d60bf30dff2 -r 14e7c2948115 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Thu Sep 14 14:20:48 2006 -0400
+++ b/tools/python/xen/xend/XendDomainInfo.py Thu Sep 14 14:53:32 2006 -0500
@@ -1757,21 +1757,26 @@ class XendDomainInfoPPC(XendDomainInfo):
# use smallest RMA size available
rma_log = self.getRealModeLogs()[0]
+ self.info['rma_log'] = rma_log # store info for FlatDeviceTree
rma_kb = (1 << rma_log) / 1024
if mem_kb < rma_kb:
- raise ValueError("Domain memory must be at least %d KB" % \
- rma_kb)
+ raise ValueError("Domain memory must be at least %d KB" % rma_kb)
# allocate the RMA
xc.alloc_real_mode_area(self.domid, rma_log)
- # now allocate the remaining memory as order-0 allocations
+ # now allocate the remaining memory as large-order allocations
mem_kb -= rma_kb
- if mem_kb > 0:
- log.debug("increase_reservation(%d, %d, %d)", self.domid,
- mem_kb, 0)
- xc.domain_memory_increase_reservation(self.domid, mem_kb, 0, 0)
+ extent_log = 24 # 16 MB
+ extent_size = 1 << extent_log
+ page_log = 12 # 4 KB
+ extent_order = extent_log - page_log
+ for i in range(0, mem_kb * 1024, extent_size):
+ log.debug("increase_reservation(%d, 0x%x, %d)", self.domid,
+ extent_size >> 10, extent_order)
+ xc.domain_memory_increase_reservation(self.domid, extent_size >>
10,
+ extent_order)
domainTypes = {
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/arch/powerpc/mm.c Thu Sep 14 14:53:32 2006 -0500
@@ -221,21 +221,21 @@ extern void copy_page(void *dp, void *sp
}
}
+/* XXX should probably replace with faster data structure */
static uint add_extent(struct domain *d, struct page_info *pg, uint order)
{
struct page_extents *pe;
pe = xmalloc(struct page_extents);
if (pe == NULL)
- return 0;
+ return -ENOMEM;
pe->pg = pg;
pe->order = order;
- pe->pfn = page_to_mfn(pg);
list_add_tail(&pe->pe_list, &d->arch.extent_list);
- return pe->pfn;
+ return 0;
}
void free_extents(struct domain *d)
@@ -274,7 +274,7 @@ uint allocate_extents(struct domain *d,
if (pg == NULL)
return total_nrpages;
- if (add_extent(d, pg, ext_order) == 0) {
+ if (add_extent(d, pg, ext_order) < 0) {
free_domheap_pages(pg, ext_order);
return total_nrpages;
}
@@ -353,14 +353,18 @@ ulong pfn2mfn(struct domain *d, ulong pf
t = PFN_TYPE_RMA;
mfn = pfn + rma_base_mfn;
} else {
+ ulong cur_pfn = rma_size_mfn;
+
list_for_each_entry (pe, &d->arch.extent_list, pe_list) {
- uint end_pfn = pe->pfn + (1 << pe->order);
-
- if (pfn >= pe->pfn && pfn < end_pfn) {
+ uint pe_pages = 1UL << pe->order;
+ uint end_pfn = cur_pfn + pe_pages;
+
+ if (pfn >= cur_pfn && pfn < end_pfn) {
t = PFN_TYPE_LOGICAL;
- mfn = page_to_mfn(pe->pg) + (pfn - pe->pfn);
+ mfn = page_to_mfn(pe->pg) + (pfn - cur_pfn);
break;
}
+ cur_pfn += pe_pages;
}
}
BUG_ON(t != PFN_TYPE_NONE && page_get_owner(mfn_to_page(mfn)) != d);
@@ -412,3 +416,10 @@ void shadow_drop_references(
struct domain *d, struct page_info *page)
{
}
+
+int arch_domain_add_extent(struct domain *d, struct page_info *page, int order)
+{
+ if (add_extent(d, page, order) < 0)
+ return -ENOMEM;
+ return 0;
+}
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/arch/powerpc/ofd_fixup_memory.c
--- a/xen/arch/powerpc/ofd_fixup_memory.c Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/arch/powerpc/ofd_fixup_memory.c Thu Sep 14 14:53:32 2006 -0500
@@ -86,16 +86,18 @@ static void ofd_memory_extent_nodes(void
ulong size;
ofdn_t n;
struct page_extents *pe;
+ ulong cur_pfn = 1UL << d->arch.rma_order;
list_for_each_entry (pe, &d->arch.extent_list, pe_list) {
- start = pe->pfn << PAGE_SHIFT;
+ start = cur_pfn << PAGE_SHIFT;
size = 1UL << (pe->order + PAGE_SHIFT);
n = ofd_memory_node_create(m, OFD_ROOT, "", memory, memory,
start, size);
BUG_ON(n <= 0);
+ cur_pfn += 1UL << pe->order;
}
}
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/arch/powerpc/shadow.c
--- a/xen/arch/powerpc/shadow.c Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/arch/powerpc/shadow.c Thu Sep 14 14:53:32 2006 -0500
@@ -101,9 +101,6 @@ unsigned int shadow_set_allocation(struc
addr = htab_alloc(d, order);
- printk("%s: ibm,fpt-size should be: 0x%x\n", __func__,
- d->arch.htab.log_num_ptes + LOG_PTE_SIZE);
-
if (addr == 0)
return -ENOMEM;
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/common/memory.c
--- a/xen/common/memory.c Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/common/memory.c Thu Sep 14 14:53:32 2006 -0500
@@ -66,6 +66,9 @@ increase_reservation(
extent_order, d->domain_id, memflags, i, nr_extents);
return i;
}
+
+ /* XXX PPC-specific hack */
+ BUG_ON(0 > arch_domain_add_extent(d, page, extent_order));
/* Inform the domain of the new page's machine address. */
if ( !guest_handle_is_null(extent_list) )
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/include/asm-ia64/mm.h Thu Sep 14 14:53:32 2006 -0500
@@ -500,4 +500,10 @@ int steal_page(
int steal_page(
struct domain *d, struct page_info *page, unsigned int memflags);
+static inline int arch_domain_add_extent(struct domain *d,
+ struct page_info *page, int order)
+{
+ return 0;
+}
+
#endif /* __ASM_IA64_MM_H__ */
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/include/asm-powerpc/mm.h
--- a/xen/include/asm-powerpc/mm.h Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/include/asm-powerpc/mm.h Thu Sep 14 14:53:32 2006 -0500
@@ -86,7 +86,6 @@ struct page_extents {
/* page extent */
struct page_info *pg;
uint order;
- ulong pfn;
};
/* The following page types are MUTUALLY EXCLUSIVE. */
@@ -244,6 +243,9 @@ extern uint allocate_extents(struct doma
extern uint allocate_extents(struct domain *d, uint nrpages, uint rma_nrpages);
extern void free_extents(struct domain *d);
+extern int arch_domain_add_extent(struct domain *d, struct page_info *page,
+ int order);
+
extern int steal_page(struct domain *d, struct page_info *page,
unsigned int memflags);
diff -r 3d60bf30dff2 -r 14e7c2948115 xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h Thu Sep 14 14:20:48 2006 -0400
+++ b/xen/include/asm-x86/mm.h Thu Sep 14 14:53:32 2006 -0500
@@ -432,4 +432,10 @@ int steal_page(
int steal_page(
struct domain *d, struct page_info *page, unsigned int memflags);
+static inline int arch_domain_add_extent(struct domain *d,
+ struct page_info *page, int order)
+{
+ return 0;
+}
+
#endif /* __ASM_X86_MM_H__ */
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|