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/vlibapi/api_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/vlibapi/api_shared.c')
-rw-r--r-- | src/vlibapi/api_shared.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/vlibapi/api_shared.c b/src/vlibapi/api_shared.c index 1e7f5c420c6..ba872626549 100644 --- a/src/vlibapi/api_shared.c +++ b/src/vlibapi/api_shared.c @@ -525,13 +525,15 @@ msg_handler_internal (api_main_t * am, /* This is only to be called from a vlib/vnet app */ void -vl_msg_api_handler_with_vm_node (api_main_t * am, +vl_msg_api_handler_with_vm_node (api_main_t * am, svm_region_t * vlib_rp, void *the_msg, vlib_main_t * vm, - vlib_node_runtime_t * node) + vlib_node_runtime_t * node, u8 is_private) { u16 id = clib_net_to_host_u16 (*((u16 *) the_msg)); u8 *(*handler) (void *, void *, void *); u8 *(*print_fp) (void *, void *); + svm_region_t *old_vlib_rp; + void *save_shmem_hdr; int is_mp_safe = 1; if (PREDICT_FALSE (am->elog_trace_api_messages)) @@ -581,7 +583,19 @@ vl_msg_api_handler_with_vm_node (api_main_t * am, vl_msg_api_barrier_trace_context (am->msg_names[id]); vl_msg_api_barrier_sync (); } + if (is_private) + { + old_vlib_rp = am->vlib_rp; + save_shmem_hdr = am->shmem_hdr; + am->vlib_rp = vlib_rp; + am->shmem_hdr = (void *) vlib_rp->user_ctx; + } (*handler) (the_msg, vm, node); + if (is_private) + { + am->vlib_rp = old_vlib_rp; + am->shmem_hdr = save_shmem_hdr; + } if (!is_mp_safe) vl_msg_api_barrier_release (); } |