# HG changeset patch
# User George Dunlap <gdunlap@xxxxxxxxxxxxx>
# Date 1172679082 18000
# Node ID 7b35a9682d81319553353f767b35d9c98c12ae19
# Parent d39dcdb9cca36d27d0c509640a15c03800bf706e
[XEN][SHADOW] Fix early-unshadow logic.
Make sure to reset the early-unshadow logic when we
do a fast-path propagate or when we emulate a non-zero
write.
Signed-off-by: George Dunlap <gdunlap@xxxxxxxxxxxxx>
---
xen/arch/x86/mm/shadow/multi.c | 7 +++++++
1 files changed, 7 insertions(+)
diff -r d39dcdb9cca3 -r 7b35a9682d81 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c Wed Feb 28 14:44:52 2007 +0000
+++ b/xen/arch/x86/mm/shadow/multi.c Wed Feb 28 11:11:22 2007 -0500
@@ -2667,6 +2667,7 @@ static int sh_page_fault(struct vcpu *v,
* a not-present fault (by flipping two bits). */
ASSERT(regs->error_code & PFEC_page_present);
regs->error_code ^= (PFEC_reserved_bit|PFEC_page_present);
+ reset_early_unshadow(v);
perfc_incrc(shadow_fault_fast_gnp);
SHADOW_PRINTK("fast path not-present\n");
return 0;
@@ -3961,6 +3962,8 @@ sh_x86_emulate_write(struct vcpu *v, uns
/* If we are writing zeros to this page, might want to unshadow */
if ( likely(bytes >= 4) && (*(u32 *)addr == 0) && is_lo_pte(vaddr) )
check_for_early_unshadow(v, mfn);
+ else
+ reset_early_unshadow(v);
sh_mark_dirty(v->domain, mfn);
@@ -4015,6 +4018,8 @@ sh_x86_emulate_cmpxchg(struct vcpu *v, u
/* If we are writing zeros to this page, might want to unshadow */
if ( likely(bytes >= 4) && (*(u32 *)addr == 0) && is_lo_pte(vaddr) )
check_for_early_unshadow(v, mfn);
+ else
+ reset_early_unshadow(v);
sh_mark_dirty(v->domain, mfn);
@@ -4057,6 +4062,8 @@ sh_x86_emulate_cmpxchg8b(struct vcpu *v,
/* If we are writing zeros to this page, might want to unshadow */
if ( *(u32 *)addr == 0 )
check_for_early_unshadow(v, mfn);
+ else
+ reset_early_unshadow(v);
sh_mark_dirty(v->domain, mfn);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|