On 25/03/21 11:29, Borislav Petkov wrote:
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
index f5ca15622dc9..2bfa4deb8cae 100644
--- a/arch/x86/include/asm/tlbflush.h
+++ b/arch/x86/include/asm/tlbflush.h
@@ -245,12 +245,15 @@ static inline void __native_flush_tlb_single(unsigned 
long addr)
         * ASID.  But, userspace flushes are probably much more
         * important performance-wise.
         *
-        * Make sure to do only a single invpcid when KAISER is
-        * disabled and we have only a single ASID.
+        * In the KAISER disabled case, do an INVLPG to make sure
+        * the mapping is flushed in case it is a global one.
         */
-       if (kaiser_enabled)
+       if (kaiser_enabled) {
                invpcid_flush_one(X86_CR3_PCID_ASID_USER, addr);
-       invpcid_flush_one(X86_CR3_PCID_ASID_KERN, addr);
+               invpcid_flush_one(X86_CR3_PCID_ASID_KERN, addr);
+       } else {
+               asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
+       }
  }
static inline void __flush_tlb_all(void)


Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>

Reply via email to