diff options
author | Florin Coras <fcoras@cisco.com> | 2019-11-27 09:15:25 -0800 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2019-12-06 19:29:02 +0000 |
commit | 8d820857d91efa9adca86e935e2d559d310ee2a1 (patch) | |
tree | 5e915700594d157d4a25d1d7ca46cbdf99d01689 /src/vlibmemory/memory_shared.c | |
parent | 157a4ab4043cd9d1b6ac26b7853f1471a9095756 (diff) |
api: avoid swapping vlib_rp before barrier sync
Type: fix
Change-Id: I9868d13e827c6f5aa5535a38f629efb62ff12dbc
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vlibmemory/memory_shared.c')
-rw-r--r-- | src/vlibmemory/memory_shared.c | 56 |
1 files changed, 27 insertions, 29 deletions
diff --git a/src/vlibmemory/memory_shared.c b/src/vlibmemory/memory_shared.c index 6c8ec3092f1..b927f95f17b 100644 --- a/src/vlibmemory/memory_shared.c +++ b/src/vlibmemory/memory_shared.c @@ -43,7 +43,8 @@ #define DEBUG_MESSAGE_BUFFER_OVERRUN 0 CLIB_NOSANITIZE_ADDR static inline void * -vl_msg_api_alloc_internal (int nbytes, int pool, int may_return_null) +vl_msg_api_alloc_internal (svm_region_t * vlib_rp, int nbytes, int pool, + int may_return_null) { int i; msgbuf_t *rv; @@ -53,7 +54,7 @@ vl_msg_api_alloc_internal (int nbytes, int pool, int may_return_null) vl_shmem_hdr_t *shmem_hdr; api_main_t *am = &api_main; - shmem_hdr = am->shmem_hdr; + shmem_hdr = (void *) vlib_rp->user_ctx; #if DEBUG_MESSAGE_BUFFER_OVERRUN > 0 nbytes += 4; @@ -161,15 +162,15 @@ vl_msg_api_alloc_internal (int nbytes, int pool, int may_return_null) */ am->ring_misses++; - pthread_mutex_lock (&am->vlib_rp->mutex); - oldheap = svm_push_data_heap (am->vlib_rp); + pthread_mutex_lock (&vlib_rp->mutex); + oldheap = svm_push_data_heap (vlib_rp); if (may_return_null) { rv = clib_mem_alloc_or_null (nbytes); if (PREDICT_FALSE (rv == 0)) { svm_pop_heap (oldheap); - pthread_mutex_unlock (&am->vlib_rp->mutex); + pthread_mutex_unlock (&vlib_rp->mutex); return 0; } } @@ -179,7 +180,7 @@ vl_msg_api_alloc_internal (int nbytes, int pool, int may_return_null) rv->q = 0; rv->gc_mark_timestamp = 0; svm_pop_heap (oldheap); - pthread_mutex_unlock (&am->vlib_rp->mutex); + pthread_mutex_unlock (&vlib_rp->mutex); out: #if DEBUG_MESSAGE_BUFFER_OVERRUN > 0 @@ -207,7 +208,8 @@ vl_msg_api_alloc (int nbytes) * Clients use pool-0, vlib proc uses pool 1 */ pool = (am->our_pid == shmem_hdr->vl_pid); - return vl_msg_api_alloc_internal (nbytes, pool, 0 /* may_return_null */ ); + return vl_msg_api_alloc_internal (am->vlib_rp, nbytes, pool, + 0 /* may_return_null */ ); } void * @@ -228,13 +230,15 @@ vl_msg_api_alloc_or_null (int nbytes) vl_shmem_hdr_t *shmem_hdr = am->shmem_hdr; pool = (am->our_pid == shmem_hdr->vl_pid); - return vl_msg_api_alloc_internal (nbytes, pool, 1 /* may_return_null */ ); + return vl_msg_api_alloc_internal (am->vlib_rp, nbytes, pool, + 1 /* may_return_null */ ); } void * vl_msg_api_alloc_as_if_client (int nbytes) { - return vl_msg_api_alloc_internal (nbytes, 0, 0 /* may_return_null */ ); + return vl_msg_api_alloc_internal (api_main.vlib_rp, nbytes, 0, + 0 /* may_return_null */ ); } void * @@ -250,34 +254,22 @@ vl_msg_api_alloc_zero_as_if_client (int nbytes) void * vl_msg_api_alloc_as_if_client_or_null (int nbytes) { - return vl_msg_api_alloc_internal (nbytes, 0, 1 /* may_return_null */ ); + return vl_msg_api_alloc_internal (api_main.vlib_rp, nbytes, 0, + 1 /* may_return_null */ ); } void * vl_mem_api_alloc_as_if_client_w_reg (vl_api_registration_t * reg, int nbytes) { - api_main_t *am = &api_main; - vl_shmem_hdr_t *save_shmem_hdr = am->shmem_hdr; - svm_region_t *vlib_rp, *save_vlib_rp = am->vlib_rp; - void *msg; - - vlib_rp = am->vlib_rp = reg->vlib_rp; - am->shmem_hdr = (void *) vlib_rp->user_ctx; - - msg = vl_msg_api_alloc_internal (nbytes, 0, 0 /* may_return_null */ ); - - am->shmem_hdr = save_shmem_hdr; - am->vlib_rp = save_vlib_rp; - - return msg; + return vl_msg_api_alloc_internal (reg->vlib_rp, nbytes, 0, + 0 /* may_return_null */ ); } void -vl_msg_api_free (void *a) +vl_msg_api_free_w_region (svm_region_t * vlib_rp, void *a) { msgbuf_t *rv; void *oldheap; - api_main_t *am = &api_main; rv = (msgbuf_t *) (((u8 *) a) - offsetof (msgbuf_t, data)); @@ -301,8 +293,8 @@ vl_msg_api_free (void *a) return; } - pthread_mutex_lock (&am->vlib_rp->mutex); - oldheap = svm_push_data_heap (am->vlib_rp); + pthread_mutex_lock (&vlib_rp->mutex); + oldheap = svm_push_data_heap (vlib_rp); #if DEBUG_MESSAGE_BUFFER_OVERRUN > 0 { @@ -314,7 +306,13 @@ vl_msg_api_free (void *a) clib_mem_free (rv); svm_pop_heap (oldheap); - pthread_mutex_unlock (&am->vlib_rp->mutex); + pthread_mutex_unlock (&vlib_rp->mutex); +} + +void +vl_msg_api_free (void *a) +{ + vl_msg_api_free_w_region (api_main.vlib_rp, a); } static void |