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 2 of 3] x86/mm: fix up paging_mfn_is_dirty()

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 2 of 3] x86/mm: fix up paging_mfn_is_dirty()
From: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
Date: Wed, 15 Dec 2010 11:59:33 +0000
Delivery-date: Wed, 15 Dec 2010 04:06:45 -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 1292411012 0
# Node ID 5bfe5ec812ff7019d4dcb5a7574926027e03f984
# Parent  dd5fbb5b7a43c7509a08849b65c0d1921af5fe05
x86/mm: fix up paging_mfn_is_dirty()

Add locking, and don't allocate the top-level page if it's not there.
Also gets rid of the default-to-1 case if there have been failed
allocations because the safer thing is actually to return 0 and avoid
modifying an un-dirtied page.

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

diff -r dd5fbb5b7a43 -r 5bfe5ec812ff xen/arch/x86/mm/paging.c
--- a/xen/arch/x86/mm/paging.c  Wed Dec 15 10:51:50 2010 +0000
+++ b/xen/arch/x86/mm/paging.c  Wed Dec 15 11:03:32 2010 +0000
@@ -311,51 +311,45 @@ int paging_mfn_is_dirty(struct domain *d
     unsigned long pfn;
     mfn_t mfn, *l4, *l3, *l2;
     unsigned long *l1;
-    int rv;
+    int rv = 0;
 
+    log_dirty_lock(d);
     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;
+    /* Shared pages are always read-only; invalid pages can't be dirty. */
+    if ( unlikely(SHARED_M2P(pfn) || !VALID_M2P(pfn)) )
+        goto out;
 
-    l4 = paging_map_log_dirty_bitmap(d);
-    if ( !l4 ) 
-        return 0;
+    mfn = d->arch.paging.log_dirty.top;
+    if ( !mfn_valid(mfn) )
+        goto out;
 
+    l4 = map_domain_page(mfn_x(mfn));
     mfn = l4[L4_LOGDIRTY_IDX(pfn)];
     unmap_domain_page(l4);
     if ( !mfn_valid(mfn) )
-        return 0;
+        goto out;
 
     l3 = map_domain_page(mfn_x(mfn));
     mfn = l3[L3_LOGDIRTY_IDX(pfn)];
     unmap_domain_page(l3);
     if ( !mfn_valid(mfn) )
-        return 0;
+        goto out;
 
     l2 = map_domain_page(mfn_x(mfn));
     mfn = l2[L2_LOGDIRTY_IDX(pfn)];
     unmap_domain_page(l2);
     if ( !mfn_valid(mfn) )
-        return 0;
+        goto out;
 
     l1 = map_domain_page(mfn_x(mfn));
     rv = test_bit(L1_LOGDIRTY_IDX(pfn), l1);
     unmap_domain_page(l1);
 
+out:
+    log_dirty_unlock(d);
     return rv;
 }
 

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