On Mon, Mar 29, 2021 at 7:31 PM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote: > > On Mon, Mar 29, 2021 at 01:16:53PM +0200, Peter Zijlstra wrote: > > Anyway, an additional 'funny' is that I suspect you cannot prove fwd > > progress of the entire primitive with any of this on. But who cares > > about details anyway.. :/ > > What's the architectural guarantee on LL/SC progress for RISC-V ? funct5 | aq | rl | rs2 | rs1 | funct3 | rd | opcode 5 1 1 5 5 3 5 7 LR.W/D ordering 0 addr width dest AMO SC.W/D ordering src addr width dest AMO LR.W loads a word from the address in rs1, places the sign-extended value in rd, and registers a reservation set—a set of bytes that subsumes the bytes in the addressed word. SC.W conditionally writes a word in rs2 to the address in rs1: the SC.W succeeds only if the reservation is still valid and the reservation set contains the bytes being written. If the SC.W succeeds, the instruction writes the word in rs2 to memory, and it writes zero to rd. If the SC.W fails, the instruction does not write to memory, and it writes a nonzero value to rd. Regardless of success or failure, executing an SC.W instruction *invalidates any reservation held by this hart*. More details, ref: https://github.com/riscv/riscv-isa-manual > And what if you double loop it like cmpxchg() ? Can you give a code snippet? -- Best Regards Guo Ren ML: https://lore.kernel.org/linux-csky/