From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C1854AE130; Fri, 11 Sep 2026 19:25:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154759; cv=none; b=k/VJ8BUut5IO2AQb93JLerrpoWyMnsb6epaWWWMElGGZLtUjP96i2nPdajX6uBIDN7NTiyvYBHKoKCd7+B6TqIRCT+kuJGfC19ctTYW19RSfVhbyMKAig9qDKVAWf5MsJahJQ3rsDwk87f/hPvcfdQmTnfoxqGCn+4KRmBOUm2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154759; c=relaxed/simple; bh=PCyYoxWXg7sOin+tmY8Fbun+nm8rOPLv4vut1yRslEM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GnIxBpoY0ci6vd+yaWRFTYsL/WOjSbnXBs+r6OBlxgzR7twpg/oCNY+DGg9WykMnzQB8OIGM6e/KeN774Yes7jABwJ/nYerHndtx0Cz/7p2KpG7RKCOxVjS9C5MPr3Cwtq2HqGkHSNv/fAc18bHQ6mhCnNiwHyafyxXARCGKrQ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 1/6] lib: Add two-byte cmpxchg emulation function Date: Fri, 11 Sep 2026 19:25:34 +0000 Message-ID: <20260911192540.20983-2-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" cmpxchg_emu_u8() emulates one-byte cmpxchg() in terms of four-byte cmpxchg() for the architectures lacking native one-byte atomics. The same architectures also lack native two-byte cmpxchg(), where such an operation is not supported and either fails to compile via BUILD_BUG() or fails to link, because the bad pointer sentinels these architectures declare are never defined. Add cmpxchg_emu_u16(), the two-byte sibling. It reads the enclosing word with READ_ONCE(), splices the two target bytes through a union and loops on cmpxchg() of the full word until the compare succeeds. Like cmpxchg_emu_u8() it is fully ordered. The Kconfig symbol gating this file is renamed from ARCH_NEED_CMPXCHG_1_EMU to ARCH_NEED_CMPXCHG_1_2_EMU, as it now selects both the one-byte and the two-byte emulation. Suggested-by: Paul E. McKenney Signed-off-by: Bradley Morgan --- arch/Kconfig | 2 +- arch/arc/Kconfig | 2 +- arch/arm/Kconfig | 2 +- arch/csky/Kconfig | 2 +- arch/sh/Kconfig | 2 +- arch/xtensa/Kconfig | 2 +- include/linux/cmpxchg-emu.h | 1 + lib/Makefile | 2 +- lib/cmpxchg-emu.c | 35 ++++++++++++++++++++++++++++++++--- 9 files changed, 40 insertions(+), 10 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 3bb2e568f5b1..d56064797e09 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -1817,7 +1817,7 @@ config CC_HAS_SANE_FUNCTION_ALIGNMENT # strict alignment always, even with -falign-functions. def_bool CC_HAS_MIN_FUNCTION_ALIGNMENT || CC_IS_CLANG =20 -config ARCH_NEED_CMPXCHG_1_EMU +config ARCH_NEED_CMPXCHG_1_2_EMU bool =20 config ARCH_WANTS_PRE_LINK_VMLINUX diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index 80e61175bf52..0e91d254eccb 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -14,7 +14,7 @@ config ARC select ARCH_HAS_SETUP_DMA_OPS select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NEED_CMPXCHG_1_EMU + select ARCH_NEED_CMPXCHG_1_2_EMU select ARCH_SUPPORTS_ATOMIC_RMW if ARC_HAS_LLSC select ARCH_32BIT_OFF_T select BUILDTIME_TABLE_SORT diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 408aa58a2a5b..8fef4238d411 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -38,7 +38,7 @@ config ARM select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7 - select ARCH_NEED_CMPXCHG_1_EMU if CPU_V6 + select ARCH_NEED_CMPXCHG_1_2_EMU if CPU_V6 select ARCH_SUPPORTS_ATOMIC_RMW select ARCH_SUPPORTS_CFI select ARCH_SUPPORTS_HUGETLBFS if ARM_LPAE diff --git a/arch/csky/Kconfig b/arch/csky/Kconfig index 4331313a42ff..5f26e8615d7d 100644 --- a/arch/csky/Kconfig +++ b/arch/csky/Kconfig @@ -37,7 +37,7 @@ config CSKY select ARCH_INLINE_SPIN_UNLOCK_BH if !PREEMPTION select ARCH_INLINE_SPIN_UNLOCK_IRQ if !PREEMPTION select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION - select ARCH_NEED_CMPXCHG_1_EMU + select ARCH_NEED_CMPXCHG_1_2_EMU select ARCH_WANT_FRAME_POINTERS if !CPU_CK610 && $(cc-option,-mbacktrace) select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT select COMMON_CLK diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index d60f1d5a94c0..09e556fced01 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -14,7 +14,7 @@ config SUPERH select ARCH_HIBERNATION_POSSIBLE if MMU select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_WANT_IPC_PARSE_VERSION - select ARCH_NEED_CMPXCHG_1_EMU + select ARCH_NEED_CMPXCHG_1_2_EMU select CPU_NO_EFFICIENT_FFS select DMA_DECLARE_COHERENT select GENERIC_ATOMIC64 diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index f2f9cd9cde50..62019fd444d4 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -14,7 +14,7 @@ config XTENSA select ARCH_HAS_DMA_SET_UNCACHED if MMU select ARCH_HAS_STRNCPY_FROM_USER if !KASAN select ARCH_HAS_STRNLEN_USER - select ARCH_NEED_CMPXCHG_1_EMU + select ARCH_NEED_CMPXCHG_1_2_EMU select ARCH_USE_MEMTEST select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS diff --git a/include/linux/cmpxchg-emu.h b/include/linux/cmpxchg-emu.h index 998deec67740..fee8171fa05e 100644 --- a/include/linux/cmpxchg-emu.h +++ b/include/linux/cmpxchg-emu.h @@ -11,5 +11,6 @@ #define __LINUX_CMPXCHG_EMU_H =20 uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new); +uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new); =20 #endif /* __LINUX_CMPXCHG_EMU_H */ diff --git a/lib/Makefile b/lib/Makefile index 43421c39d21b..d0e69312176a 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -202,7 +202,7 @@ obj-$(CONFIG_CODE_TAGGING) +=3D codetag.o lib-$(CONFIG_GENERIC_BUG) +=3D bug.o =20 obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) +=3D syscall.o -obj-$(CONFIG_ARCH_NEED_CMPXCHG_1_EMU) +=3D cmpxchg-emu.o +obj-$(CONFIG_ARCH_NEED_CMPXCHG_1_2_EMU) +=3D cmpxchg-emu.o =20 obj-$(CONFIG_DYNAMIC_DEBUG_CORE) +=3D dynamic_debug.o #ensure exported functions have prototypes diff --git a/lib/cmpxchg-emu.c b/lib/cmpxchg-emu.c index 27f6f97cb60d..991a5969f471 100644 --- a/lib/cmpxchg-emu.c +++ b/lib/cmpxchg-emu.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * Emulated 1-byte cmpxchg operation for architectures lacking direct - * support for this size. This is implemented in terms of 4-byte cmpxchg - * operations. + * Emulated 1-byte and 2-byte cmpxchg operations for architectures lacking + * direct support for these sizes. These are implemented in terms of + * 4-byte cmpxchg operations. * * Copyright (C) 2024 Paul E. McKenney. */ @@ -43,3 +43,32 @@ uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, = uintptr_t new) return old; } EXPORT_SYMBOL_GPL(cmpxchg_emu_u8); + +union u16_32 { + u16 h[2]; + u32 w; +}; + +/* Emulate two-byte cmpxchg() in terms of 4-byte cmpxchg. */ +uintptr_t cmpxchg_emu_u16(volatile u16 *p, uintptr_t old, uintptr_t new) +{ + u32 *p32 =3D (u32 *)(((uintptr_t)p) & ~0x3); + int i =3D (((uintptr_t)p) & 0x2) / 2; + union u16_32 old32; + union u16_32 new32; + u32 ret; + + WARN_ON_ONCE(((uintptr_t)p) & 0x1); + ret =3D READ_ONCE(*p32); + do { + old32.w =3D ret; + if (old32.h[i] !=3D old) + return old32.h[i]; + new32.w =3D old32.w; + new32.h[i] =3D new; + instrument_atomic_read_write(p, 2); + ret =3D data_race(cmpxchg(p32, old32.w, new32.w)); // Overridden above. + } while (ret !=3D old32.w); + return old; +} +EXPORT_SYMBOL_GPL(cmpxchg_emu_u16); --=20 2.47.3 From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 27F704CCDF0; Fri, 11 Sep 2026 19:28:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154905; cv=none; b=omRfBEo+j/iC573mY5TTvlgQllKEGrVKtXVS0Z3DB2VbE69TLUkSuWHoXVCaZrzJA+WfyzUydjkSv+ipuDLkVwe5ajvqwdTkbKyzFG9xCP2FhH/c/DxhfQpG9czTCDTdc9uquLwl6lcl4aASLPBuZKhGPrIeOq/IWMdCfV2CJ8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154905; c=relaxed/simple; bh=C/hHoeoyZgl/552acrQr1Xi0twY+CEaGiAmnrc7FhVE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qAjF8vjXyHr6cvoZ60hMR/QqLTHdC2z0bt8N455lM0Q9aeqdnFD5fDs8FJK+47HwxGZwN/RRrA1SazQHGbYqLOmTskVg/up2C47Znj1n/R0Qo7YTF1o9Gf/l6KoRPH6hQjUNE8gpww4pxIoDTEmDF66xrxlmfzLkIjRB0WMMx5s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 2/6] ARC: Emulate two-byte cmpxchg Date: Fri, 11 Sep 2026 19:25:35 +0000 Message-ID: <20260911192540.20983-3-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" arc has no byte or halfword atomic memory operations, so the LLSC arch_cmpxchg_relaxed() switch routes case 1 through cmpxchg_emu_u8() and leaves case 2 to fall into the BUILD_BUG() default. Route case 2 through the new cmpxchg_emu_u16() instead. The !CONFIG_ARC_HAS_LLSC arch_cmpxchg() already handles any size, reading and writing through the typed pointer under the atomic_ops lock, so it needs no change. Signed-off-by: Bradley Morgan --- arch/arc/include/asm/cmpxchg.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arc/include/asm/cmpxchg.h b/arch/arc/include/asm/cmpxchg.h index 76f43db0890f..9b48b8fe0db2 100644 --- a/arch/arc/include/asm/cmpxchg.h +++ b/arch/arc/include/asm/cmpxchg.h @@ -50,6 +50,9 @@ case 1: \ _prev_ =3D (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *__force)_p_,= (uintptr_t)_o_, (uintptr_t)_n_); \ break; \ + case 2: \ + _prev_ =3D (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *__force)_p= _, (uintptr_t)_o_, (uintptr_t)_n_); \ + break; \ case 4: \ _prev_ =3D __cmpxchg(_p_, _o_, _n_); \ break; \ --=20 2.47.3 From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0EF6D4AEBFC; Fri, 11 Sep 2026 19:25:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154765; cv=none; b=EQlV/ribFzz8xqi4vyZeJiMlHX3un5s9UrWcQCaO0w9pBVvifGwR/N+8ocQMNaXOQsLemPEsWKWP10w3qQvlCpy0Jx+VkXXPBhdmUQ6Ojz8S9rZgGorxTf9S3r1W4jIWjo1+Cxg8SIqnLE1yfQnxQ3KwwkD63t/WxJAMZdXyZWQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154765; c=relaxed/simple; bh=uVPs5A6Qu+KvY+G1L8EbmXnj9uwps/4rGlJ1l/f41oM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=chGY9CwkWmT+PlyvmCYR2yqQhRC+UOxIdLT0aNSPA59h/meP2+SdOUELpWhSS5zK4cgrCCe6eaa/6gG9gqzoOHDTrxRsA96oa3jwuMEzIefEm7308lNZdoB7IyBOaj1SVWTi/bquvWGPYeimzC+p8kERQ740bvnb1lNJSliSoPk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 3/6] ARM: Emulate two-byte cmpxchg on ARMv6 Date: Fri, 11 Sep 2026 19:25:36 +0000 Message-ID: <20260911192540.20983-4-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ARMv6 without the ARMv6K extensions, selected as CONFIG_CPU_V6, has no ldrexh/strexh, so the __cmpxchg() switch only provides case 1 through cmpxchg_emu_u8() and lets case 2 fall through to __bad_cmpxchg(). Route case 2 through cmpxchg_emu_u16() so that two-byte cmpxchg() works on these cores too. ARMv6K and later already have native case 2 in the #else branch, and __cmpxchg_local() already covers sizes 1 and 2 for ARMv6 via __generic_cmpxchg_local(), so neither is touched. Signed-off-by: Bradley Morgan --- arch/arm/include/asm/cmpxchg.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h index 9beb64d30586..6c0e2f21456b 100644 --- a/arch/arm/include/asm/cmpxchg.h +++ b/arch/arm/include/asm/cmpxchg.h @@ -167,6 +167,9 @@ static inline unsigned long __cmpxchg(volatile void *pt= r, unsigned long old, case 1: oldval =3D cmpxchg_emu_u8((volatile u8 *)ptr, old, new); break; + case 2: + oldval =3D cmpxchg_emu_u16((volatile u16 *)ptr, old, new); + break; #else /* min ARCH > ARMv6 */ case 1: do { --=20 2.47.3 From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D26C94DBD63; Fri, 11 Sep 2026 19:28:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154896; cv=none; b=C2u3G6limLeA7JGDZc+spSR3vi2RnAdQmbCHB8Rn3w/D9hlOf/eTail+rrQUGvbXgoS8wXP6eyJ792IsSILvkU7XlDn35nIhbnem/kzr6xZoP2xATAjsUxXbd2ZH1vdCQcfj/pdJxhs85HsGC3K/0KSKA5NursXU4mxlpRF51js= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154896; c=relaxed/simple; bh=OMMhULdKWAQNm6guNaaFEO5E2d3Y+6kb+rF6qcJf/JE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mplQ0Z4xyJdLgB+b4q6Yhuj8BKLGJXrGR/7h/JAhIJh+sjGBuasqf+cOLlIcSwQpHo0DpePL7s/4xbW3D1+aMN0F4vEWuDSyQswMlKywpaCvkW71IVKxgFmW5uSlcLE66GeKqN1XjByIbYeZA5V/QuySnbdRlnIVeE84dExPGg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 4/6] csky: Emulate two-byte cmpxchg Date: Fri, 11 Sep 2026 19:25:37 +0000 Message-ID: <20260911192540.20983-5-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" csky has no byte or halfword atomic memory operations, so the __cmpxchg_relaxed(), __cmpxchg_acquire() and __cmpxchg() switches each route case 1 through cmpxchg_emu_u8() and leave case 2 to fall into the BUILD_BUG() default. Route case 2 in all three through the new cmpxchg_emu_u16(). arch_cmpxchg_local() maps to __cmpxchg_relaxed() and so picks up case 2 automatically. Signed-off-by: Bradley Morgan --- arch/csky/include/asm/cmpxchg.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/csky/include/asm/cmpxchg.h b/arch/csky/include/asm/cmpxch= g.h index db6dda47184e..a6a4805064a4 100644 --- a/arch/csky/include/asm/cmpxchg.h +++ b/arch/csky/include/asm/cmpxchg.h @@ -65,6 +65,9 @@ case 1: \ __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uint= ptr_t)__old, (uintptr_t)__new); \ break; \ + case 2: \ + __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (ui= ntptr_t)__old, (uintptr_t)__new); \ + break; \ case 4: \ asm volatile ( \ "1: ldex.w %0, (%3) \n" \ @@ -98,6 +101,9 @@ case 1: \ __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uint= ptr_t)__old, (uintptr_t)__new); \ break; \ + case 2: \ + __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (ui= ntptr_t)__old, (uintptr_t)__new); \ + break; \ case 4: \ asm volatile ( \ "1: ldex.w %0, (%3) \n" \ @@ -132,6 +138,9 @@ case 1: \ __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u8((volatile u8 *)__ptr, (uint= ptr_t)__old, (uintptr_t)__new); \ break; \ + case 2: \ + __ret =3D (__typeof__(*(ptr)))cmpxchg_emu_u16((volatile u16 *)__ptr, (ui= ntptr_t)__old, (uintptr_t)__new); \ + break; \ case 4: \ asm volatile ( \ RELEASE_FENCE \ --=20 2.47.3 From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B704E511E8C; Fri, 11 Sep 2026 19:28:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154909; cv=none; b=NvZ6UAQjAuG7wW3pqUSKISxp8FgKfdmGD5KOJyN8TO2JMXDqtHWHQWhy/XzU4aLx9fAbkgij6lGIgO0cmyvwN/TkUu+YzIQ2W9+MsGs18HadonPrStELnxPtswy8E+ivZ8qnVY78eWC4PU30ht+ojYj/WbPMUWeYr34JFBWDGn8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154909; c=relaxed/simple; bh=hFNZfjG7awykZCdqNUHs3x/U/7ivwWB0Evtzikm7ItA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ly6ZI2qNy2NkNU1B9pq64v656uyzia0yMYRr3BkPbZG8DoWslnkia23kksrFo394542kKyaV/tta3E86DeByeMl01P5lWmNLi5EmjmKuUGZW9IdkI0UTA6jN/BYL4bvpmWYRqELIOJl53boA2uANnQfb9tJDIvYyUyCuxWn5w3Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 5/6] sh: Emulate two-byte cmpxchg Date: Fri, 11 Sep 2026 19:25:38 +0000 Message-ID: <20260911192540.20983-6-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" SH has no byte or halfword atomic memory operations, so the __cmpxchg() switch routes case 1 through cmpxchg_emu_u8() and lets case 2 fall through to __cmpxchg_called_with_bad_pointer(), which is declared but never defined, so a two-byte cmpxchg() fails at link time. Route case 2 through the new cmpxchg_emu_u16(). Signed-off-by: Bradley Morgan Acked-by: John Paul Adrian Glaubitz --- arch/sh/include/asm/cmpxchg.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/sh/include/asm/cmpxchg.h b/arch/sh/include/asm/cmpxchg.h index 1e5dc5ccf7bf..477d3025a441 100644 --- a/arch/sh/include/asm/cmpxchg.h +++ b/arch/sh/include/asm/cmpxchg.h @@ -59,6 +59,8 @@ static inline unsigned long __cmpxchg(volatile void * ptr= , unsigned long old, switch (size) { case 1: return cmpxchg_emu_u8(ptr, old, new); + case 2: + return cmpxchg_emu_u16(ptr, old, new); case 4: return __cmpxchg_u32(ptr, old, new); } --=20 2.47.3 From nobody Fri Sep 25 13:54:12 2026 Received: from mail.mainlining.org (mail.mainlining.org [5.75.144.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5C264078E1; Fri, 11 Sep 2026 19:25:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=5.75.144.95 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154765; cv=none; b=F5ap54l68Vb76PgeIwqjPB3n+6O599Dh5/eMBw+I7USS0rnw5CjDh0gC0oFZUHXuEoHmA/tuQwTx7xO4e7pAIFen8x7WGdiKmoBtMJ5Te/XgDd4ZGpcMLQOILJ2skGV5UeDrT+Nu2dyhZa9m3Xbxt/upxAPOX803XbnJWawFl/U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789154765; c=relaxed/simple; bh=GB1GwFjqXeqizek/00dnvDkz0F+QNMMfI6yJw319v/I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k/bOtHdbnSqpAEywLHkIvfIn1yI09t+t+hottSwFoyGZXQ4GJLg3mnAHISyr4JGSHkpV6nNhWPxROw/5BY/ZB1wJ5K8CglLe7QCdVaZnxGIH7tdcAkbC7pMn6z3jNmrPtF3N56+lSuHseJB9VDw9DtDMZ333gz+70T5HOE2dKxU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.helo=mail.mainlining.org; arc=none smtp.client-ip=5.75.144.95 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.helo=mail.mainlining.org From: Bradley Morgan To: "Paul E. McKenney" Cc: frederic@kernel.org, neeraj.upadhyay@kernel.org, boqun@kernel.org, joelagnelf@nvidia.com, rcu@vger.kernel.org, "Andrew Morton" , "Arnd Bergmann" , linux-arch@vger.kernel.org, "Vineet Gupta" , linux-snps-arc@lists.infradead.org, "Russell King" , linux-arm-kernel@lists.infradead.org, "Guo Ren" , linux-csky@vger.kernel.org, "Yoshinori Sato" , "Rich Felker" , "John Paul Adrian Glaubitz" , linux-sh@vger.kernel.org, "Chris Zankel" , "Max Filippov" , linux-kernel@vger.kernel.org, brads@mainlining.org Subject: [PATCH 6/6] xtensa: Emulate two-byte cmpxchg Date: Fri, 11 Sep 2026 19:25:39 +0000 Message-ID: <20260911192540.20983-7-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260911192540.20983-1-brads@mainlining.org> References: <20260911192540.20983-1-brads@mainlining.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Xtensa has no byte or halfword atomic memory operations, so the __cmpxchg() switch routes case 1 through cmpxchg_emu_u8() and lets case 2 hit the default, __cmpxchg_called_with_bad_pointer(), which is declared but never defined, so a two-byte cmpxchg() fails at link time. Route case 2 through the new cmpxchg_emu_u16(). Signed-off-by: Bradley Morgan --- arch/xtensa/include/asm/cmpxchg.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/xtensa/include/asm/cmpxchg.h b/arch/xtensa/include/asm/cm= pxchg.h index b6db4838b175..8dea8e357fc0 100644 --- a/arch/xtensa/include/asm/cmpxchg.h +++ b/arch/xtensa/include/asm/cmpxchg.h @@ -76,6 +76,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned= long new, int size) { switch (size) { case 1: return cmpxchg_emu_u8(ptr, old, new); + case 2: return cmpxchg_emu_u16(ptr, old, new); case 4: return __cmpxchg_u32(ptr, old, new); default: __cmpxchg_called_with_bad_pointer(); return old; --=20 2.47.3