]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/futex: Fix FUTEX_OP_ANDN implementation
authorHeiko Carstens <hca@linux.ibm.com>
Tue, 7 Jan 2025 10:28:58 +0000 (11:28 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 15 Jan 2025 16:12:31 +0000 (17:12 +0100)
The futex operation FUTEX_OP_ANDN is supposed to implement

*(int *)UADDR2 &= ~OPARG;

The s390 implementation just implements an AND instead of ANDN.
Add the missing bitwise not operation to oparg to fix this.

This is broken since nearly 19 years, so it looks like user space is
not making use of this operation.

Fixes: 3363fbdd6fb4 ("[PATCH] s390: futex atomic operations")
Cc: stable@vger.kernel.org
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/include/asm/futex.h

index eaeaeb3ff0be3e9958bf15e31458f930557214f9..752a2310f0d6c19ab0d07eccf9e0fc344410332a 100644 (file)
@@ -44,7 +44,7 @@ static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval,
                break;
        case FUTEX_OP_ANDN:
                __futex_atomic_op("lr %2,%1\nnr %2,%5\n",
-                                 ret, oldval, newval, uaddr, oparg);
+                                 ret, oldval, newval, uaddr, ~oparg);
                break;
        case FUTEX_OP_XOR:
                __futex_atomic_op("lr %2,%1\nxr %2,%5\n",