Commit Graph

7 Commits

Author SHA1 Message Date
Waiman Long 99540cc176 atomics: Provide atomic_add_negative() variants
JIRA: https://issues.redhat.com/browse/RHEL-5228

commit e5ab9eff46b04c5a04778e40d7092fed3fda52ca
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu, 23 Mar 2023 21:55:30 +0100

    atomics: Provide atomic_add_negative() variants

    atomic_add_negative() does not provide the relaxed/acquire/release
    variants.

    Provide them in preparation for a new scalable reference count algorithm.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Mark Rutland <mark.rutland@arm.com>
    Link: https://lore.kernel.org/r/20230323102800.101763813@linutronix.de

Signed-off-by: Waiman Long <longman@redhat.com>
2023-09-22 13:21:49 -04:00
Waiman Long db81d84668 atomics: Fix atomic64_{read_acquire,set_release} fallbacks
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2076713

commit dc1b4df09acdca7a89806b28f235cd6d8dcd3d24
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Mon, 7 Feb 2022 10:19:43 +0000

    atomics: Fix atomic64_{read_acquire,set_release} fallbacks

    Arnd reports that on 32-bit architectures, the fallbacks for
    atomic64_read_acquire() and atomic64_set_release() are broken as they
    use smp_load_acquire() and smp_store_release() respectively, which do
    not work on types larger than the native word size.

    Since those contain compiletime_assert_atomic_type(), any attempt to use
    those fallbacks will result in a build-time error. e.g. with the
    following added to arch/arm/kernel/setup.c:

    | void test_atomic64(atomic64_t *v)
    | {
    |        atomic64_set_release(v, 5);
    |        atomic64_read_acquire(v);
    | }

    The compiler will complain as follows:

    | In file included from <command-line>:
    | In function 'arch_atomic64_set_release',
    |     inlined from 'test_atomic64' at ./include/linux/atomic/atomic-instrumented.h:669:2:
    | ././include/linux/compiler_types.h:346:38: error: call to '__compiletime_assert_9' declared with attribute error: Need native word sized stores/loads for atomicity.
    |   346 |  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
    |       |                                      ^
    | ././include/linux/compiler_types.h:327:4: note: in definition of macro '__compiletime_assert'
    |   327 |    prefix ## suffix();    \
    |       |    ^~~~~~
    | ././include/linux/compiler_types.h:346:2: note: in expansion of macro '_compiletime_assert'
    |   346 |  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
    |       |  ^~~~~~~~~~~~~~~~~~~
    | ././include/linux/compiler_types.h:349:2: note: in expansion of macro 'compiletime_assert'
    |   349 |  compiletime_assert(__native_word(t),    \
    |       |  ^~~~~~~~~~~~~~~~~~
    | ./include/asm-generic/barrier.h:133:2: note: in expansion of macro 'compiletime_assert_atomic_type'
    |   133 |  compiletime_assert_atomic_type(*p);    \
    |       |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    | ./include/asm-generic/barrier.h:164:55: note: in expansion of macro '__smp_store_release'
    |   164 | #define smp_store_release(p, v) do { kcsan_release(); __smp_store_release(p, v); } while (0)
    |       |                                                       ^~~~~~~~~~~~~~~~~~~
    | ./include/linux/atomic/atomic-arch-fallback.h:1270:2: note: in expansion of macro 'smp_store_release'
    |  1270 |  smp_store_release(&(v)->counter, i);
    |       |  ^~~~~~~~~~~~~~~~~
    | make[2]: *** [scripts/Makefile.build:288: arch/arm/kernel/setup.o] Error 1
    | make[1]: *** [scripts/Makefile.build:550: arch/arm/kernel] Error 2
    | make: *** [Makefile:1831: arch/arm] Error 2

    Fix this by only using smp_load_acquire() and smp_store_release() for
    native atomic types, and otherwise falling back to the regular barriers
    necessary for acquire/release semantics, as we do in the more generic
    acquire and release fallbacks.

    Since the fallback templates are used to generate the atomic64_*() and
    atomic_*() operations, the __native_word() check is added to both. For
    the atomic_*() operations, which are always 32-bit, the __native_word()
    check is redundant but not harmful, as it is always true.

    For the example above this works as expected on 32-bit, e.g. for arm
    multi_v7_defconfig:

    | <test_atomic64>:
    |         push    {r4, r5}
    |         dmb     ish
    |         pldw    [r0]
    |         mov     r2, #5
    |         mov     r3, #0
    |         ldrexd  r4, [r0]
    |         strexd  r4, r2, [r0]
    |         teq     r4, #0
    |         bne     484 <test_atomic64+0x14>
    |         ldrexd  r2, [r0]
    |         dmb     ish
    |         pop     {r4, r5}
    |         bx      lr

    ... and also on 64-bit, e.g. for arm64 defconfig:

    | <test_atomic64>:
    |         bti     c
    |         paciasp
    |         mov     x1, #0x5
    |         stlr    x1, [x0]
    |         ldar    x0, [x0]
    |         autiasp
    |         ret

    Reported-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
    Reviewed-by: Boqun Feng <boqun.feng@gmail.com>
    Link: https://lore.kernel.org/r/20220207101943.439825-1-mark.rutland@arm.com

Signed-off-by: Waiman Long <longman@redhat.com>
2022-05-12 08:34:06 -04:00
Waiman Long 364722ad11 locking/atomic: remove ARCH_ATOMIC remanants
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2022806

commit f3e615b4db1fb7034f1d76dc307b77cc848f040e
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Tue, 13 Jul 2021 11:52:50 +0100

    locking/atomic: remove ARCH_ATOMIC remanants

    Now that gen-atomic-fallback.sh is only used to generate the arch_*
    fallbacks, we don't need to also generate the non-arch_* forms, and can
    removethe infrastructure this needed.

    There is no change to any of the generated headers as a result of this
    patch.

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210713105253.7615-3-mark.rutland@arm.com

Signed-off-by: Waiman Long <longman@redhat.com>
2021-11-12 14:23:14 -05:00
Peter Zijlstra 37f8173dd8 locking/atomics: Flip fallbacks and instrumentation
Currently instrumentation of atomic primitives is done at the architecture
level, while composites or fallbacks are provided at the generic level.

The result is that there are no uninstrumented variants of the
fallbacks. Since there is now need of such variants to isolate text poke
from any form of instrumentation invert this ordering.

Doing this means moving the instrumentation into the generic code as
well as having (for now) two variants of the fallbacks.

Notes:

 - the various *cond_read* primitives are not proper fallbacks
   and got moved into linux/atomic.c. No arch_ variants are
   generated because the base primitives smp_cond_load*()
   are instrumented.

 - once all architectures are moved over to arch_atomic_ one of the
   fallback variants can be removed and some 2300 lines reclaimed.

 - atomic_{read,set}*() are no longer double-instrumented

Reported-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Link: https://lkml.kernel.org/r/20200505134058.769149955@linutronix.de
2020-06-11 08:03:24 +02:00
Marco Elver 765dcd2099 asm-generic/atomic: Use __always_inline for fallback wrappers
Use __always_inline for atomic fallback wrappers. When building for size
(CC_OPTIMIZE_FOR_SIZE), some compilers appear to be less inclined to
inline even relatively small static inline functions that are assumed to
be inlinable such as atomic ops. This can cause problems, for example in
UACCESS regions.

While the fallback wrappers aren't pure wrappers, they are trivial
nonetheless, and the function they wrap should determine the final
inlining policy.

For x86 tinyconfig we observe:
- vmlinux baseline: 1315988
- vmlinux with patch: 1315928 (-60 bytes)

[ tglx: Cherry-picked from KCSAN ]

Suggested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Marco Elver <elver@google.com>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2020-06-11 08:03:24 +02:00
Ingo Molnar 4d8e5cd233 locking/atomics: Fix scripts/atomic/ script permissions
Mark all these scripts executable.

Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: linuxdrivers@attotech.com
Cc: dvyukov@google.com
Cc: boqun.feng@gmail.com
Cc: arnd@arndb.de
Cc: aryabinin@virtuozzo.com
Cc: glider@google.com
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2018-11-01 12:45:46 +01:00
Mark Rutland ace9bad4df locking/atomics: Add common header generation files
To minimize repetition, to allow for future rework, and to ensure
regularity of the various atomic APIs, we'd like to automatically
generate (the bulk of) a number of headers related to atomics.

This patch adds the infrastructure to do so, leaving actual conversion
of headers to subsequent patches. This infrastructure consists of:

* atomics.tbl - a table describing the functions in the atomics API,
  with names, prototypes, and metadata describing the variants that
  exist (e.g fetch/return, acquire/release/relaxed). Note that the
  return type is dependent on the particular variant.

* atomic-tbl.sh - a library of routines useful for dealing with
  atomics.tbl (e.g. querying which variants exist, or generating
  argument/parameter lists for a given function variant).

* gen-atomic-fallback.sh - a script which generates a header of
  fallbacks, covering cases where architecture omit certain functions
  (e.g. omitting relaxed variants).

* gen-atomic-long.sh - a script which generates wrappers providing the
  atomic_long API atomic of the relevant atomic or atomic64 API,
  ensuring the APIs are consistent.

* gen-atomic-instrumented.sh - a script which generates atomic* wrappers
  atop of arch_atomic* functions, with automatically generated KASAN
  instrumentation.

* fallbacks/* - a set of fallback implementations for atomics, which
  should be used when no implementation of a given atomic is provided.
  These are used by gen-atomic-fallback.sh to generate fallbacks, and
  these are also used by other scripts to determine the set of optional
  atomics (as required to generate preprocessor guards correctly).

  Fallbacks may use the following variables:

  ${atomic}     atomic prefix: atomic/atomic64/atomic_long, which can be
		used to derive the atomic type, and to prefix functions

  ${int}        integer type: int/s64/long

  ${pfx}        variant prefix, e.g. fetch_

  ${name}       base function name, e.g. add

  ${sfx}        variant suffix, e.g. _return

  ${order}      order suffix, e.g. _relaxed

  ${atomicname} full name, e.g. atomic64_fetch_add_relaxed

  ${ret}        return type of the function, e.g. void

  ${retstmt}    a return statement (with a trailing space), unless the
                variant returns void

  ${params}     parameter list for the function declaration, e.g.
                "int i, atomic_t *v"

  ${args}       argument list for invoking the function, e.g. "i, v"

  ... for clarity, ${ret}, ${retstmt}, ${params}, and ${args} are
  open-coded for fallbacks where these do not vary, or are critical to
  understanding the logic of the fallback.

The MAINTAINERS entry for the atomic infrastructure is updated to cover
the new scripts.

There should be no functional change as a result of this patch.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: catalin.marinas@arm.com
Cc: Will Deacon <will.deacon@arm.com>
Cc: linuxdrivers@attotech.com
Cc: dvyukov@google.com
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: arnd@arndb.de
Cc: aryabinin@virtuozzo.com
Cc: glider@google.com
Link: http://lkml.kernel.org/r/20180904104830.2975-2-mark.rutland@arm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2018-11-01 11:00:36 +01:00