diff options
author | Tim Deegan <Tim.Deegan@citrix.com> | 2011-02-10 11:27:51 +0000 |
---|---|---|
committer | Tim Deegan <Tim.Deegan@citrix.com> | 2011-02-10 11:27:51 +0000 |
commit | 17f709bb8d30af86276d53b4da7534330dcc1e1f (patch) | |
tree | 597238f370d42815c8bba791d0c02a9f8293935b | |
parent | 32e7954462cf4839deb1f268d37cc1639b16a0cc (diff) | |
download | xen-17f709bb8d30af86276d53b4da7534330dcc1e1f.tar.gz xen-17f709bb8d30af86276d53b4da7534330dcc1e1f.tar.bz2 xen-17f709bb8d30af86276d53b4da7534330dcc1e1f.zip |
x86/mm: shuffle log-dirty code so only one path allocates memory
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
-rw-r--r-- | xen/arch/x86/mm/paging.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 1436add2a3..da9d6573aa 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -132,17 +132,12 @@ static mfn_t paging_new_log_dirty_node(struct domain *d, mfn_t **node_p) return mfn; } -/* get the top of the log-dirty bitmap trie, allocating if necessary */ +/* get the top of the log-dirty bitmap trie */ static mfn_t *paging_map_log_dirty_bitmap(struct domain *d) { - mfn_t *mapping; - if ( likely(mfn_valid(d->arch.paging.log_dirty.top)) ) return map_domain_page(mfn_x(d->arch.paging.log_dirty.top)); - - d->arch.paging.log_dirty.top = paging_new_log_dirty_node(d, &mapping); - - return mapping; + return NULL; } static void paging_free_log_dirty_page(struct domain *d, mfn_t mfn) @@ -262,8 +257,12 @@ void paging_mark_dirty(struct domain *d, unsigned long guest_mfn) i4 = L4_LOGDIRTY_IDX(pfn); l4 = paging_map_log_dirty_bitmap(d); - if ( !l4 ) - goto out; + if ( unlikely(!l4) ) + { + d->arch.paging.log_dirty.top = paging_new_log_dirty_node(d, &l4); + if ( !l4 ) + goto out; + } mfn = l4[i4]; if ( !mfn_valid(mfn) ) mfn = l4[i4] = paging_new_log_dirty_node(d, &l3); |