X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibmemory%2Fmemory_client.c;h=9f533019c8748f2d819029b03a64ffc30be196bc;hb=b384b543313b6b47a277c903e9d4fcd4343054fa;hp=3f8b799f41f56793cbbfe91ffa17f1b4fe2c7516;hpb=59b2565cd91a67ced650739f36129650830211ac;p=vpp.git diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c index 3f8b799f41f..9f533019c87 100644 --- a/src/vlibmemory/memory_client.c +++ b/src/vlibmemory/memory_client.c @@ -17,33 +17,16 @@ *------------------------------------------------------------------ */ -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include + +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include +#include + +/* A hack. vl_client_get_first_plugin_msg_id depends on it */ +#include #include @@ -77,9 +60,10 @@ memory_client_main_t memory_client_main; static void * rx_thread_fn (void *arg) { - unix_shared_memory_queue_t *q; + svm_queue_t *q; memory_client_main_t *mm = &memory_client_main; api_main_t *am = &api_main; + int i; q = am->vl_input_queue; @@ -87,10 +71,27 @@ rx_thread_fn (void *arg) if (setjmp (mm->rx_thread_jmpbuf) == 0) { mm->rx_thread_jmpbuf_valid = 1; - while (1) + /* + * Find an unused slot in the per-cpu-mheaps array, + * and grab it for this thread. We need to be able to + * push/pop the thread heap without affecting other thread(s). + */ + if (__os_thread_index == 0) { - vl_msg_api_queue_handler (q); + for (i = 0; i < ARRAY_LEN (clib_per_cpu_mheaps); i++) + { + if (clib_per_cpu_mheaps[i] == 0) + { + /* Copy the main thread mheap pointer */ + clib_per_cpu_mheaps[i] = clib_per_cpu_mheaps[0]; + __os_thread_index = i; + break; + } + } + ASSERT (__os_thread_index > 0); } + while (1) + vl_msg_api_queue_handler (q); } pthread_exit (0); } @@ -138,7 +139,7 @@ vl_api_memclnt_create_reply_t_handler (vl_api_memclnt_create_reply_t * mp) /* Recreate the vnet-side API message handler table */ tblv = uword_to_pointer (mp->message_table, u8 *); - serialize_open_vector (sm, tblv); + unserialize_open_data (sm, tblv, vec_len (tblv)); unserialize_integer (sm, &nmsgs, sizeof (u32)); for (i = 0; i < nmsgs; i++) @@ -160,7 +161,7 @@ vl_client_connect (const char *name, int ctx_quota, int input_queue_size) svm_region_t *svm; vl_api_memclnt_create_t *mp; vl_api_memclnt_create_reply_t *rp; - unix_shared_memory_queue_t *vl_input_queue; + svm_queue_t *vl_input_queue; vl_shmem_hdr_t *shmem_hdr; int rv = 0; void *oldheap; @@ -189,8 +190,7 @@ vl_client_connect (const char *name, int ctx_quota, int input_queue_size) pthread_mutex_lock (&svm->mutex); oldheap = svm_push_data_heap (svm); - vl_input_queue = - unix_shared_memory_queue_init (input_queue_size, sizeof (uword), + vl_input_queue = svm_queue_init (input_queue_size, sizeof (uword), getpid (), 0); pthread_mutex_unlock (&svm->mutex); svm_pop_heap (oldheap); @@ -217,8 +217,8 @@ vl_client_connect (const char *name, int ctx_quota, int input_queue_size) /* Wait up to 10 seconds */ for (i = 0; i < 1000; i++) { - qstatus = unix_shared_memory_queue_sub (vl_input_queue, (u8 *) & rp, - 1 /* nowait */ ); + qstatus = svm_queue_sub (vl_input_queue, (u8 *) & rp, + SVM_Q_NOWAIT, 0); if (qstatus == 0) goto read_one_msg; ts.tv_sec = 0; @@ -252,7 +252,7 @@ vl_api_memclnt_delete_reply_t_handler (vl_api_memclnt_delete_reply_t * mp) pthread_mutex_lock (&am->vlib_rp->mutex); oldheap = svm_push_data_heap (am->vlib_rp); - unix_shared_memory_queue_free (am->vl_input_queue); + svm_queue_free (am->vl_input_queue); pthread_mutex_unlock (&am->vlib_rp->mutex); svm_pop_heap (oldheap); @@ -266,7 +266,7 @@ vl_client_disconnect (void) { vl_api_memclnt_delete_t *mp; vl_api_memclnt_delete_reply_t *rp; - unix_shared_memory_queue_t *vl_input_queue; + svm_queue_t *vl_input_queue; vl_shmem_hdr_t *shmem_hdr; time_t begin; api_main_t *am = &api_main; @@ -289,7 +289,6 @@ vl_client_disconnect (void) * Have to be careful here, in case the client is disconnecting * because e.g. the vlib process died, or is unresponsive. */ - begin = time (0); while (1) { @@ -305,12 +304,13 @@ vl_client_disconnect (void) am->shmem_hdr = 0; break; } - if (unix_shared_memory_queue_sub (vl_input_queue, (u8 *) & rp, 1) < 0) + if (svm_queue_sub (vl_input_queue, (u8 *) & rp, SVM_Q_NOWAIT, 0) < 0) continue; /* drain the queue */ if (ntohs (rp->_vl_msg_id) != VL_API_MEMCLNT_DELETE_REPLY) { + clib_warning ("queue drain: %d", ntohs (rp->_vl_msg_id)); vl_msg_api_handler ((void *) rp); continue; } @@ -346,7 +346,6 @@ _(MEMCLNT_CREATE_REPLY, memclnt_create_reply) \ _(MEMCLNT_DELETE_REPLY, memclnt_delete_reply) \ _(MEMCLNT_KEEPALIVE, memclnt_keepalive) - void vl_client_install_client_message_handlers (void) { @@ -362,7 +361,6 @@ vl_client_install_client_message_handlers (void) #undef _ } - int vl_client_api_map (const char *region_name) { @@ -381,6 +379,12 @@ vl_client_api_unmap (void) vl_unmap_shmem (); } +u8 +vl_mem_client_is_connected (void) +{ + return (memory_client_main.connected_to_vlib != 0); +} + static int connect_to_vlib_internal (const char *svm_name, const char *client_name, @@ -444,8 +448,8 @@ vl_client_connect_to_vlib_no_map (const char *svm_name, 0 /* dont map */ ); } -void -vl_client_disconnect_from_vlib (void) +static void +disconnect_from_vlib_internal (u8 do_unmap) { memory_client_main_t *mm = &memory_client_main; api_main_t *am = &api_main; @@ -462,11 +466,24 @@ vl_client_disconnect_from_vlib (void) if (mm->connected_to_vlib) { vl_client_disconnect (); - vl_client_api_unmap (); + if (do_unmap) + vl_client_api_unmap (); } memset (mm, 0, sizeof (*mm)); } +void +vl_client_disconnect_from_vlib (void) +{ + disconnect_from_vlib_internal (1); +} + +void +vl_client_disconnect_from_vlib_no_unmap (void) +{ + disconnect_from_vlib_internal (0); +} + static void vl_api_get_first_msg_id_reply_t_handler (vl_api_get_first_msg_id_reply_t * mp) { @@ -502,19 +519,44 @@ vl_client_get_first_plugin_msg_id (const char *plugin_name) /* Ask the data-plane for the message-ID base of the indicated plugin */ mm->first_msg_id_reply_ready = 0; - mp = vl_msg_api_alloc (sizeof (*mp)); - memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_GET_FIRST_MSG_ID); - mp->client_index = am->my_client_index; - strncpy ((char *) mp->name, plugin_name, sizeof (mp->name) - 1); + /* Not using shm client */ + if (!am->my_registration) + { + mp = vl_socket_client_msg_alloc (sizeof (*mp)); + memset (mp, 0, sizeof (*mp)); + mp->_vl_msg_id = ntohs (VL_API_GET_FIRST_MSG_ID); + mp->client_index = am->my_client_index; + strncpy ((char *) mp->name, plugin_name, sizeof (mp->name) - 1); + + if (vl_socket_client_write () <= 0) + goto sock_err; + if (vl_socket_client_read (1)) + goto sock_err; + + if (mm->first_msg_id_reply_ready == 1) + { + rv = mm->first_msg_id_reply; + goto result; + } - vl_msg_api_send_shmem (am->shmem_hdr->vl_input_queue, (u8 *) & mp); + sock_err: + /* Restore old handler */ + am->msg_handlers[VL_API_GET_FIRST_MSG_ID_REPLY] = old_handler; - /* Synchronously wait for the answer */ - do + return -1; + } + else { - timeout = clib_time_now (&clib_time) + 1.0; + mp = vl_msg_api_alloc (sizeof (*mp)); + memset (mp, 0, sizeof (*mp)); + mp->_vl_msg_id = ntohs (VL_API_GET_FIRST_MSG_ID); + mp->client_index = am->my_client_index; + strncpy ((char *) mp->name, plugin_name, sizeof (mp->name) - 1); + + vl_msg_api_send_shmem (am->shmem_hdr->vl_input_queue, (u8 *) & mp); + /* Synchronously wait for the answer */ + timeout = clib_time_now (&clib_time) + 1.0; while (clib_time_now (&clib_time) < timeout) { if (mm->first_msg_id_reply_ready == 1) @@ -528,7 +570,6 @@ vl_client_get_first_plugin_msg_id (const char *plugin_name) return rv; } - while (0); result: @@ -541,12 +582,6 @@ result: return rv; } -void -vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n) -{ - clib_warning ("STUB called..."); -} - /* * fd.io coding-style-patch-verification: ON *