Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp11546pxv; Wed, 21 Jul 2021 14:04:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwNmsqzfEXGL+oJAzIgX77O2j53sSw4W9vL+oELzoABvijHhXlYfPpXel4QELrsBvlgoyY0 X-Received: by 2002:a02:cb92:: with SMTP id u18mr27159232jap.78.1626901373260; Wed, 21 Jul 2021 14:02:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626901373; cv=none; d=google.com; s=arc-20160816; b=iRIORtzqNruwlj5I/MlZqurOGNbXj5P6L688Ish2xQc4wtDh0D+ENhBfDjUGazTpJP EX4sfI2fCqTtH4pzQQyWrhdwtbVmSBhJHeWJJZPxdRw3d06FIBzPG8iMn8758h++unrS zbrkoRh8frS3TjEd2MiSGj3Y1JYsP5nNUJAeC2IGByU6zVAxg+C9naFPvyxt7YRE/RX4 AlejxoZYpW99FVD83LcCU3AsF2a9BiLQbGBqvcWu0M84D0N8GClBhfs4Y9EYdqhrVsn2 trYlnCxJtQzg4h2IWYuz0Xbtle+Mi2u7PXhCTjUt/14u01BJgCNh2d/NQFmvNr7EKQXQ infA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=SXBVyRoqExEFGmrpOL2zREh7CbIPDsOYAXs3Z9EmSog=; b=bFCbGt+vZ4TxY/px8r/Tdv/l9/lahNue+HekJ66qbiWfCwzMA/7+njC193mYNxxCZE QQwE4+MKJu45E6fAb3NgizGNm/pu2SRuVSpU0EZHJiwU+MRQaZ7DsoEZr/b9l6QlLrbM /O//pOl8yZc4pRi+tRYSCX826aLxUqLumFOTbLaDuGzZgYQrJJ6Ialdl4+bLARtAintn Tg0s4XyTGfcBG2Ww9GlHsBQXKodf3LBlVMWgZskFDRY9RuV2OjAmXfcm+E7ShJ1W6Grm rxhXUpjkvtPeB9HF4UukNBb7s6rrg1xBVQe/wfrD+pp2kYNxHN7XAdqtXZpyMFSMcFEV sEQg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s1si28827896jat.54.2021.07.21.14.02.40; Wed, 21 Jul 2021 14:02:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240106AbhGUPRr (ORCPT + 99 others); Wed, 21 Jul 2021 11:17:47 -0400 Received: from foss.arm.com ([217.140.110.172]:58352 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240098AbhGUPRr (ORCPT ); Wed, 21 Jul 2021 11:17:47 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 76C631FB; Wed, 21 Jul 2021 08:58:23 -0700 (PDT) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id BF42D3F73D; Wed, 21 Jul 2021 08:58:22 -0700 (PDT) From: Mark Rutland To: linux-kernel@vger.kernel.org, peterz@infradead.org Cc: elver@google.com, mark.rutland@arm.com Subject: [PATCH] locking/atomic: simplify non-atomic wrappers Date: Wed, 21 Jul 2021 16:58:13 +0100 Message-Id: <20210721155813.17082-1-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since the non-atomic arch_*() bitops use plain accesses, they are implicitly instrumnted by the compiler, and we work around this in the instrumented wrappers to avoid double instrumentation. It's simpler to avoid the wrappers entirely, and use the preprocessor to alias the arch_*() bitops to their regular versions, removing the need for checks in the instrumented wrappers. Signed-off-by: Mark Rutland Suggested-by: Marco Elver Cc: Peter Zijlstra --- .../asm-generic/bitops/instrumented-non-atomic.h | 21 +++++++-------------- include/asm-generic/bitops/non-atomic.h | 16 +++++++--------- 2 files changed, 14 insertions(+), 23 deletions(-) Hi Peter, Are you happy to take this atop your queue/locking/core branch? This was suggested by Marco in [1], and also sidesteps some particularly bad stack spills as in [2]. [1] https://lore.kernel.org/r/CANpmjNNVn4UxBCMg1ke9xaQNv52OMuQjr17GxUXojZKwiAFzzg@mail.gmail.com [2] https://lore.kernel.org/r/20210719100719.GB12806@C02TD0UTHF1T.local/ Thanks, Mark. diff --git a/include/asm-generic/bitops/instrumented-non-atomic.h b/include/asm-generic/bitops/instrumented-non-atomic.h index e6c1540965d6..37363d570b9b 100644 --- a/include/asm-generic/bitops/instrumented-non-atomic.h +++ b/include/asm-generic/bitops/instrumented-non-atomic.h @@ -24,8 +24,7 @@ */ static inline void __set_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___set_bit_uses_plain_access)) - instrument_write(addr + BIT_WORD(nr), sizeof(long)); + instrument_write(addr + BIT_WORD(nr), sizeof(long)); arch___set_bit(nr, addr); } @@ -40,8 +39,7 @@ static inline void __set_bit(long nr, volatile unsigned long *addr) */ static inline void __clear_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___clear_bit_uses_plain_access)) - instrument_write(addr + BIT_WORD(nr), sizeof(long)); + instrument_write(addr + BIT_WORD(nr), sizeof(long)); arch___clear_bit(nr, addr); } @@ -56,8 +54,7 @@ static inline void __clear_bit(long nr, volatile unsigned long *addr) */ static inline void __change_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___change_bit_uses_plain_access)) - instrument_write(addr + BIT_WORD(nr), sizeof(long)); + instrument_write(addr + BIT_WORD(nr), sizeof(long)); arch___change_bit(nr, addr); } @@ -95,8 +92,7 @@ static inline void __instrument_read_write_bitop(long nr, volatile unsigned long */ static inline bool __test_and_set_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___test_and_set_bit_uses_plain_access)) - __instrument_read_write_bitop(nr, addr); + __instrument_read_write_bitop(nr, addr); return arch___test_and_set_bit(nr, addr); } @@ -110,8 +106,7 @@ static inline bool __test_and_set_bit(long nr, volatile unsigned long *addr) */ static inline bool __test_and_clear_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___test_and_clear_bit_uses_plain_access)) - __instrument_read_write_bitop(nr, addr); + __instrument_read_write_bitop(nr, addr); return arch___test_and_clear_bit(nr, addr); } @@ -125,8 +120,7 @@ static inline bool __test_and_clear_bit(long nr, volatile unsigned long *addr) */ static inline bool __test_and_change_bit(long nr, volatile unsigned long *addr) { - if (!__is_defined(arch___test_and_change_bit_uses_plain_access)) - __instrument_read_write_bitop(nr, addr); + __instrument_read_write_bitop(nr, addr); return arch___test_and_change_bit(nr, addr); } @@ -137,8 +131,7 @@ static inline bool __test_and_change_bit(long nr, volatile unsigned long *addr) */ static inline bool test_bit(long nr, const volatile unsigned long *addr) { - if (!__is_defined(arch_test_bit_uses_plain_access)) - instrument_atomic_read(addr + BIT_WORD(nr), sizeof(long)); + instrument_atomic_read(addr + BIT_WORD(nr), sizeof(long)); return arch_test_bit(nr, addr); } diff --git a/include/asm-generic/bitops/non-atomic.h b/include/asm-generic/bitops/non-atomic.h index c8149cd52730..365377fb104b 100644 --- a/include/asm-generic/bitops/non-atomic.h +++ b/include/asm-generic/bitops/non-atomic.h @@ -21,7 +21,7 @@ arch___set_bit(int nr, volatile unsigned long *addr) *p |= mask; } -#define arch___set_bit_uses_plain_access +#define __set_bit arch___set_bit static __always_inline void arch___clear_bit(int nr, volatile unsigned long *addr) @@ -31,7 +31,7 @@ arch___clear_bit(int nr, volatile unsigned long *addr) *p &= ~mask; } -#define arch___clear_bit_uses_plain_access +#define __clear_bit arch___clear_bit /** * arch___change_bit - Toggle a bit in memory @@ -50,7 +50,7 @@ void arch___change_bit(int nr, volatile unsigned long *addr) *p ^= mask; } -#define arch___change_bit_uses_plain_access +#define __change_bit arch___change_bit /** * arch___test_and_set_bit - Set a bit and return its old value @@ -71,7 +71,7 @@ arch___test_and_set_bit(int nr, volatile unsigned long *addr) *p = old | mask; return (old & mask) != 0; } -#define arch___test_and_set_bit_uses_plain_access +#define __test_and_set_bit arch___test_and_set_bit /** * arch___test_and_clear_bit - Clear a bit and return its old value @@ -92,7 +92,7 @@ arch___test_and_clear_bit(int nr, volatile unsigned long *addr) *p = old & ~mask; return (old & mask) != 0; } -#define arch___test_and_clear_bit_uses_plain_access +#define __test_and_clear_bit arch___test_and_clear_bit /* WARNING: non atomic and it can be reordered! */ static __always_inline int @@ -105,7 +105,7 @@ arch___test_and_change_bit(int nr, volatile unsigned long *addr) *p = old ^ mask; return (old & mask) != 0; } -#define arch___test_and_change_bit_uses_plain_access +#define __test_and_change_bit arch___test_and_change_bit /** * arch_test_bit - Determine whether a bit is set @@ -117,8 +117,6 @@ arch_test_bit(int nr, const volatile unsigned long *addr) { return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); } -#define arch_test_bit_uses_plain_access - -#include +#define test_bit arch_test_bit #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */ -- 2.11.0