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 <fcoras@cisco.com>
This commit is contained in:

committed by
Dave Barach

parent
955bfbbb69
commit
eaec2a6d9a
@ -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);
|
||||
|
||||
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 */ );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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 {
|
||||
|
@ -296,6 +296,9 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
|
||||
svm = am->vlib_rp;
|
||||
int private_registration = 0;
|
||||
|
||||
/* Send reply unless client asked us to do the cleanup */
|
||||
if (!mp->do_cleanup)
|
||||
{
|
||||
/*
|
||||
* Note: the API message handling path will set am->vlib_rp
|
||||
* as appropriate for pairwise / private memory segments
|
||||
@ -306,14 +309,15 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
|
||||
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);
|
||||
client_index,
|
||||
regp->vl_api_registration_pool_index);
|
||||
vl_msg_api_free (rp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* For horizontal scaling, add a hash table... */
|
||||
for (i = 0; i < vec_len (am->vlib_private_rps); i++)
|
||||
@ -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));
|
||||
|
@ -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
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <vlibmemory/memory_shared.h>
|
||||
|
||||
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);
|
||||
|
Reference in New Issue
Block a user