# HG changeset patch
# User Hollis Blanchard <[EMAIL PROTECTED]>
# 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 <[EMAIL PROTECTED]>
Signed-off-by: Hollis Blanchard <[EMAIL PROTECTED]>
---
 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 <[EMAIL PROTECTED]>
+ *          Ryan Harper <[EMAIL PROTECTED]>
+ *          Hollis Blanchard <[EMAIL PROTECTED]>
  */
 
 #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 <[EMAIL PROTECTED]>
  */
@@ -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-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to