diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index d6c052428e..c8a9f1eb02 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -1450,6 +1450,7 @@ static int resync_all(struct domain *d, u32 stype) int changed; u32 min_max_shadow, min_max_snapshot; int min_shadow, max_shadow, min_snapshot, max_snapshot; + struct vcpu *v; ASSERT(shadow_lock_is_acquired(d)); @@ -1739,6 +1740,9 @@ static int resync_all(struct domain *d, u32 stype) if ( unlikely(unshadow) ) { + for_each_vcpu(d, v) + if(smfn == pagetable_get_pfn(v->arch.shadow_table)) + return need_flush; perfc_incrc(unshadow_l2_count); shadow_unpin(smfn); #if CONFIG_PAGING_LEVELS == 2 diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index 298fdb1a5d..7d517ec390 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -2326,6 +2326,7 @@ static int resync_all(struct domain *d, u32 stype) int changed; u32 min_max_shadow, min_max_snapshot; int min_shadow, max_shadow, min_snapshot, max_snapshot; + struct vcpu *v; ASSERT(shadow_lock_is_acquired(d)); @@ -2527,6 +2528,9 @@ static int resync_all(struct domain *d, u32 stype) if ( unlikely(unshadow) ) { + for_each_vcpu(d, v) + if(smfn == pagetable_get_pfn(v->arch.shadow_table)) + return need_flush; perfc_incrc(unshadow_l2_count); shadow_unpin(smfn); if ( unlikely(shadow_mode_external(d)) )