Yes I will do that.
On 26 November 2015 at 12:41, Maxim Uvarov <[email protected]> wrote: > Ola, can you please review the final version? > > Maxim. > > > On 11/26/2015 11:56, Savolainen, Petri (Nokia - FI/Espoo) wrote: >> >> ping. >> >>> -----Original Message----- >>> From: lng-odp [mailto:[email protected]] On Behalf Of EXT >>> Petri Savolainen >>> Sent: Thursday, November 12, 2015 10:30 AM >>> To: [email protected] >>> 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 <[email protected]> >>> --- >>> 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 >>> [email protected] >>> https://lists.linaro.org/mailman/listinfo/lng-odp >> >> _______________________________________________ >> lng-odp mailing list >> [email protected] >> https://lists.linaro.org/mailman/listinfo/lng-odp > > _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
