Messages in this thread Patch in this message | | | From | Ingo Molnar <> | Subject | [PATCH 34/43] x86/mm: Remove hard-coded ASID limit checks | Date | Fri, 24 Nov 2017 10:14:39 +0100 |
| |
From: Dave Hansen <dave.hansen@linux.intel.com>
First, it's nice to remove the magic numbers.
Second, KAISER is going to consume half of the available ASID space. The space is currently unused, but add a comment to spell out this new restriction.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Daniel Gruss <daniel.gruss@iaik.tugraz.at> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Hugh Dickins <hughd@google.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Kees Cook <keescook@google.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Michael Schwarz <michael.schwarz@iaik.tugraz.at> Cc: Moritz Lipp <moritz.lipp@iaik.tugraz.at> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Richard Fellner <richard.fellner@student.tugraz.at> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-mm@kvack.org Link: http://lkml.kernel.org/r/20171123003504.57EDB845@viggo.jf.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/include/asm/tlbflush.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index df28f1a61afa..3101581c5da0 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -75,6 +75,19 @@ static inline u64 inc_mm_tlb_gen(struct mm_struct *mm) return new_tlb_gen; } +/* There are 12 bits of space for ASIDS in CR3 */ +#define CR3_HW_ASID_BITS 12 +/* When enabled, KAISER consumes a single bit for user/kernel switches */ +#define KAISER_CONSUMED_ASID_BITS 0 + +#define CR3_AVAIL_ASID_BITS (CR3_HW_ASID_BITS - KAISER_CONSUMED_ASID_BITS) +/* + * ASIDs are zero-based: 0->MAX_AVAIL_ASID are valid. -1 below + * to account for them being zero-based. Another -1 is because ASID 0 + * is reserved for use by non-PCID-aware users. + */ +#define MAX_ASID_AVAILABLE ((1<<CR3_AVAIL_ASID_BITS) - 2) + /* * If PCID is on, ASID-aware code paths put the ASID+1 into the PCID * bits. This serves two purposes. It prevents a nasty situation in @@ -88,7 +101,7 @@ struct pgd_t; static inline unsigned long build_cr3(pgd_t *pgd, u16 asid) { if (static_cpu_has(X86_FEATURE_PCID)) { - VM_WARN_ON_ONCE(asid > 4094); + VM_WARN_ON_ONCE(asid > MAX_ASID_AVAILABLE); return __sme_pa(pgd) | (asid + 1); } else { VM_WARN_ON_ONCE(asid != 0); @@ -98,7 +111,7 @@ static inline unsigned long build_cr3(pgd_t *pgd, u16 asid) static inline unsigned long build_cr3_noflush(pgd_t *pgd, u16 asid) { - VM_WARN_ON_ONCE(asid > 4094); + VM_WARN_ON_ONCE(asid > MAX_ASID_AVAILABLE); return __sme_pa(pgd) | (asid + 1) | CR3_NOFLUSH; } -- 2.14.1
| |