Replace internal non-relaxed atomics with API calls. Timer and spinlock were not converted since those use flags and 128 variables.
Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com> --- platform/linux-generic/include/odp_pool_internal.h | 1 - platform/linux-generic/odp_pool.c | 1 - platform/linux-generic/odp_rwlock.c | 23 ++++++++-------------- platform/linux-generic/odp_ticketlock.c | 21 ++++++-------------- 4 files changed, 14 insertions(+), 32 deletions(-) diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h index b12bca8..aae020f 100644 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@ -28,7 +28,6 @@ extern "C" { #include <odp/debug.h> #include <odp/shared_memory.h> #include <odp/atomic.h> -#include <odp_atomic_internal.h> #include <odp/thread.h> #include <string.h> diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 125d8e6..f7ce877 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -19,7 +19,6 @@ #include <odp/hints.h> #include <odp/thread.h> #include <odp_debug_internal.h> -#include <odp_atomic_internal.h> #include <string.h> #include <stdlib.h> diff --git a/platform/linux-generic/odp_rwlock.c b/platform/linux-generic/odp_rwlock.c index 47c15ef..98d53bf 100644 --- a/platform/linux-generic/odp_rwlock.c +++ b/platform/linux-generic/odp_rwlock.c @@ -6,7 +6,6 @@ #include <stdbool.h> #include <odp/atomic.h> -#include <odp_atomic_internal.h> #include <odp/rwlock.h> #include <odp_spin_internal.h> @@ -22,23 +21,20 @@ void odp_rwlock_read_lock(odp_rwlock_t *rwlock) int is_locked = 0; while (is_locked == 0) { - cnt = _odp_atomic_u32_load_mm(&rwlock->cnt, _ODP_MEMMODEL_RLX); + cnt = odp_atomic_load_u32(&rwlock->cnt); /* waiting for read lock */ if ((int32_t)cnt < 0) { odp_spin(); continue; } - is_locked = _odp_atomic_u32_cmp_xchg_strong_mm(&rwlock->cnt, - &cnt, - cnt + 1, - _ODP_MEMMODEL_ACQ, - _ODP_MEMMODEL_RLX); + is_locked = odp_atomic_cas_acq_u32(&rwlock->cnt, + &cnt, cnt + 1); } } void odp_rwlock_read_unlock(odp_rwlock_t *rwlock) { - _odp_atomic_u32_sub_mm(&rwlock->cnt, 1, _ODP_MEMMODEL_RLS); + odp_atomic_sub_rel_u32(&rwlock->cnt, 1); } void odp_rwlock_write_lock(odp_rwlock_t *rwlock) @@ -48,21 +44,18 @@ void odp_rwlock_write_lock(odp_rwlock_t *rwlock) while (is_locked == 0) { uint32_t zero = 0; - cnt = _odp_atomic_u32_load_mm(&rwlock->cnt, _ODP_MEMMODEL_RLX); + cnt = odp_atomic_load_u32(&rwlock->cnt); /* lock acquired, wait */ if (cnt != 0) { odp_spin(); continue; } - is_locked = _odp_atomic_u32_cmp_xchg_strong_mm(&rwlock->cnt, - &zero, - (uint32_t)-1, - _ODP_MEMMODEL_ACQ, - _ODP_MEMMODEL_RLX); + is_locked = odp_atomic_cas_acq_u32(&rwlock->cnt, + &zero, (uint32_t)-1); } } void odp_rwlock_write_unlock(odp_rwlock_t *rwlock) { - _odp_atomic_u32_store_mm(&rwlock->cnt, 0, _ODP_MEMMODEL_RLS); + odp_atomic_store_rel_u32(&rwlock->cnt, 0); } diff --git a/platform/linux-generic/odp_ticketlock.c b/platform/linux-generic/odp_ticketlock.c index 3e2a4ec..ccc3a43 100644 --- a/platform/linux-generic/odp_ticketlock.c +++ b/platform/linux-generic/odp_ticketlock.c @@ -6,18 +6,15 @@ #include <odp/ticketlock.h> #include <odp/atomic.h> -#include <odp_atomic_internal.h> #include <odp/sync.h> #include <odp_spin_internal.h> - void odp_ticketlock_init(odp_ticketlock_t *ticketlock) { odp_atomic_init_u32(&ticketlock->next_ticket, 0); odp_atomic_init_u32(&ticketlock->cur_ticket, 0); } - void odp_ticketlock_lock(odp_ticketlock_t *ticketlock) { uint32_t ticket; @@ -29,8 +26,7 @@ void odp_ticketlock_lock(odp_ticketlock_t *ticketlock) /* Spin waiting for our turn. Use load-acquire so that we acquire * all stores from the previous lock owner */ - while (ticket != _odp_atomic_u32_load_mm(&ticketlock->cur_ticket, - _ODP_MEMMODEL_ACQ)) + while (ticket != odp_atomic_load_acq_u32(&ticketlock->cur_ticket)) odp_spin(); } @@ -55,11 +51,8 @@ int odp_ticketlock_trylock(odp_ticketlock_t *tklock) * If CAS fails, it means some other thread intercepted and * took a ticket which means the lock is not available * anymore */ - if (_odp_atomic_u32_cmp_xchg_strong_mm(&tklock->next_ticket, - &next, - next + 1, - _ODP_MEMMODEL_ACQ, - _ODP_MEMMODEL_RLX)) + if (odp_atomic_cas_acq_u32(&tklock->next_ticket, + &next, next + 1)) return 1; } return 0; @@ -72,17 +65,15 @@ void odp_ticketlock_unlock(odp_ticketlock_t *ticketlock) * 'cur_ticket', we don't need to do this with an (expensive) * atomic RMW operation. Instead load-relaxed the current value * and a store-release of the incremented value */ - uint32_t cur = _odp_atomic_u32_load_mm(&ticketlock->cur_ticket, - _ODP_MEMMODEL_RLX); - _odp_atomic_u32_store_mm(&ticketlock->cur_ticket, cur + 1, - _ODP_MEMMODEL_RLS); + uint32_t cur = odp_atomic_load_u32(&ticketlock->cur_ticket); + + odp_atomic_store_rel_u32(&ticketlock->cur_ticket, cur + 1); #if defined __OCTEON__ odp_sync_stores(); /* SYNCW to flush write buffer */ #endif } - int odp_ticketlock_is_locked(odp_ticketlock_t *ticketlock) { /* Compare 'cur_ticket' with 'next_ticket'. Ideally we should read -- 2.6.3 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp