]> git.baikalelectronics.ru Git - kernel.git/commit
RISC-V: Flush I$ when making a dirty page executable
authorAndrew Waterman <andrew@sifive.com>
Wed, 25 Oct 2017 21:30:32 +0000 (14:30 -0700)
committerPalmer Dabbelt <palmer@sifive.com>
Thu, 30 Nov 2017 20:58:25 +0000 (12:58 -0800)
commit08f051eda33b51e8ee0f45f05bcfe49d0f0caf6b
tree46a1e3577de686377e859c7f346299e9ea726260
parent28dfbe6ed483e8a589cce88095d7787d61bf9c16
RISC-V: Flush I$ when making a dirty page executable

The RISC-V ISA allows for instruction caches that are not coherent WRT
stores, even on a single hart.  As a result, we need to explicitly flush
the instruction cache whenever marking a dirty page as executable in
order to preserve the correct system behavior.

Local instruction caches aren't that scary (our implementations actually
flush the cache, but RISC-V is defined to allow higher-performance
implementations to exist), but RISC-V defines no way to perform an
instruction cache shootdown.  When explicitly asked to do so we can
shoot down remote instruction caches via an IPI, but this is a bit on
the slow side.

Instead of requiring an IPI to all harts whenever marking a page as
executable, we simply flush the currently running harts.  In order to
maintain correct behavior, we additionally mark every other hart as
needing a deferred instruction cache which will be taken before anything
runs on it.

Signed-off-by: Andrew Waterman <andrew@sifive.com>
Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
arch/riscv/include/asm/cacheflush.h
arch/riscv/include/asm/mmu.h
arch/riscv/include/asm/mmu_context.h
arch/riscv/include/asm/pgtable.h
arch/riscv/include/asm/tlbflush.h
arch/riscv/kernel/smp.c
arch/riscv/mm/Makefile
arch/riscv/mm/cacheflush.c [new file with mode: 0644]