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-devel

[Xen-devel] [PATCH 1 of 3] x86/mm: move mfn_is_dirty along with the rest

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 1 of 3] x86/mm: move mfn_is_dirty along with the rest of the log-dirty code
From: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
Date: Wed, 15 Dec 2010 11:59:32 +0000
Delivery-date: Wed, 15 Dec 2010 04:01:21 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1292414371@xxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1292414371@xxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.6.4
# HG changeset patch
# User Tim Deegan <Tim.Deegan@xxxxxxxxxx>
# Date 1292410310 0
# Node ID dd5fbb5b7a43c7509a08849b65c0d1921af5fe05
# Parent  01f3b350902385627d1fa9e8cd1c231953e7610c
x86/mm: move mfn_is_dirty along with the rest of the log-dirty code

Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>

diff -r 01f3b3509023 -r dd5fbb5b7a43 xen/arch/x86/mm/paging.c
--- a/xen/arch/x86/mm/paging.c  Wed Dec 15 10:27:18 2010 +0000
+++ b/xen/arch/x86/mm/paging.c  Wed Dec 15 10:51:50 2010 +0000
@@ -304,6 +304,62 @@ void paging_mark_dirty(struct domain *d,
     log_dirty_unlock(d);
 }
 
+
+/* Is this guest page dirty? */
+int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn)
+{
+    unsigned long pfn;
+    mfn_t mfn, *l4, *l3, *l2;
+    unsigned long *l1;
+    int rv;
+
+    ASSERT(paging_mode_log_dirty(d));
+
+    /* We /really/ mean PFN here, even for non-translated guests. */
+    pfn = get_gpfn_from_mfn(mfn_x(gmfn));
+    /* Page sharing not supported for shadow domains */
+    BUG_ON(SHARED_M2P(pfn));
+    if ( unlikely(!VALID_M2P(pfn)) )
+        return 0;
+    
+    if ( d->arch.paging.log_dirty.failed_allocs > 0 )
+        /* If we have any failed allocations our dirty log is bogus.
+         * Since we can't signal an error here, be conservative and
+         * report "dirty" in this case.  (The only current caller,
+         * _sh_propagate, leaves known-dirty pages writable, preventing
+         * subsequent dirty-logging faults from them.)
+         */
+        return 1;
+
+    l4 = paging_map_log_dirty_bitmap(d);
+    if ( !l4 ) 
+        return 0;
+
+    mfn = l4[L4_LOGDIRTY_IDX(pfn)];
+    unmap_domain_page(l4);
+    if ( !mfn_valid(mfn) )
+        return 0;
+
+    l3 = map_domain_page(mfn_x(mfn));
+    mfn = l3[L3_LOGDIRTY_IDX(pfn)];
+    unmap_domain_page(l3);
+    if ( !mfn_valid(mfn) )
+        return 0;
+
+    l2 = map_domain_page(mfn_x(mfn));
+    mfn = l2[L2_LOGDIRTY_IDX(pfn)];
+    unmap_domain_page(l2);
+    if ( !mfn_valid(mfn) )
+        return 0;
+
+    l1 = map_domain_page(mfn_x(mfn));
+    rv = test_bit(L1_LOGDIRTY_IDX(pfn), l1);
+    unmap_domain_page(l1);
+
+    return rv;
+}
+
+
 /* Read a domain's log-dirty bitmap and stats.  If the operation is a CLEAN,
  * clear the bitmap and stats as well. */
 int paging_log_dirty_op(struct domain *d, struct xen_domctl_shadow_op *sc)
diff -r 01f3b3509023 -r dd5fbb5b7a43 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Wed Dec 15 10:27:18 2010 +0000
+++ b/xen/arch/x86/mm/shadow/multi.c    Wed Dec 15 10:51:50 2010 +0000
@@ -657,7 +657,7 @@ _sh_propagate(struct vcpu *v,
         if ( mfn_valid(target_mfn) ) {
             if ( ft & FETCH_TYPE_WRITE ) 
                 paging_mark_dirty(d, mfn_x(target_mfn));
-            else if ( !sh_mfn_is_dirty(d, target_mfn) )
+            else if ( !paging_mfn_is_dirty(d, target_mfn) )
                 sflags &= ~_PAGE_RW;
         }
     }
diff -r 01f3b3509023 -r dd5fbb5b7a43 xen/arch/x86/mm/shadow/private.h
--- a/xen/arch/x86/mm/shadow/private.h  Wed Dec 15 10:27:18 2010 +0000
+++ b/xen/arch/x86/mm/shadow/private.h  Wed Dec 15 10:51:50 2010 +0000
@@ -568,67 +568,6 @@ sh_unmap_domain_page_global(void *p)
     unmap_domain_page_global(p);
 }
 
-/******************************************************************************
- * Log-dirty mode bitmap handling
- */
-
-extern void sh_mark_dirty(struct domain *d, mfn_t gmfn);
-
-static inline int
-sh_mfn_is_dirty(struct domain *d, mfn_t gmfn)
-/* Is this guest page dirty?  Call only in log-dirty mode. */
-{
-    unsigned long pfn;
-    mfn_t mfn, *l4, *l3, *l2;
-    unsigned long *l1;
-    int rv;
-
-    ASSERT(shadow_mode_log_dirty(d));
-
-    /* We /really/ mean PFN here, even for non-translated guests. */
-    pfn = get_gpfn_from_mfn(mfn_x(gmfn));
-    /* Page sharing not supported for shadow domains */
-    BUG_ON(SHARED_M2P(pfn));
-    if ( unlikely(!VALID_M2P(pfn)) )
-        return 0;
-    
-    if ( d->arch.paging.log_dirty.failed_allocs > 0 )
-        /* If we have any failed allocations our dirty log is bogus.
-         * Since we can't signal an error here, be conservative and
-         * report "dirty" in this case.  (The only current caller,
-         * _sh_propagate, leaves known-dirty pages writable, preventing
-         * subsequent dirty-logging faults from them.)
-         */
-        return 1;
-
-    l4 = paging_map_log_dirty_bitmap(d);
-    if ( !l4 ) 
-        return 0;
-
-    mfn = l4[L4_LOGDIRTY_IDX(pfn)];
-    unmap_domain_page(l4);
-    if ( !mfn_valid(mfn) )
-        return 0;
-
-    l3 = map_domain_page(mfn_x(mfn));
-    mfn = l3[L3_LOGDIRTY_IDX(pfn)];
-    unmap_domain_page(l3);
-    if ( !mfn_valid(mfn) )
-        return 0;
-
-    l2 = map_domain_page(mfn_x(mfn));
-    mfn = l2[L2_LOGDIRTY_IDX(pfn)];
-    unmap_domain_page(l2);
-    if ( !mfn_valid(mfn) )
-        return 0;
-
-    l1 = map_domain_page(mfn_x(mfn));
-    rv = test_bit(L1_LOGDIRTY_IDX(pfn), l1);
-    unmap_domain_page(l1);
-
-    return rv;
-}
-
 /**************************************************************************/
 /* Shadow-page refcounting. */
 
diff -r 01f3b3509023 -r dd5fbb5b7a43 xen/include/asm-x86/paging.h
--- a/xen/include/asm-x86/paging.h      Wed Dec 15 10:27:18 2010 +0000
+++ b/xen/include/asm-x86/paging.h      Wed Dec 15 10:51:50 2010 +0000
@@ -161,6 +161,9 @@ void paging_log_dirty_init(struct domain
 /* mark a page as dirty */
 void paging_mark_dirty(struct domain *d, unsigned long guest_mfn);
 
+/* is this guest page dirty? */
+int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn);
+
 /*
  * Log-dirty radix tree indexing:
  *   All tree nodes are PAGE_SIZE bytes, mapped on-demand.

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