mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
![]() When running the raid6 user-space test program on RISC-V QEMU, there's a
segmentation fault which seems caused by accessing a NULL pointer,
which is the pointer variable p/q in raid6_rvv*_gen/xor_syndrome_real(),
p/q should have been equal to dptr[x], but when I use GDB command to
see its value, which was 0x10 like below:
"
Program received signal SIGSEGV, Segmentation fault.
0x0000000000011062 in raid6_rvv2_xor_syndrome_real (disks=<optimized out>, start=0, stop=<optimized out>, bytes=4096, ptrs=<optimized out>) at rvv.c:386
(gdb) p p
$1 = (u8 *) 0x10 <error: Cannot access memory at address 0x10>
"
The issue was found to be related with:
1) Compile optimization
There's no segmentation fault if compiling the raid6test program with
the optimization flag -O0.
2) The RISC-V vector command vsetvli
If not used t0 as the first parameter in vsetvli, there's no
segmentation fault either.
This patch selects the 2nd solution to fix the issue.
[Palmer: The actual issue here is a missing clobber in the vsetvli code.
It's a little tricky: we've already probed for VLENB so we don't need to
look at the output register, we just need to have an X register in the
instruction as that's the form required to actually set VL. Thus we
clobber a register, and without describing that we end up breaking
compilers.]
Fixes:
|
||
---|---|---|
.. | ||
test | ||
.gitignore | ||
algos.c | ||
altivec.uc | ||
avx2.c | ||
avx512.c | ||
int.uc | ||
loongarch_simd.c | ||
loongarch.h | ||
Makefile | ||
mktables.c | ||
mmx.c | ||
neon.c | ||
neon.h | ||
neon.uc | ||
recov_avx2.c | ||
recov_avx512.c | ||
recov_loongarch_simd.c | ||
recov_neon_inner.c | ||
recov_neon.c | ||
recov_rvv.c | ||
recov_s390xc.c | ||
recov_ssse3.c | ||
recov.c | ||
rvv.c | ||
rvv.h | ||
s390vx.uc | ||
sse1.c | ||
sse2.c | ||
unroll.awk | ||
vpermxor.uc | ||
x86.h |