shadow dirty-VRAM: avoid multiple remove_all_mappings calls.

sh_remove_all_mappings() will walk roughly half of the shadow L1
tables for each MFN it's called with; calling it for every MFN in a
guest's framebuffer can be _very_ expensive, especially with the
shadow lock held across the whole operation.  Avoid that by just
blowing away all the shadows.

Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
This commit is contained in:
Keir Fraser committed 2009-10-26 12:18:50 +00:00
1 parent def87a2cbf
commit 02a4e58f0b
1 file changed
+3 -6
+3 -6
View File
@@ -3637,12 +3637,9 @@ int shadow_track_dirty_vram(struct domain *d,
* no need to be careful. */
if ( !dirty_vram )
{
/* Just recount from start. */
for ( i = begin_pfn; i < end_pfn; i++ ) {
mfn_t mfn = gfn_to_mfn(d, i, &t);
if (mfn_x(mfn) != INVALID_MFN)
flush_tlb |= sh_remove_all_mappings(d->vcpu[0], mfn);
}
/* Throw away all the shadows rather than walking through them
* up to nr times getting rid of mappings of each pfn */
shadow_blow_tables(d);
gdprintk(XENLOG_INFO, "tracking VRAM %lx - %lx\n", begin_pfn, end_pfn);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.