aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Deegan <Tim.Deegan@citrix.com>2011-02-10 11:27:51 +0000
committerTim Deegan <Tim.Deegan@citrix.com>2011-02-10 11:27:51 +0000
commit17f709bb8d30af86276d53b4da7534330dcc1e1f (patch)
tree597238f370d42815c8bba791d0c02a9f8293935b
parent32e7954462cf4839deb1f268d37cc1639b16a0cc (diff)
downloadxen-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.c17
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);