|
|
@@ -29,6 +29,7 @@
|
|
|
|
|
|
#include <asm/pgalloc.h>
|
|
|
#include <asm/ptrace.h>
|
|
|
+#include <asm/tlbflush.h>
|
|
|
|
|
|
/*
|
|
|
* This routine handles page faults. It determines the address and the
|
|
|
@@ -281,6 +282,18 @@ vmalloc_fault:
|
|
|
pte_k = pte_offset_kernel(pmd_k, addr);
|
|
|
if (!pte_present(*pte_k))
|
|
|
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;
|
|
|
}
|
|
|
}
|