diff --git a/xen/arch/x86/flushtlb.c b/xen/arch/x86/flushtlb.c index 582a1e254f..ee61aab1ca 100644 --- a/xen/arch/x86/flushtlb.c +++ b/xen/arch/x86/flushtlb.c @@ -140,7 +140,8 @@ unsigned int flush_area_local(const void *va, unsigned int flags) if ( order < (BITS_PER_LONG - PAGE_SHIFT) ) sz = 1UL << (order + PAGE_SHIFT); - if ( !(flags & (FLUSH_TLB|FLUSH_TLB_GLOBAL)) && + if ( (!(flags & (FLUSH_TLB|FLUSH_TLB_GLOBAL)) || + (flags & FLUSH_VA_VALID)) && c->x86_clflush_size && c->x86_cache_size && sz && ((sz >> 10) < c->x86_cache_size) ) { diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 36c44873c2..c997b5352f 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -5641,7 +5641,12 @@ int map_pages_to_xen( flush_flags |= FLUSH_TLB_GLOBAL; \ if ( (flags & _PAGE_PRESENT) && \ (((o_) ^ flags) & PAGE_CACHE_ATTRS) ) \ + { \ flush_flags |= FLUSH_CACHE; \ + if ( virt >= DIRECTMAP_VIRT_START && \ + virt < HYPERVISOR_VIRT_END ) \ + flush_flags |= FLUSH_VA_VALID; \ + } \ } while (0) while ( nr_mfns != 0 ) diff --git a/xen/include/asm-x86/flushtlb.h b/xen/include/asm-x86/flushtlb.h index 4ea31c2c0e..2e7ed6b562 100644 --- a/xen/include/asm-x86/flushtlb.h +++ b/xen/include/asm-x86/flushtlb.h @@ -85,6 +85,8 @@ void write_cr3(unsigned long cr3); #define FLUSH_TLB_GLOBAL 0x200 /* Flush data caches */ #define FLUSH_CACHE 0x400 + /* VA for the flush has a valid mapping */ +#define FLUSH_VA_VALID 0x800 /* Flush local TLBs/caches. */ unsigned int flush_area_local(const void *va, unsigned int flags);