WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] xen memory allocator: Allow per-domain bi

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] xen memory allocator: Allow per-domain bitwidth restrictions.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 26 Feb 2007 03:50:18 -0800
Delivery-date: Mon, 26 Feb 2007 04:41:37 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1172325454 0
# Node ID 1e5a83fb928b772eb4c4f4ad6168da5f5f78b987
# Parent  8afe591c272ba27b0aca7943ce58cfdab16630cb
xen memory allocator: Allow per-domain bitwidth restrictions.
Original patch by Jan Beulich <jbeulich@xxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/x86/domain.c        |   12 +++++++++---
 xen/arch/x86/domain_build.c  |    6 +++++-
 xen/arch/x86/x86_64/mm.c     |    7 +++++++
 xen/common/page_alloc.c      |   22 ++++++++++++----------
 xen/include/asm-ia64/mm.h    |    2 ++
 xen/include/asm-powerpc/mm.h |    3 +++
 xen/include/asm-x86/domain.h |    3 +++
 xen/include/asm-x86/mm.h     |    5 ++++-
 8 files changed, 45 insertions(+), 15 deletions(-)

diff -r 8afe591c272b -r 1e5a83fb928b xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/arch/x86/domain.c     Sat Feb 24 13:57:34 2007 +0000
@@ -255,7 +255,7 @@ static void release_compat_l4(struct vcp
 
 static inline int may_switch_mode(struct domain *d)
 {
-    return 1; /* XXX */
+    return (d->tot_pages == 0);
 }
 
 int switch_native(struct domain *d)
@@ -263,7 +263,7 @@ int switch_native(struct domain *d)
     l1_pgentry_t gdt_l1e;
     unsigned int vcpuid;
 
-    if ( !d )
+    if ( d == NULL )
         return -EINVAL;
     if ( !may_switch_mode(d) )
         return -EACCES;
@@ -283,6 +283,8 @@ int switch_native(struct domain *d)
             release_compat_l4(d->vcpu[vcpuid]);
     }
 
+    d->arch.physaddr_bitsize = 64;
+
     return 0;
 }
 
@@ -291,7 +293,7 @@ int switch_compat(struct domain *d)
     l1_pgentry_t gdt_l1e;
     unsigned int vcpuid;
 
-    if ( !d )
+    if ( d == NULL )
         return -EINVAL;
     if ( compat_disabled )
         return -ENOSYS;
@@ -312,6 +314,10 @@ int switch_compat(struct domain *d)
             && setup_compat_l4(d->vcpu[vcpuid]) != 0)
             return -ENOMEM;
     }
+
+    d->arch.physaddr_bitsize =
+        fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1
+        + (PAGE_SIZE - 2);
 
     return 0;
 }
diff -r 8afe591c272b -r 1e5a83fb928b xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/arch/x86/domain_build.c       Sat Feb 24 13:57:34 2007 +0000
@@ -357,7 +357,11 @@ int construct_dom0(struct domain *d,
 
         value = (parms.virt_hv_start_low + mask) & ~mask;
 #ifdef CONFIG_COMPAT
-        HYPERVISOR_COMPAT_VIRT_START(d) = max_t(unsigned int, 
m2p_compat_vstart, value);
+        HYPERVISOR_COMPAT_VIRT_START(d) =
+            max_t(unsigned int, m2p_compat_vstart, value);
+        d->arch.physaddr_bitsize = !IS_COMPAT(d) ? 64 :
+            fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1
+            + (PAGE_SIZE - 2);
         if ( value > (!IS_COMPAT(d) ?
                       HYPERVISOR_VIRT_START :
                       __HYPERVISOR_COMPAT_VIRT_START) )
diff -r 8afe591c272b -r 1e5a83fb928b xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/arch/x86/x86_64/mm.c  Sat Feb 24 13:57:34 2007 +0000
@@ -409,6 +409,13 @@ int check_descriptor(const struct domain
     return 0;
 }
 
+unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits)
+{
+    if ( d == NULL )
+        return bits;
+    return min(d->arch.physaddr_bitsize, bits);
+}
+
 #include "compat/mm.c"
 
 /*
diff -r 8afe591c272b -r 1e5a83fb928b xen/common/page_alloc.c
--- a/xen/common/page_alloc.c   Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/common/page_alloc.c   Sat Feb 24 13:57:34 2007 +0000
@@ -764,19 +764,21 @@ struct page_info *__alloc_domheap_pages(
     struct page_info *pg = NULL;
     cpumask_t mask;
     unsigned long i;
-    unsigned int bits = memflags >> _MEMF_bits, zone_hi;
+    unsigned int bits = memflags >> _MEMF_bits, zone_hi = NR_ZONES - 1;
 
     ASSERT(!in_irq());
 
-    if ( bits && bits <= PAGE_SHIFT + 1 )
-        return NULL;
-
-    zone_hi = bits - PAGE_SHIFT - 1;
-    if ( zone_hi >= NR_ZONES )
-        zone_hi = NR_ZONES - 1;
-
-    if ( NR_ZONES + PAGE_SHIFT > dma_bitsize &&
-         (!bits || bits > dma_bitsize) )
+    if ( bits )
+    {
+        bits = domain_clamp_alloc_bitsize(d, bits);
+        if ( bits <= (PAGE_SHIFT + 1) )
+            return NULL;
+        bits -= PAGE_SHIFT + 1;
+        if ( bits < zone_hi )
+            zone_hi = bits;
+    }
+
+    if ( (zone_hi + PAGE_SHIFT) >= dma_bitsize )
     {
         pg = alloc_heap_pages(dma_bitsize - PAGE_SHIFT, zone_hi, cpu, order);
 
diff -r 8afe591c272b -r 1e5a83fb928b xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/include/asm-ia64/mm.h Sat Feb 24 13:57:34 2007 +0000
@@ -509,4 +509,6 @@ int steal_page(
 int steal_page(
     struct domain *d, struct page_info *page, unsigned int memflags);
 
+#define domain_clamp_alloc_bitsize(d, b) (b)
+
 #endif /* __ASM_IA64_MM_H__ */
diff -r 8afe591c272b -r 1e5a83fb928b xen/include/asm-powerpc/mm.h
--- a/xen/include/asm-powerpc/mm.h      Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/include/asm-powerpc/mm.h      Sat Feb 24 13:57:34 2007 +0000
@@ -289,4 +289,7 @@ extern int steal_page(struct domain *d, 
 /* XXX these just exist until we can stop #including x86 code */
 #define access_ok(addr,size) 1
 #define array_access_ok(addr,count,size) 1
+
+#define domain_clamp_alloc_bitsize(d, b) (b)
+
 #endif
diff -r 8afe591c272b -r 1e5a83fb928b xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h      Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/include/asm-x86/domain.h      Sat Feb 24 13:57:34 2007 +0000
@@ -179,6 +179,9 @@ struct arch_domain
     /* Pseudophysical e820 map (XENMEM_memory_map).  */
     struct e820entry e820[3];
     unsigned int nr_e820;
+
+    /* Maximum physical-address bitwidth supported by this guest. */
+    unsigned int physaddr_bitsize;
 } __cacheline_aligned;
 
 #ifdef CONFIG_X86_PAE
diff -r 8afe591c272b -r 1e5a83fb928b xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  Sat Feb 24 12:19:22 2007 +0000
+++ b/xen/include/asm-x86/mm.h  Sat Feb 24 13:57:34 2007 +0000
@@ -398,8 +398,11 @@ int map_ldt_shadow_page(unsigned int);
 
 #ifdef CONFIG_COMPAT
 int setup_arg_xlat_area(struct vcpu *, l4_pgentry_t *);
+unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits);
 #else
 # define setup_arg_xlat_area(vcpu, l4tab) 0
-#endif
+# define domain_clamp_alloc_bitsize(d, b) (b)
+#endif
+
 
 #endif /* __ASM_X86_MM_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] xen memory allocator: Allow per-domain bitwidth restrictions., Xen patchbot-unstable <=