lkml.org 
[lkml]   [2022]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v3 4/7] bitops: define const_*() versions of the non-atomics
    On Fri, 17 Jun 2022 at 19:21, Alexander Lobakin
    <alexandr.lobakin@intel.com> wrote:
    >
    > Define const_*() variants of the non-atomic bitops to be used when
    > the input arguments are compile-time constants, so that the compiler
    > will be always able to resolve those to compile-time constants as
    > well. Those are mostly direct aliases for generic_*() with one
    > exception for const_test_bit(): the original one is declared
    > atomic-safe and thus doesn't discard the `volatile` qualifier, so
    > in order to let optimize code, define it separately disregarding
    > the qualifier.
    > Add them to the compile-time type checks as well just in case.
    >
    > Suggested-by: Marco Elver <elver@google.com>
    > Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>

    Reviewed-by: Marco Elver <elver@google.com>

    > ---
    > .../asm-generic/bitops/generic-non-atomic.h | 31 +++++++++++++++++++
    > include/linux/bitops.h | 1 +
    > 2 files changed, 32 insertions(+)
    >
    > diff --git a/include/asm-generic/bitops/generic-non-atomic.h b/include/asm-generic/bitops/generic-non-atomic.h
    > index b85b8a2ac239..3d5ebd24652b 100644
    > --- a/include/asm-generic/bitops/generic-non-atomic.h
    > +++ b/include/asm-generic/bitops/generic-non-atomic.h
    > @@ -127,4 +127,35 @@ generic_test_bit(unsigned long nr, const volatile unsigned long *addr)
    > return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
    > }
    >
    > +/*
    > + * const_*() definitions provide good compile-time optimizations when
    > + * the passed arguments can be resolved at compile time.
    > + */
    > +#define const___set_bit generic___set_bit
    > +#define const___clear_bit generic___clear_bit
    > +#define const___change_bit generic___change_bit
    > +#define const___test_and_set_bit generic___test_and_set_bit
    > +#define const___test_and_clear_bit generic___test_and_clear_bit
    > +#define const___test_and_change_bit generic___test_and_change_bit
    > +
    > +/**
    > + * const_test_bit - Determine whether a bit is set
    > + * @nr: bit number to test
    > + * @addr: Address to start counting from
    > + *
    > + * A version of generic_test_bit() which discards the `volatile` qualifier to
    > + * allow a compiler to optimize code harder. Non-atomic and to be called only
    > + * for testing compile-time constants, e.g. by the corresponding macros, not
    > + * directly from "regular" code.
    > + */
    > +static __always_inline bool
    > +const_test_bit(unsigned long nr, const volatile unsigned long *addr)
    > +{
    > + const unsigned long *p = (const unsigned long *)addr + BIT_WORD(nr);
    > + unsigned long mask = BIT_MASK(nr);
    > + unsigned long val = *p;
    > +
    > + return !!(val & mask);
    > +}
    > +
    > #endif /* __ASM_GENERIC_BITOPS_GENERIC_NON_ATOMIC_H */
    > diff --git a/include/linux/bitops.h b/include/linux/bitops.h
    > index 87087454a288..d393297287d5 100644
    > --- a/include/linux/bitops.h
    > +++ b/include/linux/bitops.h
    > @@ -37,6 +37,7 @@ extern unsigned long __sw_hweight64(__u64 w);
    > /* Check that the bitops prototypes are sane */
    > #define __check_bitop_pr(name) \
    > static_assert(__same_type(arch_##name, generic_##name) && \
    > + __same_type(const_##name, generic_##name) && \
    > __same_type(name, generic_##name))
    >
    > __check_bitop_pr(__set_bit);
    > --
    > 2.36.1
    >

    \
     
     \ /
      Last update: 2022-06-20 11:51    [W:4.083 / U:0.332 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site