On Tue, Mar 04, 2025 at 07:10:13AM -0800, Dave Hansen wrote: > So, we could have the enum be totally divorced from the hardware type: > > NO_STRIDE, > PTE_STRIDE, > PMD_STRIDE How about we completely hide that NO_STRIDE thing and do a __invlpgb_all() "sub-helper" which is basically telling you it is invalidating all kinds of TLB entries and stride does not apply there: --- diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h index e8561a846754..361b3dde2656 100644 --- a/arch/x86/include/asm/tlb.h +++ b/arch/x86/include/asm/tlb.h @@ -66,6 +66,12 @@ static inline void __invlpgb(unsigned long asid, unsigned long pcid, asm volatile(".byte 0x0f, 0x01, 0xfe" :: "a" (rax), "c" (ecx), "d" (edx)); } +static inline void __invlpgb_all(unsigned long asid, unsigned long pcid, + unsigned long addr, u16 nr_pages, u8 flags) +{ + __invlpgb(asid, pcid, addr, nr_pages, 0, flags); +} + static inline void __tlbsync(void) { /* @@ -84,6 +90,8 @@ static inline void __tlbsync(void) static inline void __invlpgb(unsigned long asid, unsigned long pcid, unsigned long addr, u16 nr_pages, enum addr_stride s, u8 flags) { } +static inline void __invlpgb_all(unsigned long asid, unsigned long pcid, + unsigned long addr, u16 nr_pages, u8 flags) { } static inline void __tlbsync(void) { } #endif @@ -121,7 +129,7 @@ static inline void __invlpgb_flush_user_nr_nosync(unsigned long pcid, /* Flush all mappings for a given PCID, not including globals. */ static inline void __invlpgb_flush_single_pcid_nosync(unsigned long pcid) { - __invlpgb(0, pcid, 0, 1, PTE_STRIDE, INVLPGB_FLAG_PCID); + __invlpgb_all(0, pcid, 0, 1, INVLPGB_FLAG_PCID); } /* Flush all mappings, including globals, for all PCIDs. */ @@ -134,7 +142,7 @@ static inline void invlpgb_flush_all(void) * as it is cheaper. */ guard(preempt)(); - __invlpgb(0, 0, 0, 1, PTE_STRIDE, INVLPGB_FLAG_INCLUDE_GLOBAL); + __invlpgb_all(0, 0, 0, 1, INVLPGB_FLAG_INCLUDE_GLOBAL); __tlbsync(); } @@ -148,7 +156,7 @@ static inline void __invlpgb_flush_addr_nosync(unsigned long addr, u16 nr) static inline void invlpgb_flush_all_nonglobals(void) { guard(preempt)(); - __invlpgb(0, 0, 0, 1, PTE_STRIDE, INVLPGB_MODE_ALL_NONGLOBALS); + __invlpgb_all(0, 0, 0, 1, INVLPGB_MODE_ALL_NONGLOBALS); __tlbsync(); } #endif /* _ASM_X86_TLB_H */ -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette