Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp317599pxv; Thu, 22 Jul 2021 00:22:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJznYBE92eYMq/Y7Ee94Ok/lRPUobrp5Tw6RAaUcEox/j9C/uOS8onl1iP6mS7Vd9R23hbFj X-Received: by 2002:a05:6602:164f:: with SMTP id y15mr16872560iow.200.1626938532790; Thu, 22 Jul 2021 00:22:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626938532; cv=none; d=google.com; s=arc-20160816; b=vu6QOGHWkDRqEXJi8ih1l4Aj66pbjOu57Su4MnLE2xUxYtTDBjhAWUpw7PA5b4eaCs +xgFY21FnSlFvkvUYIzgvT5mNwCqhbnfTCkdZMaHLUyDSVwDrd7btgR8LYfUCJlXfovj 1tGiqQvWTYqWHOVFcHwlsstXtOc2CkmiOs5MDbOZGtKzT2GRvYTB1JnCz30wV6v//NZ4 oNUN3GvlaLCp2MfYTHSBvMRo3EsvU/BwXPNVuSkM1ZFYyjU73GJqhQjjNTeRs6JK/JkR yq08fWJqT4vRlSgJ9ndsQ1Bx9vofNVjM9Ti1FpuQUtqttO7g3utpb3qfi7t4S1mrQGVI bsVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=tLFUlGMbAMX7RQ4HAnfk9BR/JId92NZautuPh7uZY4c=; b=MmlcR3Zbp3ny5oIuWtb/U63zDzbh7aljxbAHE5Q0yCv4fDNVuGMHHN58nwT/VibQ4z Zzp7bxRKhTMY2t3FOzgWhUmb4QazzTLA3EJj4SbjG6qSaXdnRcitVacraGCICJQbJc15 PUUA/rA6YyeSlhs1XBN0Be+Q3/afz2muwYtzCZCjfcmZhlMBaUhKKf11BqG7R+6dpoK2 0D86qbbdBh+x08Rqh8wDLCMEO8hBPJAkBM115Nd6oiImtXfL3LPvCYje7MvSGui7RSIu NtT2VBEWUEjga/qbxxguRLT/m4C9B4mVCVzhQJ3fXhOG2BiwXI4CWVgl2aK0OEqfnoCc uqEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=XTsAN9Xd; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q21si20721598jat.69.2021.07.22.00.22.01; Thu, 22 Jul 2021 00:22:12 -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; dkim=pass header.i=@google.com header.s=20161025 header.b=XTsAN9Xd; 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=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230048AbhGVGkm (ORCPT + 99 others); Thu, 22 Jul 2021 02:40:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229573AbhGVGkm (ORCPT ); Thu, 22 Jul 2021 02:40:42 -0400 Received: from mail-oi1-x233.google.com (mail-oi1-x233.google.com [IPv6:2607:f8b0:4864:20::233]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D87EC061575 for ; Thu, 22 Jul 2021 00:21:17 -0700 (PDT) Received: by mail-oi1-x233.google.com with SMTP id r80so5578133oie.13 for ; Thu, 22 Jul 2021 00:21:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=tLFUlGMbAMX7RQ4HAnfk9BR/JId92NZautuPh7uZY4c=; b=XTsAN9XdFIMQTHX7QVw1elS+XQUFKXgdqLgEBd9EMIF574oAN+nKr2DgWucmOGfNZC 8fwOUuO4LeGmY02aJ7bsOQXFapxqmf46VkihS4dWCcJzSSZZMs1cND6/dsz+t9rwc6Wd oK0bp82bEa+1fTv6c9NDnR+ZMwv0+HaPa03q8FR9zAke7158w2XHuDk96YOMtcbg3P3j vZUQlLEXf6tHAYvovw2rdWQc2D5zm1SawU+ECyOe+EZ3YZVpEWYqbdhwytX15rd1f+Zs xhqy0wNhen4/l1JmhgZWMl7qPX+eK4EUQucd1dCQVbKH0iCc5mYt7EygjUeBz5rLuoZT 2l7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=tLFUlGMbAMX7RQ4HAnfk9BR/JId92NZautuPh7uZY4c=; b=mDQW9bc6qdBc6Q0BqD2meT057jYZQyM9Sz0BgSOl0U6sue+oytHS/Yv1/BIVmA+80k DmCQEkIUfMLTHpALckV2OibrHnaZ5NEE2eBcLvZV7mPc0IAFZXGUTtQv7+yrTO9KquT0 cFwr6begdkUA8eUvk4+lz3rqK/Uidw4TmEzBfmwDw7z3+qAbZb0nyi93rz82bAxpq2wZ Pctm0klD7t6KxbGNUZX7Z5SEWHKCvp6jc6Q6fjtUaMP/HGpHSTW3GfNmpzPF7RWfwFvf rFjr7YUXWQWU1lIxm6xwbXcYKtMj+75ctR1evxyX0nAOcgfiN41//U2jUTNflinix1go NOOg== X-Gm-Message-State: AOAM532P9zuv8A2oC6LfsbCFi3tiINKKoY6AKGkBnF0/Q3PN44ORobYi dIdyGxLZRmDiq8lHboBqegoYjoyKMNBAgP2g5tvCng== X-Received: by 2002:aca:fd44:: with SMTP id b65mr27021265oii.172.1626938476525; Thu, 22 Jul 2021 00:21:16 -0700 (PDT) MIME-Version: 1.0 References: <20210721155813.17082-1-mark.rutland@arm.com> In-Reply-To: <20210721155813.17082-1-mark.rutland@arm.com> From: Marco Elver Date: Thu, 22 Jul 2021 09:21:04 +0200 Message-ID: Subject: Re: [PATCH] locking/atomic: simplify non-atomic wrappers To: Mark Rutland Cc: linux-kernel@vger.kernel.org, peterz@infradead.org Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 21 Jul 2021 at 17:58, Mark Rutland wrote: > > 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 Reviewed-by: Marco Elver Thank you! > --- > .../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 >