All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aurelien Jarno <aurelien@aurel32.net>
To: spacemit@lists.linux.dev
Cc: linux-riscv@lists.infradead.org
Subject: Re: Random corruption on SpacemiT K1 with RVV
Date: Tue, 8 Sep 2026 06:42:09 +0200	[thread overview]
Message-ID: <ap-SIQ9DLt-CfAx6@aurel32.net> (raw)
In-Reply-To: <apSYF5x1Tu7PlyL1@aurel32.net>

Dear all,

I have done some small progress on that issue. Help is still wanted and 
would be appreciated.

On 2026-08-30 22:52, Aurelien Jarno wrote:
> Dear all,
> 
> For the last weeks, I have been tracking a random memory corruption and
> relatively rare on SpacemiT K1 (Banana Pi F3 and Milk-V Jupiter). It 
> started upgrading to glibc 2.43, which does memset() through vector 
> instructions.  It is reproducible using the Debian 7.1.7-1~bpo13+1 
> kernel, but I have also been able to reproduce it with a vanilla 7.2.2 
> kernel, using a similar configuration to the Debian kernel. The board 
> uses OpenSBI 1.9 and the vendor U-Boot.

I have been able to rule out OpenSBI from the issue, I have checked 
there is not trap top OpenSBI when the problem happens.

> Typically it manifests itself with the following kind of error, when 
> running g++ from GCC 16 as part of building software (e.g. OpenJDK, 
> Blender, Dolfin, Qt6):   
> 
> Assembler messages:
> {standard input}:284588: Error: unknown pseudo-op: `.uleb1'
> {standard input}:284588: Error: unrecognized opcode `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvl874'
> 
> The broken chars are 0xff and it seems there are always 240 (but with 
> poor statistics). Sometimes it instead causes a GCC ICE instead.

I have identified that the 0xff comes from the poisoning done for v0 in
__riscv_v_vstate_discard(), which should only happen for a syscall. 
Indeed changing the value to different ones propagates to the above 
error message.

Furthermore I have found that changing CONFIG_RISCV_ISA_V_PREEMPTIVE 
doesn't change anything, and that changing RISCV_ISA_V_UCOPY_THRESHOLD 
changes the number of broken bytes.

Disabling the vectored user code entirely with the following patch seems
to prevent the issue (or make it sufficiently rare that I have not 
encountered it):

--- a/arch/riscv/lib/riscv_v_helpers.c
+++ b/arch/riscv/lib/riscv_v_helpers.c
@@ -25,7 +25,7 @@ asmlinkage int enter_vector_usercopy(void *dst, void *src, size_t n,
        size_t remain, copied;
 
        /* skip has_vector() check because it has been done by the asm  */
-       if (!may_use_simd())
+       if (!may_use_simd() || true)
                goto fallback;
 
        kernel_vector_begin();

Overall, while the corruption happens randomly, the corruption itself 
seems to be deterministic, and the data source of the corruption is 
identified. But I don't understand how those values propagate to user 
space. It is not clear to me if it is a bug somewhere in the context 
switching code, or a bug in __asm_vector_usercopy_sum_enabled fixup 
code, with the values just being the one at the entry of the function.
Also I can't completely rule out a CPU bug.

> Using glibc 2.44 instead of glibc 2.43, which does a lot of string 
> operations through vector instructions, increases the probability to 
> have corruption, makes it a bit more reproducible, but it always seems 
> to manifest as a GCC ICE. It typically happens withing one hour when 
> running on the 8 cores instead of every 1 or 2 days. From there I have 
> been able to determine the following things:

I have stopped using glibc 2.44 as a reproducer, and it generate 
different type of crashes, and there could be another set of bugs on top 
of the one I am trying to identify. This however means it takes a lot of 
time to test any change.
 
> - Disabling vector instructions (by patching the DTB to remove "v", 
>   "zvhf" and "zvtk") fixes the issue
> 
> - Disabling THP (by setting /sys/kernel/mm/transparent_hugepage/enabled 
>   to never instead of always) also seems to fix the issue. Keeping it 
>   enabled with defrag=never or use_zero_page=0 doesn't change anything.

I don't think this is a good direction, my impression is that it just 
changes timing a bit, which just hide the issue, or require different 
condition to trigger it.

Regards
Aurelien 

-- 
Aurelien Jarno                          GPG: 4096R/1DDD8C9B
aurelien@aurel32.net                     http://aurel32.net

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

WARNING: multiple messages have this Message-ID (diff)
From: Aurelien Jarno <aurelien@aurel32.net>
To: spacemit@lists.linux.dev
Cc: linux-riscv@lists.infradead.org
Subject: Re: Random corruption on SpacemiT K1 with RVV
Date: Tue, 8 Sep 2026 06:42:09 +0200	[thread overview]
Message-ID: <ap-SIQ9DLt-CfAx6@aurel32.net> (raw)
In-Reply-To: <apSYF5x1Tu7PlyL1@aurel32.net>

Dear all,

I have done some small progress on that issue. Help is still wanted and 
would be appreciated.

On 2026-08-30 22:52, Aurelien Jarno wrote:
> Dear all,
> 
> For the last weeks, I have been tracking a random memory corruption and
> relatively rare on SpacemiT K1 (Banana Pi F3 and Milk-V Jupiter). It 
> started upgrading to glibc 2.43, which does memset() through vector 
> instructions.  It is reproducible using the Debian 7.1.7-1~bpo13+1 
> kernel, but I have also been able to reproduce it with a vanilla 7.2.2 
> kernel, using a similar configuration to the Debian kernel. The board 
> uses OpenSBI 1.9 and the vendor U-Boot.

I have been able to rule out OpenSBI from the issue, I have checked 
there is not trap top OpenSBI when the problem happens.

> Typically it manifests itself with the following kind of error, when 
> running g++ from GCC 16 as part of building software (e.g. OpenJDK, 
> Blender, Dolfin, Qt6):   
> 
> Assembler messages:
> {standard input}:284588: Error: unknown pseudo-op: `.uleb1'
> {standard input}:284588: Error: unrecognized opcode `ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvl874'
> 
> The broken chars are 0xff and it seems there are always 240 (but with 
> poor statistics). Sometimes it instead causes a GCC ICE instead.

I have identified that the 0xff comes from the poisoning done for v0 in
__riscv_v_vstate_discard(), which should only happen for a syscall. 
Indeed changing the value to different ones propagates to the above 
error message.

Furthermore I have found that changing CONFIG_RISCV_ISA_V_PREEMPTIVE 
doesn't change anything, and that changing RISCV_ISA_V_UCOPY_THRESHOLD 
changes the number of broken bytes.

Disabling the vectored user code entirely with the following patch seems
to prevent the issue (or make it sufficiently rare that I have not 
encountered it):

--- a/arch/riscv/lib/riscv_v_helpers.c
+++ b/arch/riscv/lib/riscv_v_helpers.c
@@ -25,7 +25,7 @@ asmlinkage int enter_vector_usercopy(void *dst, void *src, size_t n,
        size_t remain, copied;
 
        /* skip has_vector() check because it has been done by the asm  */
-       if (!may_use_simd())
+       if (!may_use_simd() || true)
                goto fallback;
 
        kernel_vector_begin();

Overall, while the corruption happens randomly, the corruption itself 
seems to be deterministic, and the data source of the corruption is 
identified. But I don't understand how those values propagate to user 
space. It is not clear to me if it is a bug somewhere in the context 
switching code, or a bug in __asm_vector_usercopy_sum_enabled fixup 
code, with the values just being the one at the entry of the function.
Also I can't completely rule out a CPU bug.

> Using glibc 2.44 instead of glibc 2.43, which does a lot of string 
> operations through vector instructions, increases the probability to 
> have corruption, makes it a bit more reproducible, but it always seems 
> to manifest as a GCC ICE. It typically happens withing one hour when 
> running on the 8 cores instead of every 1 or 2 days. From there I have 
> been able to determine the following things:

I have stopped using glibc 2.44 as a reproducer, and it generate 
different type of crashes, and there could be another set of bugs on top 
of the one I am trying to identify. This however means it takes a lot of 
time to test any change.
 
> - Disabling vector instructions (by patching the DTB to remove "v", 
>   "zvhf" and "zvtk") fixes the issue
> 
> - Disabling THP (by setting /sys/kernel/mm/transparent_hugepage/enabled 
>   to never instead of always) also seems to fix the issue. Keeping it 
>   enabled with defrag=never or use_zero_page=0 doesn't change anything.

I don't think this is a good direction, my impression is that it just 
changes timing a bit, which just hide the issue, or require different 
condition to trigger it.

Regards
Aurelien 

-- 
Aurelien Jarno                          GPG: 4096R/1DDD8C9B
aurelien@aurel32.net                     http://aurel32.net

  reply	other threads:[~2026-09-08  4:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-30 20:52 Random corruption on SpacemiT K1 with RVV and THP Aurelien Jarno
2026-08-30 20:52 ` Aurelien Jarno
2026-09-08  4:42 ` Aurelien Jarno [this message]
2026-09-08  4:42   ` Random corruption on SpacemiT K1 with RVV Aurelien Jarno
2026-09-09 16:45   ` Random corruption on SpacemiT K1 (and K3) " Aurelien Jarno
2026-09-09 16:45     ` Aurelien Jarno

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ap-SIQ9DLt-CfAx6@aurel32.net \
    --to=aurelien@aurel32.net \
    --cc=linux-riscv@lists.infradead.org \
    --cc=spacemit@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.