[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86/mm: fix up paging_mfn_is_dirty()
# HG changeset patch # User Keir Fraser <keir@xxxxxxx> # Date 1292415135 0 # Node ID f92ad250d80b47a4bcfe7632911f285ccf8cc552 # Parent 6ed80a93a5e031c5ffa13dee7d6dcecbbab42b67 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> --- xen/arch/x86/mm/paging.c | 40 +++++++++++++++++----------------------- 1 files changed, 17 insertions(+), 23 deletions(-) diff -r 6ed80a93a5e0 -r f92ad250d80b xen/arch/x86/mm/paging.c --- a/xen/arch/x86/mm/paging.c Wed Dec 15 12:11:57 2010 +0000 +++ b/xen/arch/x86/mm/paging.c Wed Dec 15 12:12:15 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; - - l4 = paging_map_log_dirty_bitmap(d); - if ( !l4 ) - return 0; - + /* Shared pages are always read-only; invalid pages can't be dirty. */ + if ( unlikely(SHARED_M2P(pfn) || !VALID_M2P(pfn)) ) + goto out; + + 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-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |