riscv: fix race when vmap stack overflow
authorJisheng Zhang <jszhang@kernel.org>
Sun, 30 Oct 2022 12:45:17 +0000 (20:45 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 30 Nov 2022 02:16:55 +0000 (18:16 -0800)
commit7e1864332fbc1b993659eab7974da9fe8bf8c128
tree3c6cd7287a3463cb214208ffceb5b4f0210360b0
parent31da94c25aea835ceac00575a9fd206c5a833fed
riscv: fix race when vmap stack overflow

Currently, when detecting vmap stack overflow, riscv firstly switches
to the so called shadow stack, then use this shadow stack to call the
get_overflow_stack() to get the overflow stack. However, there's
a race here if two or more harts use the same shadow stack at the same
time.

To solve this race, we introduce spin_shadow_stack atomic var, which
will be swap between its own address and 0 in atomic way, when the
var is set, it means the shadow_stack is being used; when the var
is cleared, it means the shadow_stack isn't being used.

Fixes: 31da94c25aea ("riscv: add VMAP_STACK overflow detection")
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
Suggested-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Guo Ren <guoren@kernel.org>
Link: https://lore.kernel.org/r/20221030124517.2370-1-jszhang@kernel.org
[Palmer: Add AQ to the swap, and also some comments.]
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/include/asm/asm.h
arch/riscv/kernel/entry.S
arch/riscv/kernel/traps.c