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-3.1-testing] 32-on-64: Fix domain address-size clam

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-3.1-testing] 32-on-64: Fix domain address-size clamping, implement
From: "Xen patchbot-3.1-testing" <patchbot-3.1-testing@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 10 Dec 2007 03:10:51 -0800
Delivery-date: Mon, 10 Dec 2007 03:13:17 -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.fraser@xxxxxxxxxx>
# Date 1196962872 0
# Node ID 1177efd2500e84b5a8cee0d94541a8decffd1d2d
# Parent  4d260fce3a7d50d7e082549fa2cdcdbcc069b6ab
32-on-64: Fix domain address-size clamping, implement
copy-on-grant-transfer, and eliminate 166GB memory limit for x86/64
Xen.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset:   16548:cd5e1e76d0bc66440a04122baa27860f5d763b5b
xen-unstable date:        Thu Dec 06 13:39:19 2007 +0000

32-on-64: Fixes to previous changeset.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset:   16549:baf90ee3c1dab65f4a386521be6e108920622866
xen-unstable date:        Thu Dec 06 13:56:00 2007 +0000
---
 xen/arch/x86/domain.c            |    2 --
 xen/arch/x86/domain_build.c      |    2 +-
 xen/arch/x86/x86_64/mm.c         |    2 +-
 xen/common/grant_table.c         |   29 +++++++++++++++++++++++++++++
 xen/common/memory.c              |   15 +++------------
 xen/common/page_alloc.c          |   16 +++++++---------
 xen/include/public/grant_table.h |    6 ++++--
 7 files changed, 45 insertions(+), 27 deletions(-)

diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c     Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/arch/x86/domain.c     Thu Dec 06 17:41:12 2007 +0000
@@ -296,8 +296,6 @@ int switch_native(struct domain *d)
             release_compat_l4(d->vcpu[vcpuid]);
     }
 
-    d->arch.physaddr_bitsize = 64;
-
     return 0;
 }
 
diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/arch/x86/domain_build.c       Thu Dec 06 17:41:12 2007 +0000
@@ -363,7 +363,7 @@ int __init construct_dom0(
 #ifdef CONFIG_COMPAT
         HYPERVISOR_COMPAT_VIRT_START(d) =
             max_t(unsigned int, m2p_compat_vstart, value);
-        d->arch.physaddr_bitsize = !is_pv_32on64_domain(d) ? 64 :
+        d->arch.physaddr_bitsize =
             fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1
             + (PAGE_SIZE - 2);
         if ( value > (!is_pv_32on64_domain(d) ?
diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c  Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/arch/x86/x86_64/mm.c  Thu Dec 06 17:41:12 2007 +0000
@@ -428,7 +428,7 @@ int check_descriptor(const struct domain
 
 unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits)
 {
-    if ( d == NULL )
+    if ( (d == NULL) || !is_pv_32on64_domain(d) )
         return bits;
     return min(d->arch.physaddr_bitsize, bits);
 }
diff -r 4d260fce3a7d -r 1177efd2500e xen/common/grant_table.c
--- a/xen/common/grant_table.c  Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/common/grant_table.c  Thu Dec 06 17:41:12 2007 +0000
@@ -809,6 +809,7 @@ gnttab_transfer(
     grant_entry_t *sha;
     struct gnttab_transfer gop;
     unsigned long mfn;
+    unsigned int max_bitsize;
 
     for ( i = 0; i < count; i++ )
     {
@@ -855,6 +856,34 @@ gnttab_transfer(
             free_domheap_page(page);
             gop.status = GNTST_bad_domain;
             goto copyback;
+        }
+
+        max_bitsize = domain_clamp_alloc_bitsize(
+            e, BITS_PER_LONG+PAGE_SHIFT-1);
+        if ( (1UL << (max_bitsize - PAGE_SHIFT)) <= mfn )
+        {
+            struct page_info *new_page;
+            void *sp, *dp;
+
+            new_page = alloc_domheap_pages(NULL, 0, MEMF_bits(max_bitsize));
+            if ( new_page == NULL )
+            {
+                rcu_unlock_domain(e);
+                page->count_info &= ~(PGC_count_mask|PGC_allocated);
+                free_domheap_page(page);
+                gop.status = GNTST_address_too_big;
+                goto copyback;
+            }
+
+            sp = map_domain_page(mfn);
+            dp = map_domain_page(page_to_mfn(new_page));
+            memcpy(dp, sp, PAGE_SIZE);
+            unmap_domain_page(dp);
+            unmap_domain_page(sp);
+
+            page->count_info &= ~(PGC_count_mask|PGC_allocated);
+            free_domheap_page(page);
+            page = new_page;
         }
 
         spin_lock(&e->page_alloc_lock);
diff -r 4d260fce3a7d -r 1177efd2500e xen/common/memory.c
--- a/xen/common/memory.c       Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/common/memory.c       Thu Dec 06 17:41:12 2007 +0000
@@ -309,18 +309,6 @@ static long memory_exchange(XEN_GUEST_HA
         goto fail_early;
     }
 
-    if ( (exch.out.address_bits != 0) &&
-         (exch.out.address_bits <
-          (get_order_from_pages(max_page) + PAGE_SHIFT)) )
-    {
-        if ( exch.out.address_bits <= PAGE_SHIFT )
-        {
-            rc = -ENOMEM;
-            goto fail_early;
-        }
-        memflags = MEMF_bits(exch.out.address_bits);
-    }
-
     if ( exch.in.extent_order <= exch.out.extent_order )
     {
         in_chunk_order  = exch.out.extent_order - exch.in.extent_order;
@@ -342,6 +330,9 @@ static long memory_exchange(XEN_GUEST_HA
         goto fail_early;
     }
     d = current->domain;
+
+    memflags |= MEMF_bits(domain_clamp_alloc_bitsize(
+        d, exch.out.address_bits ? : (BITS_PER_LONG+PAGE_SHIFT)));
 
     cpu = select_local_cpu(d);
 
diff -r 4d260fce3a7d -r 1177efd2500e xen/common/page_alloc.c
--- a/xen/common/page_alloc.c   Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/common/page_alloc.c   Thu Dec 06 17:41:12 2007 +0000
@@ -817,15 +817,13 @@ struct page_info *__alloc_domheap_pages(
 
     ASSERT(!in_irq());
 
-    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;
-    }
+    bits = domain_clamp_alloc_bitsize(d, bits ? : (BITS_PER_LONG+PAGE_SHIFT));
+    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 )
     {
diff -r 4d260fce3a7d -r 1177efd2500e xen/include/public/grant_table.h
--- a/xen/include/public/grant_table.h  Thu Dec 06 17:36:07 2007 +0000
+++ b/xen/include/public/grant_table.h  Thu Dec 06 17:41:12 2007 +0000
@@ -370,7 +370,8 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_query_siz
 #define GNTST_no_device_space  (-7) /* Out of space in I/O MMU.              */
 #define GNTST_permission_denied (-8) /* Not enough privilege for operation.  */
 #define GNTST_bad_page         (-9) /* Specified page was invalid for op.    */
-#define GNTST_bad_copy_arg    (-10) /* copy arguments cross page boundary */
+#define GNTST_bad_copy_arg    (-10) /* copy arguments cross page boundary.   */
+#define GNTST_address_too_big (-11) /* transfer page address too large.      */
 
 #define GNTTABOP_error_msgs {                   \
     "okay",                                     \
@@ -383,7 +384,8 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_query_siz
     "no spare translation slot in the I/O MMU", \
     "permission denied",                        \
     "bad page",                                 \
-    "copy arguments cross page boundary"        \
+    "copy arguments cross page boundary",       \
+    "page address size too large"               \
 }
 
 #endif /* __XEN_PUBLIC_GRANT_TABLE_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-3.1-testing] 32-on-64: Fix domain address-size clamping, implement, Xen patchbot-3.1-testing <=