X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_locked.c;h=d69d391d626bb5f7a6d188ae90b403f65d994065;hb=b4e5e50fe;hp=725f1bf91c078c6bf76239ab35a01970b6a21d44;hpb=78b5fa6398d02af4f4f92e4bc9cc22c010ae24f9;p=vpp.git diff --git a/src/vcl/vcl_locked.c b/src/vcl/vcl_locked.c index 725f1bf91c0..d69d391d626 100644 --- a/src/vcl/vcl_locked.c +++ b/src/vcl/vcl_locked.c @@ -311,7 +311,7 @@ vls_listener_wrk_stop_listen (vcl_locked_session_t * vls, u32 wrk_index) s = vcl_session_get (wrk, vls->session_index); if (s->session_state != STATE_LISTEN) return; - vppcom_send_unbind_sock (wrk, s->vpp_handle); + vcl_send_session_unlisten (wrk, s); s->session_state = STATE_LISTEN_NO_MQ; vls_listener_wrk_set (vls, wrk_index, 0 /* is_active */ ); } @@ -397,7 +397,7 @@ vls_worker_copy_on_fork (vcl_worker_t * parent_wrk) wrk->sessions = pool_dup (parent_wrk->sessions); wrk->session_index_by_vpp_handles = hash_dup (parent_wrk->session_index_by_vpp_handles); - vls_table_wlock (); + vls_table_rlock (); /* *INDENT-OFF* */ pool_foreach (s, wrk->sessions, ({ @@ -405,7 +405,7 @@ vls_worker_copy_on_fork (vcl_worker_t * parent_wrk) })); /* *INDENT-ON* */ - vls_table_wunlock (); + vls_table_runlock (); } static void @@ -468,7 +468,7 @@ vls_mt_rel_locks (int locks_acq) #define vls_mt_guard(_vls, _op) \ int _locks_acq = 0; \ - if (PREDICT_FALSE (vcl_get_worker_index () == ~0)); \ + if (PREDICT_FALSE (vcl_get_worker_index () == ~0)) \ vls_mt_add (); \ if (PREDICT_FALSE (vlsl->vls_mt_n_threads > 1)) \ vls_mt_acq_locks (_vls, _op, &_locks_acq); \ @@ -562,6 +562,9 @@ vls_attr (vls_handle_t vlsh, uint32_t op, void *buffer, uint32_t * buflen) vcl_locked_session_t *vls; int rv; + if (PREDICT_FALSE (vcl_get_worker_index () == ~0)) + vls_mt_add (); + if (!(vls = vls_get_w_dlock (vlsh))) return VPPCOM_EBADFD; rv = vppcom_session_attr (vls_to_sh_tu (vls), op, buffer, buflen); @@ -735,6 +738,9 @@ vls_epoll_create (void) vcl_session_handle_t sh; vls_handle_t vlsh; + if (PREDICT_FALSE (vcl_get_worker_index () == ~0)) + vls_mt_add (); + sh = vppcom_epoll_create (); if (sh == INVALID_SESSION_ID) return VLS_INVALID_HANDLE; @@ -862,6 +868,9 @@ vls_unshare_vcl_worker_sessions (vcl_worker_t * wrk) vcl_locked_session_t *vls; vcl_session_t *s; + if (pool_elts (vcm->workers) <= 1) + return; + current_wrk = vcl_get_worker_index (); is_current = current_wrk == wrk->wrk_index; vls_table_wlock ();