From eaec2a6d9ab8b983aaee536be1a95846c07a9d7f Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 4 Dec 2018 16:34:05 -0800 Subject: [PATCH] bapi: add options to have vpp cleanup client registration A client can send a memclnt delete message and ask vpp to cleanup the shared memory queue. Obviously, in this case no delete reply is sent back to the client. Change-Id: I9c8375093f8607680ad498a6bed0690ba02a7c3b Signed-off-by: Florin Coras --- src/vcl/vppcom.c | 13 ++++++++----- src/vlibmemory/memclnt.api | 3 ++- src/vlibmemory/memory_api.c | 38 ++++++++++++++++++++++---------------- src/vlibmemory/memory_client.c | 5 +++-- src/vlibmemory/memory_client.h | 2 +- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index dbb0d657b8d..0eaab6cbd6b 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -737,14 +737,17 @@ vcl_intercept_sigchld_handler (int signum, siginfo_t * si, void *uc) return; child_wrk = vcl_worker_get_if_valid (wrk->forked_child); - if (si->si_pid != child_wrk->current_pid) + if (!child_wrk) + goto done; + + if (si && si->si_pid != child_wrk->current_pid) { VDBG (0, "unexpected child pid %u", si->si_pid); - return; + goto done; } - if (child_wrk) - vcl_cleanup_forked_child (wrk, child_wrk); + vcl_cleanup_forked_child (wrk, child_wrk); +done: if (old_sa.sa_flags & SA_SIGINFO) { void (*fn) (int, siginfo_t *, void *) = old_sa.sa_sigaction; @@ -848,7 +851,7 @@ vppcom_app_exit (void) if (vec_len (vcm->workers) == 1) vl_client_disconnect_from_vlib (); else - vl_client_send_disconnect (); + vl_client_send_disconnect (1 /* vpp should cleanup */ ); } /* diff --git a/src/vlibmemory/memclnt.api b/src/vlibmemory/memclnt.api index 451bc0e5fae..4802732a07b 100644 --- a/src/vlibmemory/memclnt.api +++ b/src/vlibmemory/memclnt.api @@ -14,7 +14,7 @@ * limitations under the License. */ -option version = "2.0.0"; +option version = "2.1.0"; /* * Define services not following the normal conventions here @@ -53,6 +53,7 @@ manual_print define memclnt_delete { u32 index; /* index, used e.g. by API trace replay */ u64 handle; /* handle by which vlib knows this client */ + u8 do_cleanup; /* vlib to cleanup the registration */ }; define memclnt_delete_reply { diff --git a/src/vlibmemory/memory_api.c b/src/vlibmemory/memory_api.c index 544e59ddb69..cb15f0c762d 100644 --- a/src/vlibmemory/memory_api.c +++ b/src/vlibmemory/memory_api.c @@ -296,23 +296,27 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) svm = am->vlib_rp; int private_registration = 0; - /* - * Note: the API message handling path will set am->vlib_rp - * as appropriate for pairwise / private memory segments - */ - rp = vl_msg_api_alloc (sizeof (*rp)); - rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY); - rp->handle = mp->handle; - rp->response = 1; - - vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp); - - if (client_index != regp->vl_api_registration_pool_index) + /* Send reply unless client asked us to do the cleanup */ + if (!mp->do_cleanup) { - clib_warning ("mismatch client_index %d pool_index %d", - client_index, regp->vl_api_registration_pool_index); - vl_msg_api_free (rp); - return; + /* + * Note: the API message handling path will set am->vlib_rp + * as appropriate for pairwise / private memory segments + */ + rp = vl_msg_api_alloc (sizeof (*rp)); + rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY); + rp->handle = mp->handle; + rp->response = 1; + + vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp); + if (client_index != regp->vl_api_registration_pool_index) + { + clib_warning ("mismatch client_index %d pool_index %d", + client_index, + regp->vl_api_registration_pool_index); + vl_msg_api_free (rp); + return; + } } /* For horizontal scaling, add a hash table... */ @@ -352,6 +356,8 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) regp->vl_api_registration_pool_index); pthread_mutex_lock (&svm->mutex); oldheap = svm_push_data_heap (svm); + if (mp->do_cleanup) + svm_queue_free (regp->vl_input_queue); vec_free (regp->name); /* Poison the old registration */ clib_memset (regp, 0xF1, sizeof (*regp)); diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c index 79344a6af68..3add39a4328 100644 --- a/src/vlibmemory/memory_client.c +++ b/src/vlibmemory/memory_client.c @@ -271,7 +271,7 @@ vl_api_memclnt_delete_reply_t_handler (vl_api_memclnt_delete_reply_t * mp) } void -vl_client_send_disconnect (void) +vl_client_send_disconnect (u8 do_cleanup) { vl_api_memclnt_delete_t *mp; vl_shmem_hdr_t *shmem_hdr; @@ -286,6 +286,7 @@ vl_client_send_disconnect (void) mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE); mp->index = am->my_client_index; mp->handle = (uword) am->my_registration; + mp->do_cleanup = do_cleanup; vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & mp); } @@ -299,7 +300,7 @@ vl_client_disconnect (void) time_t begin; vl_input_queue = am->vl_input_queue; - vl_client_send_disconnect (); + vl_client_send_disconnect (0 /* wait for reply */ ); /* * Have to be careful here, in case the client is disconnecting diff --git a/src/vlibmemory/memory_client.h b/src/vlibmemory/memory_client.h index eb3431a51e6..6aaf6d7e569 100644 --- a/src/vlibmemory/memory_client.h +++ b/src/vlibmemory/memory_client.h @@ -21,7 +21,7 @@ #include int vl_client_connect (const char *name, int ctx_quota, int input_queue_size); -void vl_client_send_disconnect (void); +void vl_client_send_disconnect (u8 do_cleanup); int vl_client_disconnect (void); int vl_client_api_map (const char *region_name); void vl_client_api_unmap (void); -- 2.16.6