On Mon, 2025-08-18 at 11:10 +0800, Xi Ruoyao wrote:
> On Mon, 2025-08-18 at 09:15 +0800, Lulu Cheng wrote:
> > Pushed to r16-3247 ... r16-3264.
> > 
> > Sorry it took so long to merge.
> 
> > >    LoongArch: Implement 16-byte CAS with sc.q
> 
> Sorry but it seems we need to revert this one particularly.
> 
> The implementation has a bug: in CAS operation if expected != original,
> we'll still need to (atomically) read original into the pair of
> registers.  But my implementation fails to do that :(.
> 
> I tried to fix it but it seems difficult.  The ll-sc loop will be
> something like
> 
> 1: ll.d $t0, $a0, 0
>    dbar
>    ld.d $t1, $a0, 8
>    bne  $t0, $a1, 2f
>    bne  $t1, $a2, 2f
>    ori  $a3, $r0, 1    # set the success flag
>    move $t2, $a4
>    move $t3, $a5
>    b    3f
> 2: move $a3, $zero
>    move $t2, $t0
>    move $t3, $t1
> 3: sc.q $t2, $t3, $a0, 0
>    beqz $t2, 1b
> 
> Note that we still need to issue the sc.q even if the comparison fails
> to ensure the atomicity of the load (i.e. if another thread changed the
> content of memory between ll.d and ld.d, we shouldn't see a "teared up"
> state).  But now it will trigger a page exception if expected !=
> original and the memory is in a read-only page (see all the discussions
> in PR 80878).
> 
> Thus IMO it's better to revert this for now until I can find a proper
> solution.

I'm testing a patch using vldx and scq together to fix the issue.

-- 
Xi Ruoyao <xry...@xry111.site>

Reply via email to