29 lines
1.1 KiB
Diff
29 lines
1.1 KiB
Diff
From 2fc0be5fbcee1a62162b699451bb94f90ec64244 Mon Sep 17 00:00:00 2001
|
|
From: Rik van Riel <riel@surriel.com>
|
|
Date: Mon, 30 Dec 2024 12:53:13 -0500
|
|
Subject: x86/mm: only invalidate final translations with INVLPGB
|
|
|
|
Use the INVLPGB_FINAL_ONLY flag when invalidating mappings with INVPLGB.
|
|
This way only leaf mappings get removed from the TLB, leaving intermediate
|
|
translations cached.
|
|
|
|
On the (rare) occasions where we free page tables we do a full flush,
|
|
ensuring intermediate translations get flushed from the TLB.
|
|
|
|
Signed-off-by: Rik van Riel <riel@surriel.com>
|
|
---
|
|
arch/x86/include/asm/invlpgb.h | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
--- a/arch/x86/include/asm/invlpgb.h
|
|
+++ b/arch/x86/include/asm/invlpgb.h
|
|
@@ -51,7 +51,7 @@ static inline void invlpgb_flush_user(un
|
|
static inline void invlpgb_flush_user_nr(unsigned long pcid, unsigned long addr,
|
|
int nr, bool pmd_stride)
|
|
{
|
|
- __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID | INVLPGB_VA);
|
|
+ __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID | INVLPGB_VA | INVLPGB_FINAL_ONLY);
|
|
}
|
|
|
|
/* Flush all mappings for a given ASID, not including globals. */
|