Re: [PATCH] block: switch to atomic_t for request references
From: Peter Zijlstra <peterz@infradead.org>
Date: 2021-12-10 10:57:17
Also in:
lkml
On Wed, Dec 08, 2021 at 10:50:10AM -0800, Linus Torvalds wrote:
On Wed, Dec 8, 2021 at 10:44 AM Peter Zijlstra [off-list ref] wrote:quoted
From testing xadd had different flags from add; I've not yet looked at the SDM to see what it said on the matter.That should not be the case. Just checked, and it just says "The CF, PF, AF, SF, ZF, and OF flags are set according to the result of the addition, which is stored in the destination operand" which shows that I was confused about 'xadd' - I thought it returned the old value in the register ("fetch_add"). It doesn't. It returns the new one ("add_fetch"). And then 'fetch_add' ends up undoing it by doing a sub or whatever. So the actual returned value and the flags should match on x86. Other architectures have the "return old value" model, which does mean that my "different architectures can have different preferences for which one to test" argument was right, even if I got xadd wrong.
I think XADD does return old too; SDM states: "Exchanges the first operand (destination operand) with the second operand (source operand), then loads the sum of the two values into the destination operand. The destination operand can be a register or a memory location; the source operand is a register." So it first exchanges and then adds. Which is why the flags are set for add, not exchange.