[PATCH v4 11/12] riscv: mm: Preserve global TLB entries when switching contexts

Alexandre Ghiti alexghiti at rivosinc.com
Thu Jan 4 04:55:40 PST 2024


On Tue, Jan 2, 2024 at 11:01 PM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> If the CPU does not support multiple ASIDs, all MM contexts use ASID 0.
> In this case, it is still beneficial to flush the TLB by ASID, as the
> single-ASID variant of the sfence.vma instruction preserves TLB entries
> for global (kernel) pages.
>
> This optimization is recommended by the RISC-V privileged specification:
>
>   If the implementation does not provide ASIDs, or software chooses
>   to always use ASID 0, then after every satp write, software should
>   execute SFENCE.VMA with rs1=x0. In the common case that no global
>   translations have been modified, rs2 should be set to a register
>   other than x0 but which contains the value zero, so that global
>   translations are not flushed.
>
> It is not possible to apply this optimization when using the ASID
> allocator, because that code must flush the TLB for all ASIDs at once
> when incrementing the version number.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>
> ---
>
> (no changes since v1)
>
>  arch/riscv/mm/context.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/riscv/mm/context.c b/arch/riscv/mm/context.c
> index 43a8bc2d5af4..3ca9b653df7d 100644
> --- a/arch/riscv/mm/context.c
> +++ b/arch/riscv/mm/context.c
> @@ -200,7 +200,7 @@ static void set_mm_noasid(struct mm_struct *mm)
>  {
>         /* Switch the page table and blindly nuke entire local TLB */
>         csr_write(CSR_SATP, virt_to_pfn(mm->pgd) | satp_mode);
> -       local_flush_tlb_all();
> +       local_flush_tlb_all_asid(0);
>  }
>
>  static inline void set_mm(struct mm_struct *prev,
> --
> 2.42.0
>

You can add:

Reviewed-by: Alexandre Ghiti <alexghiti at rivosinc.com>

Thanks,

Alex



More information about the linux-riscv mailing list