#if CONFIG_PAGING_LEVELS == 2
unsigned long hl2mfn;
#endif
+ int need_sync = 0;
int max_mode = ( shadow_mode_external(d) ? SHM_external
: shadow_mode_translate(d) ? SHM_translate
#elif CONFIG_PAGING_LEVELS == 4
smfn = shadow_l4_table(d, gpfn, gmfn);
#endif
- }else
- shadow_sync_all(d);
+ }
+ else
+ {
+ /*
+ * move sync later in order to avoid this smfn been
+ * unshadowed occasionally
+ */
+ need_sync = 1;
+ }
+
+
if ( !get_shadow_ref(smfn) )
BUG();
old_smfn = pagetable_get_pfn(v->arch.shadow_table);
}
#endif /* CONFIG_PAGING_LEVELS == 2 */
+ if(likely(need_sync))
+ shadow_sync_all(d);
+
#if CONFIG_PAGING_LEVELS == 3
/* FIXME: PAE code to be written */
#endif
unsigned long gmfn = pagetable_get_pfn(v->arch.guest_table);
unsigned long gpfn = __mfn_to_gpfn(d, gmfn);
unsigned long smfn, hl2mfn, old_smfn;
+ int need_sync = 0;
int max_mode = ( shadow_mode_external(d) ? SHM_external
: shadow_mode_translate(d) ? SHM_translate
if ( unlikely(!(smfn = __shadow_status(d, gpfn, PGT_base_page_table))) )
smfn = shadow_l2_table(d, gpfn, gmfn);
else
- shadow_sync_all(d);
+ {
+ /*
+ * move sync later in order to avoid this smfn been
+ * unshadowed occasionally
+ */
+ need_sync = 1;
+ }
if ( !get_shadow_ref(smfn) )
BUG();
old_smfn = pagetable_get_pfn(v->arch.shadow_table);
// XXX - maybe this can be optimized somewhat??
local_flush_tlb();
}
+
+ if(likely(need_sync))
+ shadow_sync_all(d);
}
void clear_all_shadow_status(struct domain *d)