[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [POWERPC][XEN] Implement guest_physmap_max_mem_pages().
# HG changeset patch # User Hollis Blanchard <hollisb@xxxxxxxxxx> # Date 1172876821 21600 # Node ID f56981f78d731b60fdb9ce2ee1b78727e004f848 # Parent eceb9ccd84a8de9e4e3c8ced4b68e60b335b8a95 [POWERPC][XEN] Implement guest_physmap_max_mem_pages(). - Create a p2m array large enough to cover d->max_pages. - Free in domain_relinquish_resources(). Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx> Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx> --- xen/arch/powerpc/domain.c | 3 ++ xen/arch/powerpc/mm.c | 41 +++++++++++++++++++++++++++++++++++++++ xen/include/asm-powerpc/domain.h | 5 +++- xen/include/asm-powerpc/mm.h | 4 ++- xen/include/asm-powerpc/shadow.h | 4 +-- 5 files changed, 53 insertions(+), 4 deletions(-) diff -r eceb9ccd84a8 -r f56981f78d73 xen/arch/powerpc/domain.c --- a/xen/arch/powerpc/domain.c Fri Mar 02 17:06:50 2007 -0600 +++ b/xen/arch/powerpc/domain.c Fri Mar 02 17:07:01 2007 -0600 @@ -16,6 +16,8 @@ * Copyright IBM Corp. 2005, 2006, 2007 * * Authors: Jimi Xenidis <jimix@xxxxxxxxxxxxxx> + * Ryan Harper <ryanh@xxxxxxxxxx> + * Hollis Blanchard <hollisb@xxxxxxxxxx> */ #include <stdarg.h> @@ -311,6 +313,7 @@ void domain_relinquish_resources(struct relinquish_memory(d, &d->page_list); free_extents(d); xfree(d->arch.foreign_mfns); + xfree(d->arch.p2m); return; } diff -r eceb9ccd84a8 -r f56981f78d73 xen/arch/powerpc/mm.c --- a/xen/arch/powerpc/mm.c Fri Mar 02 17:06:50 2007 -0600 +++ b/xen/arch/powerpc/mm.c Fri Mar 02 17:07:01 2007 -0600 @@ -536,6 +536,47 @@ unsigned long mfn_to_gmfn(struct domain return INVALID_M2P_ENTRY; } +/* NB: caller holds d->page_alloc lock, sets d->max_pages = new_max */ +int guest_physmap_max_mem_pages(struct domain *d, unsigned long new_max_pages) +{ + u32 *p2m_array = NULL; + u32 *p2m_old = NULL; + ulong i; + + /* XXX We probably could, but right now we don't shrink the p2m array. + * NB: d->max_pages >= d->arch.p2m_entries */ + if (new_max_pages < d->max_pages) { + printk("Can't shrink DOM%d max memory pages\n", d->domain_id); + return -EINVAL; + } + + /* Allocate one u32 per page. */ + p2m_array = xmalloc_array(u32, new_max_pages); + if (p2m_array == NULL) + return -ENOMEM; + + /* Copy old mappings into new array. */ + if (d->arch.p2m != NULL) { + /* XXX This could take a long time; we should use a continuation. */ + memcpy(p2m_array, d->arch.p2m, d->arch.p2m_entries * sizeof(u32)); + p2m_old = d->arch.p2m; + } + + /* Mark new mfns as invalid. */ + for (i = d->arch.p2m_entries; i < new_max_pages; i++) + p2m_array[i] = INVALID_MFN; + + /* Set new p2m pointer and size. */ + d->arch.p2m = p2m_array; + d->arch.p2m_entries = new_max_pages; + + /* Free old p2m array if present. */ + if (p2m_old) + xfree(p2m_old); + + return 0; +} + void guest_physmap_add_page( struct domain *d, unsigned long gpfn, unsigned long mfn) { diff -r eceb9ccd84a8 -r f56981f78d73 xen/include/asm-powerpc/domain.h --- a/xen/include/asm-powerpc/domain.h Fri Mar 02 17:06:50 2007 -0600 +++ b/xen/include/asm-powerpc/domain.h Fri Mar 02 17:07:01 2007 -0600 @@ -13,7 +13,7 @@ * along with this program; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Copyright (C) IBM Corp. 2005 + * Copyright IBM Corp. 2005, 2007 * * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> */ @@ -46,6 +46,9 @@ struct arch_domain { /* I/O-port access bitmap mask. */ u8 *iobmp_mask; /* Address of IO bitmap mask, or NULL. */ + + u32 *p2m; /* Array of 32-bit MFNs supports 44 bits of physical memory. */ + ulong p2m_entries; uint large_page_sizes; uint large_page_order[4]; diff -r eceb9ccd84a8 -r f56981f78d73 xen/include/asm-powerpc/mm.h --- a/xen/include/asm-powerpc/mm.h Fri Mar 02 17:06:50 2007 -0600 +++ b/xen/include/asm-powerpc/mm.h Fri Mar 02 17:07:01 2007 -0600 @@ -239,7 +239,9 @@ extern unsigned long mfn_to_gmfn(struct extern unsigned long paddr_to_maddr(unsigned long paddr); -#define INVALID_MFN (~0UL) +/* INVALID_MFN can be any value that fails mfn_valid(). */ +#define INVALID_MFN (~0U) + #define PFN_TYPE_NONE 0 #define PFN_TYPE_RMA 1 #define PFN_TYPE_LOGICAL 2 diff -r eceb9ccd84a8 -r f56981f78d73 xen/include/asm-powerpc/shadow.h --- a/xen/include/asm-powerpc/shadow.h Fri Mar 02 17:06:50 2007 -0600 +++ b/xen/include/asm-powerpc/shadow.h Fri Mar 02 17:07:01 2007 -0600 @@ -32,6 +32,8 @@ ? machine_to_phys_mapping[(mfn)] \ : (mfn) ) +extern int guest_physmap_max_mem_pages(struct domain *d, unsigned long new_max); + extern void guest_physmap_add_page( struct domain *d, unsigned long gpfn, unsigned long mfn); @@ -60,7 +62,5 @@ static inline unsigned int shadow_get_al return (1ULL << (d->arch.htab.order + PAGE_SHIFT)) >> 20; } -#define guest_physmap_max_mem_pages(d, n) (0) - #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |