Commit f58e5dc4 authored by Samuel Holland's avatar Samuel Holland Committed by Palmer Dabbelt

riscv: mm: Use a fixed layout for the MM context ID

Currently, the size of the ASID field in the MM context ID dynamically
depends on the number of hardware-supported ASID bits. This requires
reading a global variable to extract either field from the context ID.
Instead, allocate the maximum possible number of bits to the ASID field,
so the layout of the context ID is known at compile-time.
Reviewed-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Signed-off-by: default avatarSamuel Holland <samuel.holland@sifive.com>
Link: https://lore.kernel.org/r/20240327045035.368512-11-samuel.holland@sifive.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 74cd1779
...@@ -26,8 +26,8 @@ typedef struct { ...@@ -26,8 +26,8 @@ typedef struct {
#endif #endif
} mm_context_t; } mm_context_t;
#define cntx2asid(cntx) ((cntx) & asid_mask) #define cntx2asid(cntx) ((cntx) & SATP_ASID_MASK)
#define cntx2version(cntx) ((cntx) & ~asid_mask) #define cntx2version(cntx) ((cntx) & ~SATP_ASID_MASK)
void __init create_pgd_mapping(pgd_t *pgdp, uintptr_t va, phys_addr_t pa, void __init create_pgd_mapping(pgd_t *pgdp, uintptr_t va, phys_addr_t pa,
phys_addr_t sz, pgprot_t prot); phys_addr_t sz, pgprot_t prot);
......
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
#define FLUSH_TLB_NO_ASID ((unsigned long)-1) #define FLUSH_TLB_NO_ASID ((unsigned long)-1)
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern unsigned long asid_mask;
static inline void local_flush_tlb_all(void) static inline void local_flush_tlb_all(void)
{ {
__asm__ __volatile__ ("sfence.vma" : : : "memory"); __asm__ __volatile__ ("sfence.vma" : : : "memory");
......
...@@ -22,7 +22,6 @@ DEFINE_STATIC_KEY_FALSE(use_asid_allocator); ...@@ -22,7 +22,6 @@ DEFINE_STATIC_KEY_FALSE(use_asid_allocator);
static unsigned long asid_bits; static unsigned long asid_bits;
static unsigned long num_asids; static unsigned long num_asids;
unsigned long asid_mask;
static atomic_long_t current_version; static atomic_long_t current_version;
...@@ -128,7 +127,7 @@ static unsigned long __new_context(struct mm_struct *mm) ...@@ -128,7 +127,7 @@ static unsigned long __new_context(struct mm_struct *mm)
goto set_asid; goto set_asid;
/* We're out of ASIDs, so increment current_version */ /* We're out of ASIDs, so increment current_version */
ver = atomic_long_add_return_relaxed(num_asids, &current_version); ver = atomic_long_add_return_relaxed(BIT(SATP_ASID_BITS), &current_version);
/* Flush everything */ /* Flush everything */
__flush_context(); __flush_context();
...@@ -247,7 +246,6 @@ static int __init asids_init(void) ...@@ -247,7 +246,6 @@ static int __init asids_init(void)
/* Pre-compute ASID details */ /* Pre-compute ASID details */
if (asid_bits) { if (asid_bits) {
num_asids = 1 << asid_bits; num_asids = 1 << asid_bits;
asid_mask = num_asids - 1;
} }
/* /*
...@@ -255,7 +253,7 @@ static int __init asids_init(void) ...@@ -255,7 +253,7 @@ static int __init asids_init(void)
* at-least twice more than CPUs * at-least twice more than CPUs
*/ */
if (num_asids > (2 * num_possible_cpus())) { if (num_asids > (2 * num_possible_cpus())) {
atomic_long_set(&current_version, num_asids); atomic_long_set(&current_version, BIT(SATP_ASID_BITS));
context_asid_map = bitmap_zalloc(num_asids, GFP_KERNEL); context_asid_map = bitmap_zalloc(num_asids, GFP_KERNEL);
if (!context_asid_map) if (!context_asid_map)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment