diff --git a/src/vcl/vcl_cfg.c b/src/vcl/vcl_cfg.c index be142eaeb..6fa4e63cc 100644 --- a/src/vcl/vcl_cfg.c +++ b/src/vcl/vcl_cfg.c @@ -62,7 +62,7 @@ vppcom_cfg_heapsize (char *conf_fname) char *p; int i; u8 *sizep; - u32 size; + uword size; void *vcl_mem; void *heap; diff --git a/src/vcl/vcl_locked.c b/src/vcl/vcl_locked.c index 563d97ef8..15e365be3 100644 --- a/src/vcl/vcl_locked.c +++ b/src/vcl/vcl_locked.c @@ -1768,11 +1768,14 @@ vls_app_pre_fork (void) { vls_incercept_sigchld (); vcl_flush_mq_events (); + vcm->forking = 1; } static void vls_app_fork_child_handler (void) { + clib_spinlock_lock (&vcm->fork_workers_lock); + vcl_worker_t *parent_wrk; int parent_wrk_index; @@ -1791,6 +1794,8 @@ vls_app_fork_child_handler (void) if (vppcom_worker_register ()) { VERR ("couldn't register new worker!"); + vcm->forking = 0; + clib_spinlock_unlock (&vcm->fork_workers_lock); return; } @@ -1812,12 +1817,15 @@ vls_app_fork_child_handler (void) VDBG (0, "forked child main worker initialized"); vcm->forking = 0; + + clib_spinlock_unlock (&vcm->fork_workers_lock); } static void vls_app_fork_parent_handler (void) { - vcm->forking = 1; + //vcm->forking = 1; while (vcm->forking) ; } @@ -1825,6 +1833,9 @@ vls_app_fork_parent_handler (void) void vls_app_exit (void) { + //unlock in vppcom_app_exit + clib_spinlock_lock (&vcm->fork_workers_lock); + vls_worker_t *wrk = vls_worker_get_current (); /* Handle pending wrk cleanup */ diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h index 39a0f0503..b9b3f68b4 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -344,6 +344,9 @@ typedef struct vppcom_main_t_ /** Lock to protect worker registrations */ clib_spinlock_t workers_lock; + /** Lock to protect worker registrations when fork/exit child*/ + clib_spinlock_t fork_workers_lock; + /** Counter to determine order of execution of `vcl_api_retry_attach` * function by multiple workers */ int reattach_count; diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index f2166f851..d8c8f4591 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -1261,6 +1261,9 @@ vppcom_app_exit (void) vcl_worker_cleanup (vcl_worker_get_current (), 1 /* notify vpp */ ); vcl_set_worker_index (~0); vcl_elog_stop (vcm); + + //lock in vls_app_exit + clib_spinlock_unlock (&vcm->fork_workers_lock); } static int @@ -1382,6 +1385,7 @@ vppcom_app_create (const char *app_name) 20 /* timeout in secs */); pool_alloc (vcm->workers, vcl_cfg->max_workers); clib_spinlock_init (&vcm->workers_lock); + clib_spinlock_init (&vcm->fork_workers_lock); clib_rwlock_init (&vcm->segment_table_lock); atexit (vppcom_app_exit); vcl_elog_init (vcm); diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c index b0f4a93ee..5807f1cec 100644 --- a/src/vnet/session/session_node.c +++ b/src/vnet/session/session_node.c @@ -280,7 +280,8 @@ session_mq_connect_handler (session_worker_t *wrk, session_evt_elt_t *elt) he = clib_llist_elt (wrk->event_elts, wrk->evts_pending_main); /* Events pending on main, postpone to avoid reordering */ - if (!clib_llist_is_empty (wrk->event_elts, evt_list, he)) + if (_lprev(he, evt_list) != _lnext(he, evt_list)) + //if (!clib_llist_is_empty (wrk->event_elts, evt_list, he)) { clib_llist_add_tail (wrk->event_elts, evt_list, elt, he); return;