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] First in what I'm sure will be a series of speedups for

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] First in what I'm sure will be a series of speedups for
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Sat, 19 Mar 2005 15:06:20 +0000
Delivery-date: Tue, 05 Apr 2005 16:13:19 +0000
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/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 Development List <xen-devel@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1236.37.1, 2005/03/19 15:06:20+00:00, mafetter@xxxxxxxxxxxxxxxx

        First in what I'm sure will be a series of speedups for
        shadow_remove_all_write_access()...
        
        Signed-off-by: michael.fetterman@xxxxxxxxxxxx



 arch/x86/shadow.c    |   35 +++++++++++++++++++++++------------
 include/asm-x86/mm.h |    2 +-
 2 files changed, 24 insertions(+), 13 deletions(-)


diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c     2005-04-05 12:13:23 -04:00
+++ b/xen/arch/x86/shadow.c     2005-04-05 12:13:23 -04:00
@@ -73,8 +73,9 @@
     FSH_LOG("shadow_promote gpfn=%p gmfn=%p nt=%p min=%p max=%p",
             gpfn, gmfn, new_type, min_type, max_type);
 
-    if ( min_type <= max_type )
-        shadow_remove_all_write_access(d, min_type, max_type, gpfn, gmfn);
+    if ( (min_type <= max_type) &&
+         !shadow_remove_all_write_access(d, min_type, max_type, gpfn, gmfn) )
+        return 0;
 
     // To convert this page to use as a page table, the writable count
     // should now be zero.  Test this by grabbing the page as an page table,
@@ -90,7 +91,7 @@
     // shadow_lock() and move the shadow code to BIGLOCK().
     //
     if ( unlikely(!get_page(page, d)) )
-        BUG();
+        BUG(); // XXX -- needs more thought for a graceful failure
     if ( unlikely(test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info)) )
     {
         pinned = 1;
@@ -98,8 +99,8 @@
     }
     if ( get_page_type(page, PGT_base_page_table) )
     {
-        put_page_type(page);
         set_bit(_PGC_page_table, &page->count_info);
+        put_page_type(page);
     }
     else
     {
@@ -111,7 +112,7 @@
 
     // Now put the type back to writable...
     if ( unlikely(!get_page_type(page, PGT_writable_page)) )
-        BUG();
+        BUG(); // XXX -- needs more thought for a graceful failure
     if ( unlikely(pinned) )
     {
         if ( unlikely(test_and_set_bit(_PGT_pinned,
@@ -215,14 +216,14 @@
     {
     case PGT_l1_shadow:
         if ( !shadow_promote(d, gpfn, gmfn, psh_type) )
-            goto oom;
+            goto fail;
         perfc_incr(shadow_l1_pages);
         d->arch.shadow_page_count++;
         break;
 
     case PGT_l2_shadow:
         if ( !shadow_promote(d, gpfn, gmfn, psh_type) )
-            goto oom;
+            goto fail;
         perfc_incr(shadow_l2_pages);
         d->arch.shadow_page_count++;
         if ( PGT_l2_page_table == PGT_root_page_table )
@@ -236,7 +237,7 @@
         // pinning.
         //
         if ( !shadow_promote(d, gpfn, gmfn, PGT_l1_shadow) )
-            goto oom;
+            goto fail;
         perfc_incr(hl2_table_pages);
         d->arch.hl2_page_count++;
         if ( shadow_mode_external(d) &&
@@ -263,7 +264,7 @@
 
     return smfn;
 
-  oom:
+  fail:
     FSH_LOG("promotion of pfn=%p mfn=%p failed!  external gnttab refs?\n",
             gpfn, gmfn);
     free_domheap_page(page);
@@ -1777,7 +1778,7 @@
     return count;
 }
 
-u32 shadow_remove_all_write_access(
+int shadow_remove_all_write_access(
     struct domain *d, unsigned min_type, unsigned max_type,
     unsigned long gpfn, unsigned long gmfn)
 {
@@ -1796,10 +1797,13 @@
          PGT_writable_page )
     {
         write_refs = (frame_table[gmfn].u.inuse.type_info & PGT_count_mask);
+        if ( write_refs &&
+             (frame_table[gmfn].u.inuse.type_info & PGT_pinned) )
+            write_refs--;
         if ( write_refs == 0 )
         {
             perfc_incrc(remove_write_access_easy);
-            return 0;
+            return 1;
         }
     }
 
@@ -1816,12 +1820,16 @@
                 case PGT_l1_shadow:
                     count +=
                         remove_all_write_access_in_ptpage(d, a->smfn, gmfn);
+                    if ( count == write_refs )
+                        return 1;
                     break;
                 case PGT_l2_shadow:
                     if ( sl1mfn )
                         count +=
                             remove_all_write_access_in_ptpage(d, a->smfn,
                                                               sl1mfn);
+                    if ( count == write_refs )
+                        return 1;
                     break;
                 case PGT_hl2_shadow:
                     // nothing to do here...
@@ -1835,7 +1843,10 @@
         }
     }
 
-    return count;
+    FSH_LOG("%s: looking for %d refs, found %d refs\n",
+            __func__, write_refs, count);
+
+    return 0;
 }
 
 static u32 remove_all_access_in_page(
diff -Nru a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  2005-04-05 12:13:23 -04:00
+++ b/xen/include/asm-x86/mm.h  2005-04-05 12:13:23 -04:00
@@ -168,7 +168,7 @@
 int alloc_page_type(struct pfn_info *page, unsigned int type);
 void free_page_type(struct pfn_info *page, unsigned int type);
 extern void invalidate_shadow_ldt(struct exec_domain *d);
-extern u32 shadow_remove_all_write_access(
+extern int shadow_remove_all_write_access(
     struct domain *d, unsigned min_type, unsigned max_type,
     unsigned long gpfn, unsigned long gmfn);
 extern u32 shadow_remove_all_access( struct domain *d, unsigned long gmfn);

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] First in what I'm sure will be a series of speedups for, BitKeeper Bot <=