From patchwork Mon Aug 8 07:13:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guo Ren X-Patchwork-Id: 12938525 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 06A7CC25B0C for ; Mon, 8 Aug 2022 07:15:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=mulMLAnDiSSI529L62fKZsFSqQszk30iGU3vreJwsFQ=; b=2xP4fpjvNz5lon mxDbff6dE56yo1nE75D+l39UzwJNtmxo1MtUG41GsdVJo9/4EnOqdHg13cS2CmAelkrhxUXBt/A1V ZN2s/XJRUp+FQr5sd6hObnjZmJrHSPA2GocsKBEvhso8K3buuo9AliiPgKPkKTrOGFTSCvbu/ba5Z rtkfZcFdabAXgGkGvU3g1HSy63TChuJacPq7lzEen2N/bA9yuhHUdDVUjssJvC97ngvd6tHskYSAT EhRzEF6m5mNj27FZrRMAtN937vLOEaYiG54LTuEKEv3jawq7XA0cFexme10WEalgpznNtDmEWEfIz KF7bnvoVzgZ3cAXatuAg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oKwya-00C2hU-2v; Mon, 08 Aug 2022 07:15:00 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oKwyV-00C2bf-Q6 for linux-riscv@lists.infradead.org; Mon, 08 Aug 2022 07:14:57 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 7F36DB80A07; Mon, 8 Aug 2022 07:14:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB243C433D6; Mon, 8 Aug 2022 07:14:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1659942893; bh=m7BB6dE2TLg0BfE1G3bhADCM2Cpp+bpUD503eZJTSow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LFLyADkxN57udyvW/wSHNAj4DiqaQ2FY56CZ1wParcPOZHb/kjXXLdhhlK08AW+W2 HKxgDweL8jQvu0EUGxHdTQJxYflSB8E1Vz/mKRScGy5JXhkLkTbXjwbbMRnfxBMo3o TgPH/0bfzn8hdLwOnwcLLAtDRoFsizdejk5yz7NKLTHWdwHfViQN8fj3swkHzM/Zfr YgJvWX8dHlZVp1hU+bDhIZECL1tv1PiMLyeX1CjdQOQRZduy92a/j3k7UUccxer3my ywTCOtqmibJ5uKZSobJ/uCSzV/Wot6TqaVGAjb2MWe4PuG96L33SQcEXRZBfyFlTuF y9YmF8pdVFMQQ== From: guoren@kernel.org To: palmer@rivosinc.com, heiko@sntech.de, hch@infradead.org, arnd@arndb.de, peterz@infradead.org, will@kernel.org, boqun.feng@gmail.com, longman@redhat.com, shorne@gmail.com, conor.dooley@microchip.com Cc: linux-csky@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren , Guo Ren , Jonas Bonn , Stefan Kristiansson Subject: [PATCH V9 13/15] openrisc: cmpxchg: Cleanup unnecessary codes Date: Mon, 8 Aug 2022 03:13:16 -0400 Message-Id: <20220808071318.3335746-14-guoren@kernel.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220808071318.3335746-1-guoren@kernel.org> References: <20220808071318.3335746-1-guoren@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220808_001456_174253_BF569F10 X-CRM114-Status: GOOD ( 13.41 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org From: Guo Ren Remove cmpxchg_small and xchg_small, because it's unnecessary now, and they break the forward guarantee for atomic operations. Also Remove unnecessary __HAVE_ARCH_CMPXCHG. Signed-off-by: Guo Ren Signed-off-by: Guo Ren Cc: Stafford Horne Cc: Jonas Bonn Cc: Stefan Kristiansson --- arch/openrisc/include/asm/cmpxchg.h | 167 +++++++++------------------- 1 file changed, 50 insertions(+), 117 deletions(-) diff --git a/arch/openrisc/include/asm/cmpxchg.h b/arch/openrisc/include/asm/cmpxchg.h index 79fd16162ccb..df83b33b5882 100644 --- a/arch/openrisc/include/asm/cmpxchg.h +++ b/arch/openrisc/include/asm/cmpxchg.h @@ -20,10 +20,8 @@ #include #include -#define __HAVE_ARCH_CMPXCHG 1 - -static inline unsigned long cmpxchg_u32(volatile void *ptr, - unsigned long old, unsigned long new) +/* cmpxchg */ +static inline u32 cmpxchg32(volatile void *ptr, u32 old, u32 new) { __asm__ __volatile__( "1: l.lwa %0, 0(%1) \n" @@ -41,8 +39,33 @@ static inline unsigned long cmpxchg_u32(volatile void *ptr, return old; } -static inline unsigned long xchg_u32(volatile void *ptr, - unsigned long val) +#define __cmpxchg(ptr, old, new, size) \ +({ \ + __typeof__(ptr) __ptr = (ptr); \ + __typeof__(*(ptr)) __old = (old); \ + __typeof__(*(ptr)) __new = (new); \ + __typeof__(*(ptr)) __ret; \ + switch (size) { \ + case 4: \ + __ret = (__typeof__(*(ptr))) \ + cmpxchg32(__ptr, (u32)__old, (u32)__new); \ + break; \ + default: \ + BUILD_BUG(); \ + } \ + __ret; \ +}) + +#define arch_cmpxchg(ptr, o, n) \ +({ \ + __typeof__(*(ptr)) _o_ = (o); \ + __typeof__(*(ptr)) _n_ = (n); \ + (__typeof__(*(ptr))) __cmpxchg((ptr), \ + _o_, _n_, sizeof(*(ptr))); \ +}) + +/* xchg */ +static inline u32 xchg32(volatile void *ptr, u32 val) { __asm__ __volatile__( "1: l.lwa %0, 0(%1) \n" @@ -56,116 +79,26 @@ static inline unsigned long xchg_u32(volatile void *ptr, return val; } -static inline u32 cmpxchg_small(volatile void *ptr, u32 old, u32 new, - int size) -{ - int off = (unsigned long)ptr % sizeof(u32); - volatile u32 *p = ptr - off; -#ifdef __BIG_ENDIAN - int bitoff = (sizeof(u32) - size - off) * BITS_PER_BYTE; -#else - int bitoff = off * BITS_PER_BYTE; -#endif - u32 bitmask = ((0x1 << size * BITS_PER_BYTE) - 1) << bitoff; - u32 load32, old32, new32; - u32 ret; - - load32 = READ_ONCE(*p); - - while (true) { - ret = (load32 & bitmask) >> bitoff; - if (old != ret) - return ret; - - old32 = (load32 & ~bitmask) | (old << bitoff); - new32 = (load32 & ~bitmask) | (new << bitoff); - - /* Do 32 bit cmpxchg */ - load32 = cmpxchg_u32(p, old32, new32); - if (load32 == old32) - return old; - } -} - -/* xchg */ - -static inline u32 xchg_small(volatile void *ptr, u32 x, int size) -{ - int off = (unsigned long)ptr % sizeof(u32); - volatile u32 *p = ptr - off; -#ifdef __BIG_ENDIAN - int bitoff = (sizeof(u32) - size - off) * BITS_PER_BYTE; -#else - int bitoff = off * BITS_PER_BYTE; -#endif - u32 bitmask = ((0x1 << size * BITS_PER_BYTE) - 1) << bitoff; - u32 oldv, newv; - u32 ret; - - do { - oldv = READ_ONCE(*p); - ret = (oldv & bitmask) >> bitoff; - newv = (oldv & ~bitmask) | (x << bitoff); - } while (cmpxchg_u32(p, oldv, newv) != oldv); - - return ret; -} - -/* - * This function doesn't exist, so you'll get a linker error - * if something tries to do an invalid cmpxchg(). - */ -extern unsigned long __cmpxchg_called_with_bad_pointer(void) - __compiletime_error("Bad argument size for cmpxchg"); - -static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, - unsigned long new, int size) -{ - switch (size) { - case 1: - case 2: - return cmpxchg_small(ptr, old, new, size); - case 4: - return cmpxchg_u32(ptr, old, new); - default: - return __cmpxchg_called_with_bad_pointer(); - } -} - -#define arch_cmpxchg(ptr, o, n) \ - ({ \ - (__typeof__(*(ptr))) __cmpxchg((ptr), \ - (unsigned long)(o), \ - (unsigned long)(n), \ - sizeof(*(ptr))); \ - }) - -/* - * This function doesn't exist, so you'll get a linker error if - * something tries to do an invalidly-sized xchg(). - */ -extern unsigned long __xchg_called_with_bad_pointer(void) - __compiletime_error("Bad argument size for xchg"); - -static inline unsigned long __xchg(volatile void *ptr, unsigned long with, - int size) -{ - switch (size) { - case 1: - case 2: - return xchg_small(ptr, with, size); - case 4: - return xchg_u32(ptr, with); - default: - return __xchg_called_with_bad_pointer(); - } -} - -#define arch_xchg(ptr, with) \ - ({ \ - (__typeof__(*(ptr))) __xchg((ptr), \ - (unsigned long)(with), \ - sizeof(*(ptr))); \ - }) +#define __xchg(ptr, new, size) \ +({ \ + __typeof__(ptr) __ptr = (ptr); \ + __typeof__(new) __new = (new); \ + __typeof__(*(ptr)) __ret; \ + switch (size) { \ + case 4: \ + __ret = (__typeof__(*(ptr))) \ + xchg32(__ptr, (u32)__new); \ + break; \ + default: \ + BUILD_BUG(); \ + } \ + __ret; \ +}) + +#define arch_xchg(ptr, x) \ +({ \ + __typeof__(*(ptr)) _x_ = (x); \ + (__typeof__(*(ptr))) __xchg((ptr), _x_, sizeof(*(ptr))); \ +}) #endif /* __ASM_OPENRISC_CMPXCHG_H */