mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "tip-bot2 for Mark Rutland" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Mark Rutland <mark.rutland@arm.com>,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Kees Cook <keescook@chromium.org>,
	x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: locking/core] locking/atomic: arm: fix sync ops
Date: Tue, 06 Jun 2023 08:26:25 -0000	[thread overview]
Message-ID: <168603998596.404.7337206136512798108.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20230605070124.3741859-2-mark.rutland@arm.com>

The following commit has been merged into the locking/core branch of tip:

Commit-ID:     dda5f312bb09e56e7a1c3e3851f2000eb2e9c879
Gitweb:        https://git.kernel.org/tip/dda5f312bb09e56e7a1c3e3851f2000eb2e9c879
Author:        Mark Rutland <mark.rutland@arm.com>
AuthorDate:    Mon, 05 Jun 2023 08:00:58 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Mon, 05 Jun 2023 09:57:13 +02:00

locking/atomic: arm: fix sync ops

The sync_*() ops on arch/arm are defined in terms of the regular bitops
with no special handling. This is not correct, as UP kernels elide
barriers for the fully-ordered operations, and so the required ordering
is lost when such UP kernels are run under a hypervsior on an SMP
system.

Fix this by defining sync ops with the required barriers.

Note: On 32-bit arm, the sync_*() ops are currently only used by Xen,
which requires ARMv7, but the semantics can be implemented for ARMv6+.

Fixes: e54d2f61528165bb ("xen/arm: sync_bitops")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230605070124.3741859-2-mark.rutland@arm.com
---
 arch/arm/include/asm/assembler.h   | 17 +++++++++++++++++-
 arch/arm/include/asm/sync_bitops.h | 29 +++++++++++++++++++++++++----
 arch/arm/lib/bitops.h              | 14 +++++++++++---
 arch/arm/lib/testchangebit.S       |  4 ++++-
 arch/arm/lib/testclearbit.S        |  4 ++++-
 arch/arm/lib/testsetbit.S          |  4 ++++-
 6 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 505a306..aebe2c8 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -394,6 +394,23 @@ ALT_UP_B(.L0_\@)
 #endif
 	.endm
 
+/*
+ * Raw SMP data memory barrier
+ */
+	.macro	__smp_dmb mode
+#if __LINUX_ARM_ARCH__ >= 7
+	.ifeqs "\mode","arm"
+	dmb	ish
+	.else
+	W(dmb)	ish
+	.endif
+#elif __LINUX_ARM_ARCH__ == 6
+	mcr	p15, 0, r0, c7, c10, 5	@ dmb
+#else
+	.error "Incompatible SMP platform"
+#endif
+	.endm
+
 #if defined(CONFIG_CPU_V7M)
 	/*
 	 * setmode is used to assert to be in svc mode during boot. For v7-M
diff --git a/arch/arm/include/asm/sync_bitops.h b/arch/arm/include/asm/sync_bitops.h
index 6f5d627..f46b3c5 100644
--- a/arch/arm/include/asm/sync_bitops.h
+++ b/arch/arm/include/asm/sync_bitops.h
@@ -14,14 +14,35 @@
  * ops which are SMP safe even on a UP kernel.
  */
 
+/*
+ * Unordered
+ */
+
 #define sync_set_bit(nr, p)		_set_bit(nr, p)
 #define sync_clear_bit(nr, p)		_clear_bit(nr, p)
 #define sync_change_bit(nr, p)		_change_bit(nr, p)
-#define sync_test_and_set_bit(nr, p)	_test_and_set_bit(nr, p)
-#define sync_test_and_clear_bit(nr, p)	_test_and_clear_bit(nr, p)
-#define sync_test_and_change_bit(nr, p)	_test_and_change_bit(nr, p)
 #define sync_test_bit(nr, addr)		test_bit(nr, addr)
-#define arch_sync_cmpxchg		arch_cmpxchg
 
+/*
+ * Fully ordered
+ */
+
+int _sync_test_and_set_bit(int nr, volatile unsigned long * p);
+#define sync_test_and_set_bit(nr, p)	_sync_test_and_set_bit(nr, p)
+
+int _sync_test_and_clear_bit(int nr, volatile unsigned long * p);
+#define sync_test_and_clear_bit(nr, p)	_sync_test_and_clear_bit(nr, p)
+
+int _sync_test_and_change_bit(int nr, volatile unsigned long * p);
+#define sync_test_and_change_bit(nr, p)	_sync_test_and_change_bit(nr, p)
+
+#define arch_sync_cmpxchg(ptr, old, new)				\
+({									\
+	__typeof__(*(ptr)) __ret;					\
+	__smp_mb__before_atomic();					\
+	__ret = arch_cmpxchg_relaxed((ptr), (old), (new));		\
+	__smp_mb__after_atomic();					\
+	__ret;								\
+})
 
 #endif
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h
index 95bd359..f069d1b 100644
--- a/arch/arm/lib/bitops.h
+++ b/arch/arm/lib/bitops.h
@@ -28,7 +28,7 @@ UNWIND(	.fnend		)
 ENDPROC(\name		)
 	.endm
 
-	.macro	testop, name, instr, store
+	.macro	__testop, name, instr, store, barrier
 ENTRY(	\name		)
 UNWIND(	.fnstart	)
 	ands	ip, r1, #3
@@ -38,7 +38,7 @@ UNWIND(	.fnstart	)
 	mov	r0, r0, lsr #5
 	add	r1, r1, r0, lsl #2	@ Get word offset
 	mov	r3, r2, lsl r3		@ create mask
-	smp_dmb
+	\barrier
 #if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
 	.arch_extension	mp
 	ALT_SMP(W(pldw)	[r1])
@@ -50,13 +50,21 @@ UNWIND(	.fnstart	)
 	strex	ip, r2, [r1]
 	cmp	ip, #0
 	bne	1b
-	smp_dmb
+	\barrier
 	cmp	r0, #0
 	movne	r0, #1
 2:	bx	lr
 UNWIND(	.fnend		)
 ENDPROC(\name		)
 	.endm
+
+	.macro	testop, name, instr, store
+	__testop \name, \instr, \store, smp_dmb
+	.endm
+
+	.macro	sync_testop, name, instr, store
+	__testop \name, \instr, \store, __smp_dmb
+	.endm
 #else
 	.macro	bitop, name, instr
 ENTRY(	\name		)
diff --git a/arch/arm/lib/testchangebit.S b/arch/arm/lib/testchangebit.S
index 4ebecc6..f13fe9b 100644
--- a/arch/arm/lib/testchangebit.S
+++ b/arch/arm/lib/testchangebit.S
@@ -10,3 +10,7 @@
                 .text
 
 testop	_test_and_change_bit, eor, str
+
+#if __LINUX_ARM_ARCH__ >= 6
+sync_testop	_sync_test_and_change_bit, eor, str
+#endif
diff --git a/arch/arm/lib/testclearbit.S b/arch/arm/lib/testclearbit.S
index 009afa0..4d2c5ca 100644
--- a/arch/arm/lib/testclearbit.S
+++ b/arch/arm/lib/testclearbit.S
@@ -10,3 +10,7 @@
                 .text
 
 testop	_test_and_clear_bit, bicne, strne
+
+#if __LINUX_ARM_ARCH__ >= 6
+sync_testop	_sync_test_and_clear_bit, bicne, strne
+#endif
diff --git a/arch/arm/lib/testsetbit.S b/arch/arm/lib/testsetbit.S
index f3192e5..649dbab 100644
--- a/arch/arm/lib/testsetbit.S
+++ b/arch/arm/lib/testsetbit.S
@@ -10,3 +10,7 @@
                 .text
 
 testop	_test_and_set_bit, orreq, streq
+
+#if __LINUX_ARM_ARCH__ >= 6
+sync_testop	_sync_test_and_set_bit, orreq, streq
+#endif

  reply	other threads:[~2023-06-06  8:28 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-05  7:00 [PATCH v2 00/27] locking/atomic: restructuring + kerneldoc Mark Rutland
2023-06-05  7:00 ` [PATCH v2 01/27] locking/atomic: arm: fix sync ops Mark Rutland
2023-06-06  8:26   ` tip-bot2 for Mark Rutland [this message]
2023-06-05  7:00 ` [PATCH v2 02/27] locking/atomic: remove fallback comments Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 03/27] locking/atomic: hexagon: remove redundant arch_atomic_cmpxchg Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 04/27] locking/atomic: make atomic*_{cmp,}xchg optional Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-27 17:07   ` [PATCH v2 04/27] " Guenter Roeck
2023-06-28 11:42     ` Mark Rutland
2023-07-08 13:07     ` Linux regression tracking (Thorsten Leemhuis)
2023-07-08 13:20       ` Guenter Roeck
2023-07-08 13:37         ` Linux regression tracking (Thorsten Leemhuis)
2023-07-15 12:03           ` Linux regression tracking #update (Thorsten Leemhuis)
2023-06-05  7:01 ` [PATCH v2 05/27] locking/atomic: arc: add preprocessor symbols Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 06/27] locking/atomic: arm: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 07/27] locking/atomic: hexagon: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 08/27] locking/atomic: m68k: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 09/27] locking/atomic: parisc: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 10/27] locking/atomic: sh: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 11/27] locking/atomic: sparc: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 12/27] locking/atomic: x86: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 13/27] locking/atomic: xtensa: " Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 14/27] locking/atomic: scripts: remove bogus order parameter Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 15/27] locking/atomic: scripts: remove leftover "${mult}" Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 16/27] locking/atomic: scripts: factor out order template generation Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 17/27] locking/atomic: scripts: add trivial raw_atomic*_<op>() Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 18/27] locking/atomic: treewide: use raw_atomic*_<op>() Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 19/27] locking/atomic: scripts: build raw_atomic_long*() directly Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 20/27] locking/atomic: scripts: restructure fallback ifdeffery Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 21/27] locking/atomic: scripts: split pfx/name/sfx/order Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 22/27] locking/atomic: scripts: simplify raw_atomic_long*() definitions Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 23/27] locking/atomic: scripts: simplify raw_atomic*() definitions Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 24/27] docs: scripts: kernel-doc: accept bitwise negation like ~@var Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-05  7:01 ` [PATCH v2 25/27] locking/atomic: scripts: generate kerneldoc comments Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland
2023-06-15 14:07   ` [PATCH v2 25/27] " Paul E. McKenney
2023-06-16  8:57     ` Mark Rutland
2023-06-05  7:01 ` [PATCH v2 26/27] locking/atomic: docs: Add atomic operations to the driver basic API documentation Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Paul E. McKenney
2023-06-05  7:01 ` [PATCH v2 27/27] locking/atomic: treewide: delete arch_atomic_*() kerneldoc Mark Rutland
2023-06-06  8:26   ` [tip: locking/core] " tip-bot2 for Mark Rutland

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=168603998596.404.7337206136512798108.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=peterz@infradead.org \
    --cc=x86@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®