|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/shadow: Alter OOS functions to take a domain
commit 53f860064d6fba5dad69baac274d05db2f7f67df
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Mon Feb 2 01:25:34 2015 +0000
Commit: Tim Deegan <tim@xxxxxxx>
CommitDate: Fri Feb 20 14:47:27 2015 +0000
x86/shadow: Alter OOS functions to take a domain
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Tim Deegan <tim@xxxxxxx>
---
xen/arch/x86/mm/shadow/common.c | 23 ++++++++++++-----------
xen/arch/x86/mm/shadow/multi.c | 19 ++++++++++++-------
xen/arch/x86/mm/shadow/private.h | 6 +++---
3 files changed, 27 insertions(+), 21 deletions(-)
diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
index bdb19fb..6945dfe 100644
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -603,13 +603,13 @@ static inline int oos_fixup_flush_gmfn(struct vcpu *v,
mfn_t gmfn,
return 1;
}
-void oos_fixup_add(struct vcpu *v, mfn_t gmfn,
+void oos_fixup_add(struct domain *d, mfn_t gmfn,
mfn_t smfn, unsigned long off)
{
int idx, next;
mfn_t *oos;
struct oos_fixup *oos_fixup;
- struct domain *d = v->domain;
+ struct vcpu *v;
perfc_incr(shadow_oos_fixup_add);
@@ -788,13 +788,13 @@ static void oos_hash_add(struct vcpu *v, mfn_t gmfn)
}
/* Remove an MFN from the list of out-of-sync guest pagetables */
-static void oos_hash_remove(struct vcpu *v, mfn_t gmfn)
+static void oos_hash_remove(struct domain *d, mfn_t gmfn)
{
int idx;
mfn_t *oos;
- struct domain *d = v->domain;
+ struct vcpu *v;
- SHADOW_PRINTK("%pv gmfn %lx\n", v, mfn_x(gmfn));
+ SHADOW_PRINTK("d%d gmfn %lx\n", d->domain_id, mfn_x(gmfn));
for_each_vcpu(d, v)
{
@@ -813,12 +813,12 @@ static void oos_hash_remove(struct vcpu *v, mfn_t gmfn)
BUG();
}
-mfn_t oos_snapshot_lookup(struct vcpu *v, mfn_t gmfn)
+mfn_t oos_snapshot_lookup(struct domain *d, mfn_t gmfn)
{
int idx;
mfn_t *oos;
mfn_t *oos_snapshot;
- struct domain *d = v->domain;
+ struct vcpu *v;
for_each_vcpu(d, v)
{
@@ -839,13 +839,13 @@ mfn_t oos_snapshot_lookup(struct vcpu *v, mfn_t gmfn)
}
/* Pull a single guest page back into sync */
-void sh_resync(struct vcpu *v, mfn_t gmfn)
+void sh_resync(struct domain *d, mfn_t gmfn)
{
int idx;
mfn_t *oos;
mfn_t *oos_snapshot;
struct oos_fixup *oos_fixup;
- struct domain *d = v->domain;
+ struct vcpu *v;
for_each_vcpu(d, v)
{
@@ -1000,7 +1000,7 @@ void shadow_promote(struct vcpu *v, mfn_t gmfn, unsigned
int type)
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
/* Is the page already shadowed and out of sync? */
if ( page_is_out_of_sync(page) )
- sh_resync(v, gmfn);
+ sh_resync(d, gmfn);
#endif
/* We should never try to promote a gmfn that has writeable mappings */
@@ -1019,6 +1019,7 @@ void shadow_promote(struct vcpu *v, mfn_t gmfn, unsigned
int type)
void shadow_demote(struct vcpu *v, mfn_t gmfn, u32 type)
{
+ struct domain *d = v->domain;
struct page_info *page = mfn_to_page(gmfn);
ASSERT(test_bit(_PGC_page_table, &page->count_info));
@@ -1032,7 +1033,7 @@ void shadow_demote(struct vcpu *v, mfn_t gmfn, u32 type)
/* Was the page out of sync? */
if ( page_is_out_of_sync(page) )
{
- oos_hash_remove(v, gmfn);
+ oos_hash_remove(d, gmfn);
}
#endif
clear_bit(_PGC_page_table, &page->count_info);
diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index ea3b520..82759a6 100644
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -278,6 +278,11 @@ shadow_check_gl1e(struct vcpu *v, walk_t *gw)
static inline uint32_t
gw_remove_write_accesses(struct vcpu *v, unsigned long va, walk_t *gw)
{
+#if GUEST_PAGING_LEVELS >= 3 /* PAE or 64... */
+#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
+ struct domain *d = v->domain;
+#endif
+#endif
uint32_t rc = 0;
#if GUEST_PAGING_LEVELS >= 3 /* PAE or 64... */
@@ -285,7 +290,7 @@ gw_remove_write_accesses(struct vcpu *v, unsigned long va,
walk_t *gw)
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
if ( mfn_is_out_of_sync(gw->l3mfn) )
{
- sh_resync(v, gw->l3mfn);
+ sh_resync(d, gw->l3mfn);
rc = GW_RMWR_REWALK;
}
else
@@ -297,7 +302,7 @@ gw_remove_write_accesses(struct vcpu *v, unsigned long va,
walk_t *gw)
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
if ( mfn_is_out_of_sync(gw->l2mfn) )
{
- sh_resync(v, gw->l2mfn);
+ sh_resync(d, gw->l2mfn);
rc |= GW_RMWR_REWALK;
}
else
@@ -1030,7 +1035,7 @@ static int shadow_set_l2e(struct vcpu *v,
OOS. */
if ( (sp->u.sh.type != SH_type_fl1_shadow) && mfn_valid(gl1mfn)
&& mfn_is_out_of_sync(gl1mfn) )
- sh_resync(v, gl1mfn);
+ sh_resync(d, gl1mfn);
}
#endif
#if GUEST_PAGING_LEVELS == 2
@@ -1178,7 +1183,7 @@ static int shadow_set_l1e(struct vcpu *v,
if ( mfn_valid(new_gmfn) && mfn_oos_may_write(new_gmfn)
&& ((shadow_l1e_get_flags(new_sl1e) & (_PAGE_RW|_PAGE_PRESENT))
== (_PAGE_RW|_PAGE_PRESENT)) )
- oos_fixup_add(v, new_gmfn, sl1mfn, pgentry_ptr_to_slot(sl1e));
+ oos_fixup_add(d, new_gmfn, sl1mfn, pgentry_ptr_to_slot(sl1e));
#endif
old_sl1e = *sl1e;
@@ -2291,7 +2296,7 @@ static int validate_gl1e(struct vcpu *v, void *new_ge,
mfn_t sl1mfn, void *se)
&& mfn_is_out_of_sync(gl1mfn) )
{
/* Update the OOS snapshot. */
- mfn_t snpmfn = oos_snapshot_lookup(v, gl1mfn);
+ mfn_t snpmfn = oos_snapshot_lookup(d, gl1mfn);
guest_l1e_t *snp;
ASSERT(mfn_valid(snpmfn));
@@ -2629,7 +2634,7 @@ static void sh_prefetch(struct vcpu *v, walk_t *gw,
#if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
if ( mfn_is_out_of_sync(gw->l1mfn) )
{
- mfn_t snpmfn = oos_snapshot_lookup(v, gw->l1mfn);
+ mfn_t snpmfn = oos_snapshot_lookup(d, gw->l1mfn);
ASSERT(mfn_valid(snpmfn));
snpl1p = sh_map_domain_page(snpmfn);
@@ -3167,7 +3172,7 @@ static int sh_page_fault(struct vcpu *v,
&& mfn_is_out_of_sync(gw.l1mfn) )
{
/* Update the OOS snapshot. */
- mfn_t snpmfn = oos_snapshot_lookup(v, gw.l1mfn);
+ mfn_t snpmfn = oos_snapshot_lookup(d, gw.l1mfn);
guest_l1e_t *snp;
ASSERT(mfn_valid(snpmfn));
diff --git a/xen/arch/x86/mm/shadow/private.h b/xen/arch/x86/mm/shadow/private.h
index 8c06775..7abb0e0 100644
--- a/xen/arch/x86/mm/shadow/private.h
+++ b/xen/arch/x86/mm/shadow/private.h
@@ -401,9 +401,9 @@ void shadow_unhook_mappings(struct vcpu *v, mfn_t smfn, int
user_only);
int sh_unsync(struct vcpu *v, mfn_t gmfn);
/* Pull an out-of-sync page back into sync. */
-void sh_resync(struct vcpu *v, mfn_t gmfn);
+void sh_resync(struct domain *d, mfn_t gmfn);
-void oos_fixup_add(struct vcpu *v, mfn_t gmfn, mfn_t smfn, unsigned long off);
+void oos_fixup_add(struct domain *d, mfn_t gmfn, mfn_t smfn, unsigned long
off);
int sh_remove_write_access_from_sl1p(struct vcpu *v, mfn_t gmfn,
mfn_t smfn, unsigned long offset);
@@ -432,7 +432,7 @@ shadow_sync_other_vcpus(struct vcpu *v)
}
void oos_audit_hash_is_present(struct domain *d, mfn_t gmfn);
-mfn_t oos_snapshot_lookup(struct vcpu *v, mfn_t gmfn);
+mfn_t oos_snapshot_lookup(struct domain *d, mfn_t gmfn);
#endif /* (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC) */
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |