mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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:
1 parent
def87a2cbf
commit
02a4e58f0b
1 file changed
+3
-6
@@ -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);
|
||||
|
||||
|
||||