mbox series

[00/13] atomics: API cleanups

Message ID 20180523133533.1076-1-mark.rutland@arm.com
Headers show
Series atomics: API cleanups | expand

Message

Mark Rutland May 23, 2018, 1:35 p.m. UTC
This series contains a few cleanups of the atomic API, fixing an
inconsistency between atomic_* and atomic64_*, and minimizing repetition
in arch code. This is nicer for arch code, and the improved regularity
will help when generating the atomic headers in future.

The bulk of the patches reorganise things so architectures consistently
provide <atomic>_fetch_add_unless(), with atomic_fetch_add_unless()
provided as a wrapper by core code. A generic fallback is provided for
<atomic>_fetch_add_unless(), based on <atomic>_read() and
<atomic>_try_cmpxchg().

Other patches in the series add common fallbacks for:

* atomic64_inc_not_zero() 
* <atomic>_inc_and_test()
* <atomic>_dec_and_test()
* <atomic>_sub_and_test()
* <atomic>add_negative()

... as almost all architectures provide identical implementation of
these today.

The end result is a strongly negative diffstat, though <linux/atomic.h>
grows by a reasonable amount. When we generate the headers, we can halve
this by templating the various fallbacks for atomic{,64}_t.

I've pushed this out to my atomics/api-cleanup branch [1] on kernel.org.

Thanks,
Mark.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git atomics/api-cleanup

Mark Rutland (13):
  atomics/treewide: s/__atomic_add_unless/atomic_fetch_add_unless/
  atomics/treewide: remove redundant atomic_inc_not_zero() definitions
  atomics/treewide: make atomic64_inc_not_zero() optional
  atomics/treewide: make atomic_fetch_add_unless() optional
  atomics: prepare for atomic64_fetch_add_unless()
  atomics/generic: define atomic64_fetch_add_unless()
  atomics/alpha: define atomic64_fetch_add_unless()
  atomics/arc: define atomic64_fetch_add_unless()
  atomics/arm: define atomic64_fetch_add_unless()
  atomics/powerpc: define atomic64_fetch_add_unless()
  atomics/riscv: define atomic64_fetch_add_unless()
  atomics/treewide: make atomic64_fetch_add_unless() optional
  atomics/treewide: make test ops optional

 arch/alpha/include/asm/atomic.h           |  43 +++----
 arch/arc/include/asm/atomic.h             |  66 ++--------
 arch/arm/include/asm/atomic.h             |  43 ++-----
 arch/arm64/include/asm/atomic.h           |  23 ----
 arch/h8300/include/asm/atomic.h           |   8 +-
 arch/hexagon/include/asm/atomic.h         |  12 +-
 arch/ia64/include/asm/atomic.h            |  56 ---------
 arch/m68k/include/asm/atomic.h            |  19 +--
 arch/mips/include/asm/atomic.h            | 134 --------------------
 arch/openrisc/include/asm/atomic.h        |   4 +-
 arch/parisc/include/asm/atomic.h          |  72 -----------
 arch/powerpc/include/asm/atomic.h         |  47 ++-----
 arch/riscv/include/asm/atomic.h           |  27 +---
 arch/s390/include/asm/atomic.h            |  40 ------
 arch/sh/include/asm/atomic.h              |  29 -----
 arch/sparc/include/asm/atomic_32.h        |  19 +--
 arch/sparc/include/asm/atomic_64.h        |  52 --------
 arch/sparc/lib/atomic32.c                 |   4 +-
 arch/x86/include/asm/atomic.h             |  25 +---
 arch/x86/include/asm/atomic64_32.h        |  54 --------
 arch/x86/include/asm/atomic64_64.h        |  25 +---
 arch/xtensa/include/asm/atomic.h          |  66 ----------
 drivers/block/rbd.c                       |   2 +-
 drivers/infiniband/core/rdma_core.c       |   2 +-
 fs/afs/rxrpc.c                            |   2 +-
 include/asm-generic/atomic-instrumented.h |  42 ++++++-
 include/asm-generic/atomic.h              |  20 ---
 include/asm-generic/atomic64.h            |   8 +-
 include/linux/atomic.h                    | 198 +++++++++++++++++++++++++++++-
 kernel/bpf/syscall.c                      |   4 +-
 lib/atomic64.c                            |  13 +-
 net/rxrpc/call_object.c                   |   2 +-
 net/rxrpc/conn_object.c                   |   4 +-
 net/rxrpc/local_object.c                  |   2 +-
 net/rxrpc/peer_object.c                   |   2 +-
 35 files changed, 329 insertions(+), 840 deletions(-)

-- 
2.11.0

Comments

Peter Zijlstra May 23, 2018, 5:18 p.m. UTC | #1
On Wed, May 23, 2018 at 02:35:20PM +0100, Mark Rutland wrote:
> This series contains a few cleanups of the atomic API, fixing an

> inconsistency between atomic_* and atomic64_*, and minimizing repetition

> in arch code. This is nicer for arch code, and the improved regularity

> will help when generating the atomic headers in future.

> 

> The bulk of the patches reorganise things so architectures consistently

> provide <atomic>_fetch_add_unless(), with atomic_fetch_add_unless()

> provided as a wrapper by core code. A generic fallback is provided for

> <atomic>_fetch_add_unless(), based on <atomic>_read() and

> <atomic>_try_cmpxchg().

> 

> Other patches in the series add common fallbacks for:

> 

> * atomic64_inc_not_zero() 

> * <atomic>_inc_and_test()

> * <atomic>_dec_and_test()

> * <atomic>_sub_and_test()

> * <atomic>add_negative()

> 

> ... as almost all architectures provide identical implementation of

> these today.

> 

> The end result is a strongly negative diffstat, though <linux/atomic.h>

> grows by a reasonable amount. When we generate the headers, we can halve

> this by templating the various fallbacks for atomic{,64}_t.

> 


Thanks for this Mark,

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>


Ingo, can you magic this into tip somewhere?
Mark Rutland May 24, 2018, 8:27 a.m. UTC | #2
On Wed, May 23, 2018 at 07:18:17PM +0200, Peter Zijlstra wrote:
> On Wed, May 23, 2018 at 02:35:20PM +0100, Mark Rutland wrote:

> > This series contains a few cleanups of the atomic API, fixing an

> > inconsistency between atomic_* and atomic64_*, and minimizing repetition

> > in arch code. This is nicer for arch code, and the improved regularity

> > will help when generating the atomic headers in future.


> Thanks for this Mark,

> 

> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>


Cheers!

> Ingo, can you magic this into tip somewhere?


FWIW, I've accumulated acks (and fixed the typo in patch two) in my branch at:

git://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git atomics/api-cleanup

Thanks,
Mark.