From nobody Fri Sep 25 04:06:55 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 507D1446073; Wed, 16 Sep 2026 20:04:37 +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=1789589092; cv=none; b=mJLmLcyoRDy5xL8EKzp6V1f7wIIlg9KkFwA7OnKrATJBSUoSZNB48sWuZjmNsqAi8v52yD6Q83myM/rvhupyxzjAzZr3Wqy1GjvjEtu0PTuNXTklSPEAs8KVaqJIjIIS0dYedZoiuJdS7toChBdXk2IK8KFSnURFQMgxNljir4k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789589092; c=relaxed/simple; bh=60OFsAWwceQfE3GiQJaGCk5v2RMJPvpB7xJbyXshBFg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oL5dNkcL46ybOsuGOKS6RrOxEo6BIA8H0lpgN/scee2Q0LtEJsx9a4ADsyO5+IfUkCKC+kftd++FMpESviGffnT7py9AsgABUJpu/PTLdQordDFFilaJn6GGIcIZkNC/O1DMgSQCS+RUuN+65X36E99Z/riorZO1pYu0DJ1BaHs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.mailfrom=mainlining.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=OglgXxwN; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=3oP70KKq; 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.mailfrom=mainlining.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="OglgXxwN"; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="3oP70KKq" DKIM-Signature: v=1; a=rsa-sha256; s=202507r; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588934; bh=YdfWjjl2SW0u79R196mv/iW SIArJ4tc4nELY3Mnsg6A=; b=OglgXxwN8v6OTh9Ul4YHtTeIl5858inMQXWQR00+JPjOXA+kzP eqENtepxx/5ysdQlh6wlyXbe1MoOmR6tuPPjY+rqinKUBKwAZOxb8r8d96btJd/dDV+OGYrPZg1 7OBUeLPgBoVdTXZKiNRRPZt3LL1KkY84QEmN1NWVmHghECOL573XClgwP6ofiUReiUOiXdsgqmj WQopGD/ZLeh+QJvcO9DveAqKy1OCy/PmY2qskr93YPlg0b89AvB5bHwMTTHPOOO4BvF0sZN8FJH EhFW9XO3/ZaOCSm3Y9EP5LtyuJkIcpAm97LEp6XP/JNhFUz3qYCQl1iVMxCdFayGxhA==; DKIM-Signature: v=1; a=ed25519-sha256; s=202507e; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588934; bh=YdfWjjl2SW0u79R196mv/iW SIArJ4tc4nELY3Mnsg6A=; b=3oP70KKqww+lE0u1kcyQVinzVnSjhaZtRV5RX37JaZdprFv6TS XtcoaOFrLpf22Qam1yEZcDXRWAym96dRjeAQ==; From: Bradley Morgan To: Andrew Morton , Vineet Gupta , Guo Ren , Yoshinori Sato , Rich Felker , Chris Zankel , Max Filippov Cc: Arnd Bergmann , "Paul E . McKenney" , David Laight , John Paul Adrian Glaubitz , linux-snps-arc@lists.infradead.org, linux-csky@vger.kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, Bradley Morgan Subject: [PATCH v2 1/5] lib: Add two-byte cmpxchg emulation function Date: Wed, 16 Sep 2026 20:02:11 +0000 Message-ID: <20260916200215.21774-2-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260916200215.21774-1-brads@mainlining.org> References: <20260916200215.21774-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. Unlike cmpxchg_emu_u8() it takes and returns the natural u16 type instead of uintptr_t, per the suggestion from David Laight. The macros and inline wrappers at the call sites pass their old and new values through (uintptr_t) casts today, so with u16 parameters the narrowing happens at the function boundary and the function compares and returns exactly the 16 bits the caller asked for, which matches the hardware cmpxchg r16 behaviour where a 16-bit compare only looks at the low 16 bits of the register. 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 Suggested-by: David Laight Signed-off-by: Bradley Morgan --- arch/Kconfig | 2 +- arch/arc/Kconfig | 2 +- arch/csky/Kconfig | 2 +- arch/sh/Kconfig | 2 +- arch/xtensa/Kconfig | 2 +- include/linux/cmpxchg-emu.h | 4 +++- lib/Makefile | 2 +- lib/cmpxchg-emu.c | 38 +++++++++++++++++++++++++++++++++---- 8 files changed, 43 insertions(+), 11 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/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..d7eb96a15f85 100644 --- a/include/linux/cmpxchg-emu.h +++ b/include/linux/cmpxchg-emu.h @@ -4,12 +4,14 @@ * lacking direct support for these sizes. These are implemented in terms * of 4-byte cmpxchg operations. * - * Copyright (C) 2024 Paul E. McKenney. + * Copyright (C) 2024 Paul E. McKenney + * Copyright (C) 2026 Bradley Morgan */ =20 #ifndef __LINUX_CMPXCHG_EMU_H #define __LINUX_CMPXCHG_EMU_H =20 uintptr_t cmpxchg_emu_u8(volatile u8 *p, uintptr_t old, uintptr_t new); +u16 cmpxchg_emu_u16(volatile u16 *p, u16 old, u16 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..6586f1a88178 100644 --- a/lib/cmpxchg-emu.c +++ b/lib/cmpxchg-emu.c @@ -1,10 +1,11 @@ // 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. + * Copyright (C) 2024 Paul E. McKenney + * Copyright (C) 2026 Bradley Morgan */ =20 #include @@ -43,3 +44,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. */ +u16 cmpxchg_emu_u16(volatile u16 *p, u16 old, u16 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 04:06:55 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 684EC3EF65B; Wed, 16 Sep 2026 20:04:45 +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=1789589109; cv=none; b=r6DGTImJEFBy+QOCiM0lAYCSU6CbIyN0c3dQnUyiEjPwEEAGcp19SXLmh1srpGklqTTWj/UO7jscIa9CgGn504mwEmXuezUeU4Qqtb5EIVposswgdr0wzjxTKyjLnB5V0hZ7RWotsqfc0u8g5mOeBi3AC64Bb9+aamg3+HdNYZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789589109; c=relaxed/simple; bh=1ff5/nczEYO3kkyeg21AsMw/jo427+wb5UJ/kpXO3vM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kZ9m4dC93cp3g/gYH5ZdZZou6qaWKfaLDSCtOAPmqR2+dtGPfuxlPRnjhCt7gQe9dzJCEMrfLkEtifC5Uea87KIQKYrz/P6SUtemK+xdFbs/Q73vKYM9Qi6hcYF8pkXCdbZvrcTGsUQs49yxfnmoSRsUXKlSWfM3jP5f47/U0+U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.mailfrom=mainlining.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=dHD1HWO+; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=uI3PUxmR; 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.mailfrom=mainlining.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="dHD1HWO+"; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="uI3PUxmR" DKIM-Signature: v=1; a=rsa-sha256; s=202507r; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588935; bh=1OXxOnbJI64tKjJBlcCcfNg /vmHmtRmMcXj4ssSqyI8=; b=dHD1HWO+3ETnfnxub467tSSinQ6AbN2y51X23r7Bht5gWglVMM Nlok2iptk4U04M82fZ8leUzk+ihL0NaLL0vHYPP724yQVZpGa0nhB+gU/iFlpfsKkxixDusu7lr jNrcKoYFAtqETzQbBh+8faNx0fAIDAJzXgmjmFL/7O9pwJcm2qkOczsS+Y1C2rAGPhsY749WDAS 7QD6arsF02kSpsoXWAicZSTfVh/szo1ff2QIaozy+ivpS0WkK+HyoA64/bjnUA+WbHr4pf5zlmV ZEWf44Kg6LsJGRcm1aQhpiX9vRdMJUTsYyIhtKwB1iy5zZnB74NPLci+wPUR09zctmA==; DKIM-Signature: v=1; a=ed25519-sha256; s=202507e; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588935; bh=1OXxOnbJI64tKjJBlcCcfNg /vmHmtRmMcXj4ssSqyI8=; b=uI3PUxmRuoMkYc14i+UHDku63fW62n8nkas/svUZhCU0d/DWk0 TsjJew1QWX6XuXf9vkWZTCLMrkejqMK85fDg==; From: Bradley Morgan To: Andrew Morton , Vineet Gupta , Guo Ren , Yoshinori Sato , Rich Felker , Chris Zankel , Max Filippov Cc: Arnd Bergmann , "Paul E . McKenney" , David Laight , John Paul Adrian Glaubitz , linux-snps-arc@lists.infradead.org, linux-csky@vger.kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, Bradley Morgan Subject: [PATCH v2 2/5] ARC: Emulate two-byte cmpxchg Date: Wed, 16 Sep 2026 20:02:12 +0000 Message-ID: <20260916200215.21774-3-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260916200215.21774-1-brads@mainlining.org> References: <20260916200215.21774-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 two-byte atomic compare and swap, so the __cmpxchg() macro switch lets case 2 fall through to BUILD_BUG() via default. Route case 2 through the new cmpxchg_emu_u16(), which now takes natural u16 arguments, so the (uintptr_t) casts on _o_ and _n_ become (u16) casts. 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..4451c2011ee3 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= _, (u16)_o_, (u16)_n_); \ + break; \ case 4: \ _prev_ =3D __cmpxchg(_p_, _o_, _n_); \ break; \ --=20 2.47.3 From nobody Fri Sep 25 04:06:55 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 5541C44CF59; Wed, 16 Sep 2026 20:02:27 +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=1789588958; cv=none; b=MBCv4d0vncM5kk6pRUfFpifmTVutxbeBd42nIkYX8X4HlkUYyDfWPeKJVnZNFy0akYBEOiimsbb3U2DpQGEdyjeXfz4cwNkNPBvvM1i61MLCYon5bKfERwcQi/7r4wgbrjGReFj5JQTwkzd2ga3pEvXH3ZcaNgGP41TaF3YighE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789588958; c=relaxed/simple; bh=jx0Zx1g4wNsvY8q0Db6cnJp5c6jT78Iv5NaDUTXeIq4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CLeHv+MkRzV9abjB0dCaTeHLMTEEjvFarnMym8FYn0Sq+8zv+VPd84TSx875pQA/Xk8nNXoyZctanaW003g0fsMI88dHKhYYNlTuLjLjEKaJiS4KNke+JhbRaB/msMEv/1jVA0doQOzuZ4KIu7eGtiASzPc9HXVGkrnGD+K1jM0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.mailfrom=mainlining.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=J5uzYWVo; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=pUfIpFDU; 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.mailfrom=mainlining.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="J5uzYWVo"; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="pUfIpFDU" DKIM-Signature: v=1; a=rsa-sha256; s=202507r; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588935; bh=bk9a2sZlBh+9sgTTR/422Om IP2fbvRL5lRZQb9brs4o=; b=J5uzYWVo7LQtFPeY6m2AI6v4sHFlb+ZTkoSDlXYPGYtHWFcLHm DsVac8sF15Uxj3D7omudGeiD4mbn67jPJLKLRXnWKGvuDXI6kyCzf2z94W632dIMhByXOJWvVVe AdZQ0GMEvykUA+EEb1ejhnufDic3Bw4gcHrGOp4gg8PD5wYDyK6QjzgdJVWDCwTaHmFurmtHuji u93yzz2WjlJxeiqZWBpvRtw8wVQndPZkzDw2pY/DRe1uLJyums6S8beOJsQcc8uk8kge+Y8jADC 8j4GbXqkbEzXenlEFJlwK9wsXH91mkTtTe9hQWkVD9/dPzoWM2WR5F7bilW7WrVw1tg==; DKIM-Signature: v=1; a=ed25519-sha256; s=202507e; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588935; bh=bk9a2sZlBh+9sgTTR/422Om IP2fbvRL5lRZQb9brs4o=; b=pUfIpFDUZhhLSGE5we0cUGPeAfTc0D/RPS5cHNQxuWnUR+4aWf hndgdIK7DT/YSNE0TLHEHVd4Mb4SNPlVDaAQ==; From: Bradley Morgan To: Andrew Morton , Vineet Gupta , Guo Ren , Yoshinori Sato , Rich Felker , Chris Zankel , Max Filippov Cc: Arnd Bergmann , "Paul E . McKenney" , David Laight , John Paul Adrian Glaubitz , linux-snps-arc@lists.infradead.org, linux-csky@vger.kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, Bradley Morgan Subject: [PATCH v2 3/5] csky: Emulate two-byte cmpxchg Date: Wed, 16 Sep 2026 20:02:13 +0000 Message-ID: <20260916200215.21774-4-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260916200215.21774-1-brads@mainlining.org> References: <20260916200215.21774-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 two-byte atomic compare and swap, so the __cmpxchg() switches in cmpxchg.h let case 2 fall through to the undefined __cmpxchg_called_with_bad_pointer(), failing at link time. Route case 2 through the new cmpxchg_emu_u16(), which now takes natural u16 arguments, so the (uintptr_t) casts on __old and __new become (u16) casts in all three switch instances. 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..e53628268e8c 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, (u1= 6)__old, (u16)__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, (u1= 6)__old, (u16)__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, (u1= 6)__old, (u16)__new); \ + break; \ case 4: \ asm volatile ( \ RELEASE_FENCE \ --=20 2.47.3 From nobody Fri Sep 25 04:06:55 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 E099343E4A2; Wed, 16 Sep 2026 20:02:34 +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=1789588968; cv=none; b=lpac5oVIwpVM9k4KvsgxgpnFo0erk8PYRnGqZ/agJpb10lnRByL/UhwDuP+gby02pFdtAn/Lcv1qBKftawGN9bLqNRz7kHvLv/OaNpn1xFTdZQ0PaDSkOA2XsBaMcVdOKJ1KWv51P5hquu5PMMQx0VC6DtbaG8PHmmRgmf2Eh2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789588968; c=relaxed/simple; bh=CnPQk5xHz0wKRKYP2fkyD+/dsIdYEO5cOQ4XeQu+MWo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=id4VXdAilOya2FDt6r6cGb5b2clLoGKvL7nLItLgNWUEJbCrOxm4We0S1EBexIiVZnC1eYkdfnoVWREb5DBQQMvUW3tZJkMi1AXfLUUFe3FQR0HFvoUeUfUXQsDDq+N/RwaqT7JYUhlRGGhnign6dA2RHSerFDlcf70pEMnddv4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.mailfrom=mainlining.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=l73A9EjS; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=c/LfVz7t; 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.mailfrom=mainlining.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="l73A9EjS"; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="c/LfVz7t" DKIM-Signature: v=1; a=rsa-sha256; s=202507r; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588936; bh=RgSuWwdEtSR5tNlSbUFwtN1 6+B/ED9O57B5SFsv+Sao=; b=l73A9EjSO6yR6WdliduzVn1CIfORqheLdIQdtdeLPAZWyxa11E 0EpQWuNSbKcVrw6PeoDKKdoWN+1GVE9Y3rUy61FOsYrMa6HlNwD5eFBP/TP3STbRo5rOM15u0fY eidU56394BfiA2yBlM5yUYZEVUwCri+GzP55lMhuMNqYZF23VD1XlvH+ZNUXSp/NAme1jN8dn/d WQ2vxtBU2pLRQkqx12FsrNhBILKg59O6X61+8Xr1psbu/fpKurkzCb+rJn0m03Gkgwvq+cPHdpZ sYpRIl7fzRzn6hw/P8r+DoiAg72kDqixBXDxYCFvYlf6IvbNFBDlunD7/F4ulbwfOWA==; DKIM-Signature: v=1; a=ed25519-sha256; s=202507e; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588936; bh=RgSuWwdEtSR5tNlSbUFwtN1 6+B/ED9O57B5SFsv+Sao=; b=c/LfVz7tNPTCmaPlbh3i+J7cFoigXYI7S5Rs8blqt5qqX61PKQ yrpQBKSCbiZBXokixP1nlTHs/FbUvzFV2UDQ==; From: Bradley Morgan To: Andrew Morton , Vineet Gupta , Guo Ren , Yoshinori Sato , Rich Felker , Chris Zankel , Max Filippov Cc: Arnd Bergmann , "Paul E . McKenney" , David Laight , John Paul Adrian Glaubitz , linux-snps-arc@lists.infradead.org, linux-csky@vger.kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, Bradley Morgan Subject: [PATCH v2 4/5] sh: Emulate two-byte cmpxchg Date: Wed, 16 Sep 2026 20:02:14 +0000 Message-ID: <20260916200215.21774-5-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260916200215.21774-1-brads@mainlining.org> References: <20260916200215.21774-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(), which takes natural u16 arguments, so the unsigned long old and new narrow at the function boundary. Acked-by: John Paul Adrian Glaubitz Signed-off-by: Bradley Morgan --- 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 04:06:55 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 3808344237B; Wed, 16 Sep 2026 20:04:41 +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=1789589096; cv=none; b=YptdlyaCQKKRG3rqLpKUNRipFt3pui1QqzaOwmY83kiSK9pQg6VwLvb2waSz9H7DeiZARODQMYDxIoznZUp0h05EsHIPrM/r1BN60QVCub5JtaBHQcCzCFlR8cyt6YedSPujmyP/TG5YhzjCy9epNdKPgsP+uLlNRZCpc6HDj9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789589096; c=relaxed/simple; bh=q8VUuAMu4loyahpVZ49szfxRv+8c4UDMw+jk/d97UGQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QBklRKvS3exBJ8HIqfe6MlSow0Aug1wW/85+MneBsp1/h87tne7zNB9oiGw7mcvWN5whRRcEgVbdzxPDAbnWo4NRXRIn3dnH12ymIAhUmP2j0+vHp5fN7Ogz59VbfFRe59SKt3tLL3z4iTcZx3gcDQL/6woyIBi2cvPC+AqOzvE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mainlining.org; spf=pass smtp.mailfrom=mainlining.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=QrcW/ZGs; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b=GUPIOwdm; 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.mailfrom=mainlining.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="QrcW/ZGs"; dkim=permerror (0-bit key) header.d=mainlining.org header.i=@mainlining.org header.b="GUPIOwdm" DKIM-Signature: v=1; a=rsa-sha256; s=202507r; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588936; bh=Cmoc+LvxrB8XTyAuxieF0n1 oKRJqDrHiKarYKzS8wOk=; b=QrcW/ZGsGc/8zHko7LRpzYzG2forpReCVNUoEO/bRUiepdOsvJ Vr1/YF1bZ3Bw296iaAHCQclAkdJYIUR6E02L/Nq8tZfvVx22f7rYSWrsMTbLU1cW0SCq8DSeYnN BVg5WtgXATQq/GpIUm611bYcR9qe+DJR5ZKoAs7PnYH1aR23/+8gPaqNZIrUr/UxGocpngHCThG 6HdW+Z51I7gGEhp+ZvlZ1zvFuicUibVeNY7bBLL5ZQc36Yj4a2dB1Cftd463cVKFVEOrAXDUAFN OOPI0h8Jmnqq22PWIuHK9IRam5z0qayaxb78HeVB4twBKIFxpaTu0fnjuLZrjs0ddrw==; DKIM-Signature: v=1; a=ed25519-sha256; s=202507e; d=mainlining.org; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1789588936; bh=Cmoc+LvxrB8XTyAuxieF0n1 oKRJqDrHiKarYKzS8wOk=; b=GUPIOwdm1MvUm482CkvGoF26O4/6Ajr0KBRTAKBF4cQt4KT7lo wqg+pzOKceAgkHmRUcBiSMNVP21Ag6YNpZDg==; From: Bradley Morgan To: Andrew Morton , Vineet Gupta , Guo Ren , Yoshinori Sato , Rich Felker , Chris Zankel , Max Filippov Cc: Arnd Bergmann , "Paul E . McKenney" , David Laight , John Paul Adrian Glaubitz , linux-snps-arc@lists.infradead.org, linux-csky@vger.kernel.org, linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org, Bradley Morgan Subject: [PATCH v2 5/5] xtensa: Emulate two-byte cmpxchg Date: Wed, 16 Sep 2026 20:02:15 +0000 Message-ID: <20260916200215.21774-6-brads@mainlining.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260916200215.21774-1-brads@mainlining.org> References: <20260916200215.21774-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 two-byte atomic compare and swap, so the __cmpxchg() switch 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(), which takes natural u16 arguments, so the unsigned long old and new narrow at the function boundary. Signed-off-by: Bradley Morgan Reviewed-by: Max Filippov --- 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