diff options
author | Damjan Marion <damarion@cisco.com> | 2018-07-20 21:48:59 +0200 |
---|---|---|
committer | Damjan Marion <damarion@cisco.com> | 2018-07-20 21:48:59 +0200 |
commit | 2a03efe4c2d716de4cfd032594f4f1e88859d3dd (patch) | |
tree | f1460045c8cae4b183b22878bee55efb54d0a06d /src/vppinfra/bihash_template.h | |
parent | 78fd7e810c24b9d638ac7c7f08edabf692543743 (diff) |
bihash: give hint to CPU that we are spinlocking
Change-Id: I78c0a6da5d8fc63c1ced43589c42abc15ab12b16
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vppinfra/bihash_template.h')
-rw-r--r-- | src/vppinfra/bihash_template.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/vppinfra/bihash_template.h b/src/vppinfra/bihash_template.h index 6303992bc57..9bf4737cd84 100644 --- a/src/vppinfra/bihash_template.h +++ b/src/vppinfra/bihash_template.h @@ -27,6 +27,7 @@ #include <vppinfra/format.h> #include <vppinfra/pool.h> #include <vppinfra/cache.h> +#include <vppinfra/lock.h> #ifndef BIHASH_TYPE #error BIHASH_TYPE not defined @@ -106,7 +107,7 @@ typedef struct static inline void BV (clib_bihash_alloc_lock) (BVT (clib_bihash) * h) { while (__atomic_test_and_set (h->alloc_lock, __ATOMIC_ACQUIRE)) - ; + CLIB_PAUSE (); } static inline void BV (clib_bihash_alloc_unlock) (BVT (clib_bihash) * h) @@ -123,6 +124,7 @@ static inline void BV (clib_bihash_lock_bucket) (BVT (clib_bihash_bucket) * b) locked_bucket.as_u64 = unlocked_bucket.as_u64 = b->as_u64; unlocked_bucket.lock = 0; locked_bucket.lock = 1; + CLIB_PAUSE (); } while (__atomic_compare_exchange_n (&b->as_u64, &unlocked_bucket.as_u64, locked_bucket.as_u64, 1 /* weak */ , @@ -203,7 +205,7 @@ static inline int BV (clib_bihash_search_inline_with_hash) { volatile BVT (clib_bihash_bucket) * bv = b; while (bv->lock) - ; + CLIB_PAUSE (); } hash >>= h->log2_nbuckets; @@ -291,7 +293,7 @@ static inline int BV (clib_bihash_search_inline_2_with_hash) { volatile BVT (clib_bihash_bucket) * bv = b; while (bv->lock) - ; + CLIB_PAUSE (); } hash >>= h->log2_nbuckets; |