It patches API-NEXT branch. Did you try to apply it to master? Just tried it out, and it applies nicely.
“[API-NEXT,v3,7/7] api: atomic: added 32 bit acquire and release” is in api-next. The idea is to add those operation-mem_model combinations, that are commonly used and make sense (from our opinion, mainly acq/rel ?). For example: · There will never be store_acq, store_csm, store_acq_rel, load_rls, load_acq_rel, etc … since those are illegal combinations by the C11 spec · seq_cst could be left out altogether, since we could reason that it’s commonly an overkill, etc o we could have a full barrier, which uses it, but do not provide atomic_xxx_seq_cst · Is ‘consume’ needed at all? · Relaxed is the default · Is acq_rel interesting with other operations than cas? I think it’s better to define a set of operations that are really needed (and legal), than have a memory order param which opens up all combinations (also illegal ones). Every function would need to check validity of the mem_order param, and have branches in the (inlined) code to select the correct path. Compiler based atomics have better chance to check and optimize code on build time (== can be efficient with the param). -Petri From: EXT Ola Liljedahl [mailto:ola.liljed...@linaro.org] Sent: Tuesday, December 08, 2015 6:44 PM To: Savolainen, Petri (Nokia - FI/Espoo) Cc: lng-odp@lists.linaro.org Subject: Re: [lng-odp] [API-NEXT PATCH v3] api: atomic: added atomic_lock_free_u64 The patch doesn't apply. It depends on this patch [API-NEXT,v3,7/7] api: atomic: added 32 bit acquire and release<http://patches.opendataplane.org/patch/3435/> As can be seen here in the patch: diff --git a/include/odp/api/atomic.h b/include/odp/api/atomic.h index 316f13a..5e897c1 100644 --- a/include/odp/api/atomic.h +++ b/include/odp/api/atomic.h @@ -388,6 +388,54 @@ void odp_atomic_add_rls_u32(odp_atomic_u32_t *atom, uint32_t val); void odp_atomic_sub_rls_u32(odp_atomic_u32_t *atom, uint32_t val); /** + * Atomic operations + * + * Atomic operations listed in a bit field structure. What happened to that earlier patch series (cleanup of atomics documentation and added some new atomic operations)? I know I wasn't fond of adding new operations with just some of the different possible ordering models, the choice seem quite haphazard to me. I have used the same operations for lock-less programming but with different memory orderings. Better to expose the operations in linux-generic odp_atomic_internal.h where the memory ordering is a parameter. On 26 November 2015 at 09:56, Savolainen, Petri (Nokia - FI/Espoo) <petri.savolai...@nokia.com<mailto:petri.savolai...@nokia.com>> wrote: ping. > -----Original Message----- > From: lng-odp > [mailto:lng-odp-boun...@lists.linaro.org<mailto:lng-odp-boun...@lists.linaro.org>] > On Behalf Of EXT > Petri Savolainen > Sent: Thursday, November 12, 2015 10:30 AM > To: lng-odp@lists.linaro.org<mailto:lng-odp@lists.linaro.org> > Subject: [lng-odp] [API-NEXT PATCH v3] api: atomic: added > atomic_lock_free_u64 > > Platforms may support some uint64 operations lock-free and > others not. For example, inc_64 can be natively supported but > cas_64 (or max_64/min_64) not. User may be able to switch to > 32 bit variables when a 64 bit operation uses locks. The same > atomic operation struture could be used for platform init to guide > lock vs. lock-free implementation (e.g. if cas_64 is never > called, inc_64 can be lock-free). > > Signed-off-by: Petri Savolainen > <petri.savolai...@nokia.com<mailto:petri.savolai...@nokia.com>> > --- > include/odp/api/atomic.h | 48 > +++++++++++++++++++++++++++++++++++++ > platform/linux-generic/Makefile.am | 1 + > platform/linux-generic/odp_atomic.c | 24 +++++++++++++++++++ > 3 files changed, 73 insertions(+) > create mode 100644 platform/linux-generic/odp_atomic.c > > diff --git a/include/odp/api/atomic.h b/include/odp/api/atomic.h > index 316f13a..5e897c1 100644 > --- a/include/odp/api/atomic.h > +++ b/include/odp/api/atomic.h > @@ -388,6 +388,54 @@ void odp_atomic_add_rls_u32(odp_atomic_u32_t *atom, > uint32_t val); > void odp_atomic_sub_rls_u32(odp_atomic_u32_t *atom, uint32_t val); > > /** > + * Atomic operations > + * > + * Atomic operations listed in a bit field structure. > + */ > +typedef union odp_atomic_op_t { > + /** Operation flags */ > + struct { > + uint32_t init : 1; /**< Init atomic variable */ > + uint32_t load : 1; /**< Atomic load */ > + uint32_t store : 1; /**< Atomic store */ > + uint32_t fetch_add : 1; /**< Atomic fetch and add */ > + uint32_t add : 1; /**< Atomic add */ > + uint32_t fetch_sub : 1; /**< Atomic fetch and substract */ > + uint32_t sub : 1; /**< Atomic substract */ > + uint32_t fetch_inc : 1; /**< Atomic fetch and increment */ > + uint32_t inc : 1; /**< Atomic increment */ > + uint32_t fetch_dec : 1; /**< Atomic fetch and decrement */ > + uint32_t dec : 1; /**< Atomic decrement */ > + uint32_t min : 1; /**< Atomic minimum */ > + uint32_t max : 1; /**< Atomic maximum */ > + uint32_t cas : 1; /**< Atomic compare and swap */ > + } op; > + > + /** All bits of the bit field structure. > + * Operation flag mapping is architecture specific. This field can > be > + * used to set/clear all flags, or bitwise operations over the > entire > + * structure. */ > + uint32_t all_bits; > +} odp_atomic_op_t; > + > +/** > + * Query which atomic uint64 operations are lock-free > + * > + * Lock-free implementations have higher performance and scale better > than > + * implementations using locks. User can decide to use e.g. uint32 atomic > + * variables instead of uint64 to optimize performance on platforms that > + * implement a performance critical operation using locks. > + * > + * @param atomic_op Pointer to atomic operation structure for storing > + * operation flags. All bits are initialized to zero > during > + * the operation. The parameter is ignored when NULL. > + * @retval 0 None of the operations are lock-free > + * @retval 1 Some of the operations are lock-free > + * @retval 2 All operations are lock-free > + */ > +int odp_atomic_lock_free_u64(odp_atomic_op_t *atomic_op); > + > +/** > * @} > */ > > diff --git a/platform/linux-generic/Makefile.am b/platform/linux- > generic/Makefile.am > index a6b6029..0b7234e 100644 > --- a/platform/linux-generic/Makefile.am > +++ b/platform/linux-generic/Makefile.am > @@ -151,6 +151,7 @@ noinst_HEADERS = \ > ${srcdir}/Makefile.inc > > __LIB__libodp_la_SOURCES = \ > + odp_atomic.c \ > odp_barrier.c \ > odp_buffer.c \ > odp_classification.c \ > diff --git a/platform/linux-generic/odp_atomic.c b/platform/linux- > generic/odp_atomic.c > new file mode 100644 > index 0000000..996d09a > --- /dev/null > +++ b/platform/linux-generic/odp_atomic.c > @@ -0,0 +1,24 @@ > +/* Copyright (c) 2015, Linaro Limited > + * All rights reserved. > + * > + * SPDX-License-Identifier: BSD-3-Clause > + */ > + > +#include <odp/atomic.h> > + > +int odp_atomic_lock_free_u64(odp_atomic_op_t *atomic_op) > +{ > +#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2 > + /* All operations have locks */ > + if (atomic_op) > + atomic_op->all_bits = 0; > + > + return 0; > +#else > + /* All operations are lock-free */ > + if (atomic_op) > + atomic_op->all_bits = ~((uint32_t)0); > + > + return 2; > +#endif > +} > -- > 2.6.2 > > _______________________________________________ > lng-odp mailing list > lng-odp@lists.linaro.org<mailto:lng-odp@lists.linaro.org> > https://lists.linaro.org/mailman/listinfo/lng-odp _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org<mailto:lng-odp@lists.linaro.org> https://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp