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] x86 shadow: Add FreeBSD mappings guest he

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86 shadow: Add FreeBSD mappings guest heuristics.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 30 Sep 2008 08:00:10 -0700
Delivery-date: Tue, 30 Sep 2008 08:00:08 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/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 1222439631 -3600
# Node ID 840c0c3c185ae2b0baeceba7caf2f420a44f116d
# Parent  19b0a4f91712ed2ae4d5a7276ff7412edfe95593
x86 shadow: Add FreeBSD mappings guest heuristics.

This patch adds FreeBSD mappings heuristics to allow faster page
promotion.

Also, remove code for unsync va heuristic, not needed anymore.

Signed-off-by: Gianluca Guida <gianluca.guida@xxxxxxxxxxxxx>
---
 xen/arch/x86/mm/shadow/common.c  |   30 +++++++++++++++++++++++++++---
 xen/include/asm-x86/perfc_defn.h |    2 +-
 2 files changed, 28 insertions(+), 4 deletions(-)

diff -r 19b0a4f91712 -r 840c0c3c185a xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Fri Sep 26 14:05:41 2008 +0100
+++ b/xen/arch/x86/mm/shadow/common.c   Fri Sep 26 15:33:51 2008 +0100
@@ -2343,9 +2343,6 @@ int sh_remove_write_access(struct vcpu *
                 return 1;                                               \
             }                                                           \
         } while (0)
-
-        if ( level == 0 && fault_addr )
-            GUESS(fault_addr, 6);
         
         if ( v->arch.paging.mode->guest_levels == 2 )
         {
@@ -2357,6 +2354,10 @@ int sh_remove_write_access(struct vcpu *
             if ((gfn = mfn_to_gfn(v->domain, gmfn)) < 0x38000 ) 
                 GUESS(0xC0000000UL + (gfn << PAGE_SHIFT), 4);
 
+            /* FreeBSD: Linear map at 0xBFC00000 */
+            if ( level == 1 )
+                GUESS(0xBFC00000UL 
+                      + ((fault_addr & VADDR_MASK) >> 10), 6);
         }
         else if ( v->arch.paging.mode->guest_levels == 3 )
         {
@@ -2370,6 +2371,15 @@ int sh_remove_write_access(struct vcpu *
             /* Linux lowmem: first 896MB is mapped 1-to-1 above 0xC0000000 */
             if ((gfn = mfn_to_gfn(v->domain, gmfn)) < 0x38000 ) 
                 GUESS(0xC0000000UL + (gfn << PAGE_SHIFT), 4);
+            
+            /* FreeBSD PAE: Linear map at 0xBF800000 */
+            switch ( level )
+            {
+            case 1: GUESS(0xBF800000UL
+                          + ((fault_addr & VADDR_MASK) >> 9), 6); break;
+            case 2: GUESS(0xBFDFC000UL
+                          + ((fault_addr & VADDR_MASK) >> 18), 6); break;
+            }
         }
 #if CONFIG_PAGING_LEVELS >= 4
         else if ( v->arch.paging.mode->guest_levels == 4 )
@@ -2392,11 +2402,25 @@ int sh_remove_write_access(struct vcpu *
             GUESS(0xffff880000000000UL + (gfn << PAGE_SHIFT), 4);
             GUESS(0xffff810000000000UL + (gfn << PAGE_SHIFT), 4);
             GUESS(0x0000010000000000UL + (gfn << PAGE_SHIFT), 4);
+
             /*
              * 64bit Solaris kernel page map at
              * kpm_vbase; 0xfffffe0000000000UL
              */
             GUESS(0xfffffe0000000000UL + (gfn << PAGE_SHIFT), 4);
+ 
+             /* FreeBSD 64bit: linear map 0xffff800000000000 */
+             switch ( level )
+             {
+             case 1: GUESS(0xffff800000000000
+                           + ((fault_addr & VADDR_MASK) >> 9), 6); break;
+             case 2: GUESS(0xffff804000000000UL
+                           + ((fault_addr & VADDR_MASK) >> 18), 6); break;
+             case 3: GUESS(0xffff804020000000UL
+                           + ((fault_addr & VADDR_MASK) >> 27), 6); break;
+             }
+             /* FreeBSD 64bit: direct map at 0xffffff0000000000 */
+             GUESS(0xffffff0000000000 + (gfn << PAGE_SHIFT), 6);
         }
 #endif /* CONFIG_PAGING_LEVELS >= 4 */
 
diff -r 19b0a4f91712 -r 840c0c3c185a xen/include/asm-x86/perfc_defn.h
--- a/xen/include/asm-x86/perfc_defn.h  Fri Sep 26 14:05:41 2008 +0100
+++ b/xen/include/asm-x86/perfc_defn.h  Fri Sep 26 15:33:51 2008 +0100
@@ -80,7 +80,7 @@ PERFCOUNTER(shadow_writeable_h_3,  "shad
 PERFCOUNTER(shadow_writeable_h_3,  "shadow writeable: 64b w2k3")
 PERFCOUNTER(shadow_writeable_h_4,  "shadow writeable: linux low/solaris")
 PERFCOUNTER(shadow_writeable_h_5,  "shadow writeable: linux high")
-PERFCOUNTER(shadow_writeable_h_6,  "shadow writeable: unsync va")
+PERFCOUNTER(shadow_writeable_h_6,  "shadow writeable: FreeBSD")
 PERFCOUNTER(shadow_writeable_h_7,  "shadow writeable: sl1p")
 PERFCOUNTER(shadow_writeable_h_8,  "shadow writeable: sl1p failed")
 PERFCOUNTER(shadow_writeable_bf,   "shadow writeable brute-force")

_______________________________________________
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] x86 shadow: Add FreeBSD mappings guest heuristics., Xen patchbot-unstable <=