[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [POWERPC] memory cleanup (phase 2), destroy (et. al) now work
# HG changeset patch # User Jimi Xenidis <jimix@xxxxxxxxxxxxxx> # Node ID c841daf98bb0f9031536ad0a17c465e9f61a913e # Parent 552d50b3abf2abc8d26d8888c236e7b4eb802242 [POWERPC] memory cleanup (phase 2), destroy (et. al) now work The patch fixes the following problems: - Fix initializing the heaps so we can Link anywhere < RMA. We not link xen at 4MiB, which is way saner. - We track and allocate pages (especially RMA) based on order. - free domain memory as a resource not as domain - clarify "order" arithmetic - update stale def of fix IS_XEN_HEAP_FRAME() Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx> Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx> --- xen/arch/powerpc/Makefile | 2 - xen/arch/powerpc/domain.c | 16 +++++++-------- xen/arch/powerpc/htab.c | 8 ++----- xen/arch/powerpc/mm.c | 1 xen/arch/powerpc/powerpc64/ppc970.c | 3 +- xen/arch/powerpc/setup.c | 37 ++++++++++++++++++++++-------------- xen/include/asm-powerpc/domain.h | 2 - xen/include/asm-powerpc/htab.h | 3 +- xen/include/asm-powerpc/mm.h | 2 - 9 files changed, 41 insertions(+), 33 deletions(-) diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/Makefile --- a/xen/arch/powerpc/Makefile Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/Makefile Mon Aug 14 09:53:46 2006 -0400 @@ -49,7 +49,7 @@ PPC_C_WARNINGS += -Wundef -Wmissing-prot PPC_C_WARNINGS += -Wundef -Wmissing-prototypes -Wmissing-declarations CFLAGS += $(PPC_C_WARNINGS) -LINK=0x3000000 +LINK=0x400000 boot32_link_base = $(LINK) xen_link_offset = 100 xen_link_base = $(patsubst %000,%$(xen_link_offset),$(LINK)) diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/domain.c --- a/xen/arch/powerpc/domain.c Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/domain.c Mon Aug 14 09:53:46 2006 -0400 @@ -74,7 +74,7 @@ int arch_domain_create(struct domain *d) int arch_domain_create(struct domain *d) { unsigned long rma_base; - unsigned long rma_size; + unsigned long rma_sz; uint htab_order; if (d->domain_id == IDLE_DOMAIN_ID) { @@ -85,19 +85,20 @@ int arch_domain_create(struct domain *d) } d->arch.rma_order = cpu_rma_order(); - rma_size = 1UL << d->arch.rma_order << PAGE_SHIFT; + rma_sz = rma_size(d->arch.rma_order); /* allocate the real mode area */ d->max_pages = 1UL << d->arch.rma_order; + d->tot_pages = 0; d->arch.rma_page = alloc_domheap_pages(d, d->arch.rma_order, 0); if (NULL == d->arch.rma_page) return 1; rma_base = page_to_maddr(d->arch.rma_page); - BUG_ON(rma_base & (rma_size-1)); /* check alignment */ - - printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_size); - memset((void *)rma_base, 0, rma_size); + BUG_ON(rma_base & (rma_sz - 1)); /* check alignment */ + + printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_sz); + memset((void *)rma_base, 0, rma_sz); d->shared_info = (shared_info_t *) (rma_addr(&d->arch, RMA_SHARED_INFO) + rma_base); @@ -120,7 +121,6 @@ int arch_domain_create(struct domain *d) void arch_domain_destroy(struct domain *d) { - free_domheap_pages(d->arch.rma_page, d->arch.rma_order); htab_free(d); } @@ -263,7 +263,7 @@ void sync_vcpu_execstate(struct vcpu *v) void domain_relinquish_resources(struct domain *d) { - /* nothing to do? */ + free_domheap_pages(d->arch.rma_page, d->arch.rma_order); } void arch_dump_domain_info(struct domain *d) diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/htab.c --- a/xen/arch/powerpc/htab.c Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/htab.c Mon Aug 14 09:53:46 2006 -0400 @@ -44,27 +44,25 @@ void htab_alloc(struct domain *d, uint o htab_raddr = (ulong)alloc_xenheap_pages(order); ASSERT(htab_raddr != 0); /* XXX check alignment guarantees */ - ASSERT((htab_raddr & (htab_bytes-1)) == 0); + ASSERT((htab_raddr & (htab_bytes - 1)) == 0); /* XXX slow. move memset out to service partition? */ memset((void *)htab_raddr, 0, htab_bytes); + d->arch.htab.order = order; d->arch.htab.log_num_ptes = log_htab_bytes - LOG_PTE_SIZE; d->arch.htab.sdr1 = htab_calc_sdr1(htab_raddr, log_htab_bytes); d->arch.htab.map = (union pte *)htab_raddr; d->arch.htab.shadow = xmalloc_array(ulong, 1UL << d->arch.htab.log_num_ptes); ASSERT(d->arch.htab.shadow != NULL); - - printf("%s: dom%x sdr1: %lx\n", __func__, d->domain_id, d->arch.htab.sdr1); } void htab_free(struct domain *d) { ulong htab_raddr = GET_HTAB(d); - free_xenheap_pages((void *)htab_raddr, - (1UL << d->arch.htab.log_num_ptes) << LOG_PTE_SIZE); + free_xenheap_pages((void *)htab_raddr, d->arch.htab.order); xfree(d->arch.htab.shadow); } diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/mm.c --- a/xen/arch/powerpc/mm.c Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/mm.c Mon Aug 14 09:53:46 2006 -0400 @@ -154,5 +154,4 @@ void shadow_drop_references( void shadow_drop_references( struct domain *d, struct page_info *page) { - panic("%s\n", __func__); } diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/powerpc64/ppc970.c --- a/xen/arch/powerpc/powerpc64/ppc970.c Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/powerpc64/ppc970.c Mon Aug 14 09:53:46 2006 -0400 @@ -34,7 +34,8 @@ unsigned int cpu_rma_order(void) unsigned int cpu_rma_order(void) { /* XXX what about non-HV mode? */ - return 14; /* 1<<14<<PAGE_SIZE = 64M */ + uint rma_log_size = 6 + 20; /* 64M */ + return rma_log_size - PAGE_SHIFT; } void cpu_initialize(void) diff -r 552d50b3abf2 -r c841daf98bb0 xen/arch/powerpc/setup.c --- a/xen/arch/powerpc/setup.c Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/arch/powerpc/setup.c Mon Aug 14 09:53:46 2006 -0400 @@ -273,11 +273,25 @@ static void __init __start_xen(multiboot printk("System RAM: %luMB (%lukB)\n", eomem >> 20, eomem >> 10); + /* top of memory */ max_page = PFN_DOWN(ALIGN_DOWN(eomem, PAGE_SIZE)); total_pages = max_page; - /* skip the exception handlers */ + /* Architecturally the first 4 pages are exception hendlers, we + * will also be copying down some code there */ heap_start = init_boot_allocator(4 << PAGE_SHIFT); + + /* we give the first RMA to the hypervisor */ + xenheap_phys_end = rma_size(cpu_rma_order()); + + /* allow everything else to be allocated */ + init_boot_pages(xenheap_phys_end, eomem); + init_frametable(); + end_boot_allocator(); + + /* Add memory between the beginning of the heap and the beginning + * of out text */ + init_xenheap_pages(heap_start, (ulong)_start); /* move the modules to just after _end */ if (modules_start) { @@ -293,26 +307,21 @@ static void __init __start_xen(multiboot modules_start + modules_size); } + /* the rest of the xenheap, starting at the end of modules */ + init_xenheap_pages(freemem, xenheap_phys_end); + + #ifdef OF_DEBUG printk("ofdump:\n"); /* make sure the OF devtree is good */ ofd_walk((void *)oftree, OFD_ROOT, ofd_dump_props, OFD_DUMP_ALL); #endif + heap_size = xenheap_phys_end - heap_start; + + printk("Xen heap: %luMB (%lukB)\n", heap_size >> 20, heap_size >> 10); + percpu_init_areas(); - - /* mark all memory from modules onward as unused */ - init_boot_pages(freemem, eomem); - - init_frametable(); - end_boot_allocator(); - - /* place the heap from after the allocator bitmap to _start */ - xenheap_phys_end = (ulong)_start; - init_xenheap_pages(heap_start, xenheap_phys_end); - heap_size = xenheap_phys_end - heap_start; - - printk("Xen heap: %luMB (%lukB)\n", heap_size >> 20, heap_size >> 10); cpu_initialize(); diff -r 552d50b3abf2 -r c841daf98bb0 xen/include/asm-powerpc/domain.h --- a/xen/include/asm-powerpc/domain.h Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/include/asm-powerpc/domain.h Mon Aug 14 09:53:46 2006 -0400 @@ -107,7 +107,7 @@ extern void load_float(struct vcpu *); #define RMA_CONSOLE 3 #define RMA_LAST_DOMU 3 -#define rma_size(rma_order) (1UL << (rma_order) << PAGE_SHIFT) +#define rma_size(rma_order) (1UL << ((rma_order) + PAGE_SHIFT)) static inline ulong rma_addr(struct arch_domain *ad, int type) { diff -r 552d50b3abf2 -r c841daf98bb0 xen/include/asm-powerpc/htab.h --- a/xen/include/asm-powerpc/htab.h Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/include/asm-powerpc/htab.h Mon Aug 14 09:53:46 2006 -0400 @@ -128,7 +128,8 @@ union ptel { struct domain_htab { ulong sdr1; - ulong log_num_ptes; /* log number of PTEs in HTAB. */ + uint log_num_ptes; /* log number of PTEs in HTAB. */ + uint order; /* order for freeing. */ union pte *map; /* access the htab like an array */ ulong *shadow; /* idx -> logical translation array */ }; diff -r 552d50b3abf2 -r c841daf98bb0 xen/include/asm-powerpc/mm.h --- a/xen/include/asm-powerpc/mm.h Sun Aug 13 19:19:37 2006 -0400 +++ b/xen/include/asm-powerpc/mm.h Mon Aug 14 09:53:46 2006 -0400 @@ -33,7 +33,7 @@ #define memguard_unguard_range(_p,_l) ((void)0) extern unsigned long xenheap_phys_end; -#define IS_XEN_HEAP_FRAME(_pfn) (page_to_mfn(_pfn) < xenheap_phys_end) +#define IS_XEN_HEAP_FRAME(_pfn) (page_to_maddr(_pfn) < xenheap_phys_end) /* * Per-page-frame information. _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |