Commit 12433859 authored by ShihPo Hung's avatar ShihPo Hung Committed by Greg Kroah-Hartman

riscv: mm: synchronize MMU after pte change

commit bf587caa upstream.

Because RISC-V compliant implementations can cache invalid entries
in TLB, an SFENCE.VMA is necessary after changes to the page table.
This patch adds an SFENCE.vma for the vmalloc_fault path.
Signed-off-by: default avatarShihPo Hung <shihpo.hung@sifive.com>
[paul.walmsley@sifive.com: reversed tab->whitespace conversion,
 wrapped comment lines]
Signed-off-by: default avatarPaul Walmsley <paul.walmsley@sifive.com>
Cc: Palmer Dabbelt <palmer@sifive.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: linux-riscv@lists.infradead.org
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3688ea1f
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/tlbflush.h>
/* /*
* This routine handles page faults. It determines the address and the * This routine handles page faults. It determines the address and the
...@@ -281,6 +282,18 @@ asmlinkage void do_page_fault(struct pt_regs *regs) ...@@ -281,6 +282,18 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
pte_k = pte_offset_kernel(pmd_k, addr); pte_k = pte_offset_kernel(pmd_k, addr);
if (!pte_present(*pte_k)) if (!pte_present(*pte_k))
goto no_context; goto no_context;
/*
* The kernel assumes that TLBs don't cache invalid
* entries, but in RISC-V, SFENCE.VMA specifies an
* ordering constraint, not a cache flush; it is
* necessary even after writing invalid entries.
* Relying on flush_tlb_fix_spurious_fault would
* suffice, but the extra traps reduce
* performance. So, eagerly SFENCE.VMA.
*/
local_flush_tlb_page(addr);
return; return;
} }
} }
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