diff options
author | Petri Savolainen <petri.savolainen@nokia.com> | 2016-01-20 11:19:31 +0200 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2016-02-08 20:45:24 +0300 |
commit | 7bd0eab46d20563801255fb4cec6796beefa7a0d (patch) | |
tree | b0b229df6d5ed374906f5ef919279363e0cae52d /platform/linux-generic | |
parent | 87e75c7bf192d91400b7c7ab56c796d35d98f10c (diff) |
linux-generic: locks: replace internal atomics
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.savolainen@nokia.com>
Reviewed-by: Ola Liljedahl <ola.liljedahl@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform/linux-generic')
-rw-r--r-- | platform/linux-generic/include/odp_pool_internal.h | 1 | ||||
-rw-r--r-- | platform/linux-generic/odp_pool.c | 1 | ||||
-rw-r--r-- | platform/linux-generic/odp_rwlock.c | 23 | ||||
-rw-r--r-- | 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 ae4836cc8..fdac6067e 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 a3fcac373..64668cc3d 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 0b8bb46b7..42ad0ccdb 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/cpu.h> @@ -21,23 +20,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_cpu_pause(); 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) @@ -47,21 +43,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_cpu_pause(); 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 6ab2b9a6a..84b893a5c 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/cpu.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_cpu_pause(); } @@ -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 |