X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibmemory%2Fmemory_api.c;h=b5f3fae232e7f8fe331d196553d8c9ce2e793802;hb=ba4677063688beb62eb2f14e6c22ebbc92cce33d;hp=42d1ee08a9f67843403c3834916095cb226678b4;hpb=9fb6d40eb3d4a2da8f45187de773498b784596e6;p=vpp.git diff --git a/src/vlibmemory/memory_api.c b/src/vlibmemory/memory_api.c index 42d1ee08a9f..b5f3fae232e 100644 --- a/src/vlibmemory/memory_api.c +++ b/src/vlibmemory/memory_api.c @@ -64,7 +64,7 @@ static void memclnt_queue_callback (vlib_main_t * vm) { int i; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); if (PREDICT_FALSE (vec_len (vl_api_queue_cursizes) != 1 + vec_len (am->vlib_private_rps))) @@ -121,31 +121,27 @@ vl_api_memclnt_create_internal (char *name, svm_queue_t * q) { vl_api_registration_t **regpp; vl_api_registration_t *regp; - svm_region_t *svm; void *oldheap; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); ASSERT (vlib_get_thread_index () == 0); pool_get (am->vl_clients, regpp); - svm = am->vlib_rp; - pthread_mutex_lock (&svm->mutex); - oldheap = svm_push_data_heap (svm); + oldheap = vl_msg_push_heap (); *regpp = clib_mem_alloc (sizeof (vl_api_registration_t)); regp = *regpp; clib_memset (regp, 0, sizeof (*regp)); regp->registration_type = REGISTRATION_TYPE_SHMEM; regp->vl_api_registration_pool_index = regpp - am->vl_clients; - regp->vlib_rp = svm; + regp->vlib_rp = am->vlib_rp; regp->shmem_hdr = am->shmem_hdr; regp->vl_input_queue = q; regp->name = format (0, "%s%c", name, 0); - pthread_mutex_unlock (&svm->mutex); - svm_pop_heap (oldheap); + vl_msg_pop_heap (oldheap); return vl_msg_api_handle_from_index_and_epoch (regp->vl_api_registration_pool_index, am->shmem_hdr->application_restarts); @@ -160,11 +156,10 @@ vl_api_memclnt_create_t_handler (vl_api_memclnt_create_t * mp) vl_api_registration_t **regpp; vl_api_registration_t *regp; vl_api_memclnt_create_reply_t *rp; - svm_region_t *svm; svm_queue_t *q; int rv = 0; void *oldheap; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); u8 *msg_table; /* @@ -195,17 +190,14 @@ vl_api_memclnt_create_t_handler (vl_api_memclnt_create_t * mp) pool_get (am->vl_clients, regpp); - svm = am->vlib_rp; - - pthread_mutex_lock (&svm->mutex); - oldheap = svm_push_data_heap (svm); + oldheap = vl_msg_push_heap (); *regpp = clib_mem_alloc (sizeof (vl_api_registration_t)); regp = *regpp; clib_memset (regp, 0, sizeof (*regp)); regp->registration_type = REGISTRATION_TYPE_SHMEM; regp->vl_api_registration_pool_index = regpp - am->vl_clients; - regp->vlib_rp = svm; + regp->vlib_rp = am->vlib_rp; regp->shmem_hdr = am->shmem_hdr; regp->clib_file_index = am->shmem_hdr->clib_file_index; @@ -224,8 +216,7 @@ vl_api_memclnt_create_t_handler (vl_api_memclnt_create_t * mp) else msg_table = am->serialized_message_table_in_shmem; - pthread_mutex_unlock (&svm->mutex); - svm_pop_heap (oldheap); + vl_msg_pop_heap (oldheap); rp = vl_msg_api_alloc (sizeof (*rp)); rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_CREATE_REPLY); @@ -246,7 +237,7 @@ vl_api_call_reaper_functions (u32 client_index) clib_error_t *error = 0; _vl_msg_api_function_list_elt_t *i; - i = api_main.reaper_function_registrations; + i = vlibapi_get_main ()->reaper_function_registrations; while (i) { error = i->f (client_index); @@ -266,9 +257,8 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) vl_api_registration_t **regpp; vl_api_registration_t *regp; vl_api_memclnt_delete_reply_t *rp; - svm_region_t *svm; void *oldheap; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); u32 handle, client_index, epoch; handle = mp->index; @@ -294,7 +284,6 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) { int i; regp = *regpp; - svm = am->vlib_rp; int private_registration = 0; /* Send reply unless client asked us to do the cleanup */ @@ -327,11 +316,11 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) for (i = 0; i < vec_len (am->vlib_private_rps); i++) { /* Is this a pairwise / private API segment? */ - if (am->vlib_private_rps[i] == svm) + if (am->vlib_private_rps[i] == am->vlib_rp) { /* Note: account for the memfd header page */ - uword virtual_base = svm->virtual_base - MMAP_PAGESIZE; - uword virtual_size = svm->virtual_size + MMAP_PAGESIZE; + uword virtual_base = am->vlib_rp->virtual_base - MMAP_PAGESIZE; + uword virtual_size = am->vlib_rp->virtual_size + MMAP_PAGESIZE; /* * Kill the registration pool element before we make @@ -355,16 +344,14 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp) { pool_put_index (am->vl_clients, regp->vl_api_registration_pool_index); - pthread_mutex_lock (&svm->mutex); - oldheap = svm_push_data_heap (svm); + oldheap = vl_msg_push_heap (); 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)); clib_mem_free (regp); - pthread_mutex_unlock (&svm->mutex); - svm_pop_heap (oldheap); + vl_msg_pop_heap (oldheap); /* * These messages must be freed manually, since they're set up * as "bounce" messages. In the private_registration == 1 case, @@ -411,7 +398,7 @@ vl_api_memclnt_keepalive_t_handler (vl_api_memclnt_keepalive_t * mp) api_main_t *am; vl_shmem_hdr_t *shmem_hdr; - am = &api_main; + am = vlibapi_get_main (); shmem_hdr = am->shmem_hdr; rmp = vl_msg_api_alloc_as_if_client (sizeof (*rmp)); @@ -439,7 +426,7 @@ int vl_mem_api_init (const char *region_name) { int rv; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_msg_api_msg_config_t cfg; vl_msg_api_msg_config_t *c = &cfg; vl_shmem_hdr_t *shm; @@ -488,7 +475,7 @@ vl_mem_api_init (const char *region_name) clib_error_t * map_api_segment_init (vlib_main_t * vm) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); int rv; if ((rv = vl_mem_api_init (am->region_name)) < 0) @@ -504,9 +491,7 @@ send_memclnt_keepalive (vl_api_registration_t * regp, f64 now) { vl_api_memclnt_keepalive_t *mp; svm_queue_t *q; - api_main_t *am = &api_main; - svm_region_t *save_vlib_rp = am->vlib_rp; - vl_shmem_hdr_t *save_shmem_hdr = am->shmem_hdr; + api_main_t *am = vlibapi_get_main (); q = regp->vl_input_queue; @@ -530,10 +515,7 @@ send_memclnt_keepalive (vl_api_registration_t * regp, f64 now) * memory clients.. */ - am->vlib_rp = regp->vlib_rp; - am->shmem_hdr = regp->shmem_hdr; - - mp = vl_msg_api_alloc (sizeof (*mp)); + mp = vl_mem_api_alloc_as_if_client_w_reg (regp, sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); mp->_vl_msg_id = clib_host_to_net_u16 (VL_API_MEMCLNT_KEEPALIVE); mp->context = mp->client_index = @@ -545,10 +527,7 @@ send_memclnt_keepalive (vl_api_registration_t * regp, f64 now) /* Failure-to-send due to a stuffed queue is absolutely expected */ if (svm_queue_add (q, (u8 *) & mp, 1 /* nowait */ )) - vl_msg_api_free (mp); - - am->vlib_rp = save_vlib_rp; - am->shmem_hdr = save_shmem_hdr; + vl_msg_api_free_w_region (regp->vlib_rp, mp); } static void @@ -625,7 +604,6 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) if (PREDICT_FALSE (vec_len (dead_indices) > 0)) { int i; - svm_region_t *svm; void *oldheap; /* Allow the application to clean up its registrations */ @@ -642,9 +620,7 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) } } - svm = am->vlib_rp; - pthread_mutex_lock (&svm->mutex); - oldheap = svm_push_data_heap (svm); + oldheap = vl_msg_push_heap (); for (i = 0; i < vec_len (dead_indices); i++) { @@ -652,7 +628,7 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) if (regpp) { /* Is this a pairwise SVM segment? */ - if ((*regpp)->vlib_rp != svm) + if ((*regpp)->vlib_rp != am->vlib_rp) { int i; svm_region_t *dead_rp = (*regpp)->vlib_rp; @@ -669,7 +645,7 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) } svm_pop_heap (oldheap); clib_warning ("private rp %llx AWOL", dead_rp); - oldheap = svm_push_data_heap (svm); + oldheap = svm_push_data_heap (am->vlib_rp); found: /* Kill it, accounting for the memfd header page */ @@ -678,7 +654,7 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) clib_unix_warning ("munmap"); /* Reset the queue-length-address cache */ vec_reset_length (vl_api_queue_cursizes); - oldheap = svm_push_data_heap (svm); + oldheap = svm_push_data_heap (am->vlib_rp); } else { @@ -694,28 +670,33 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) svm_pop_heap (oldheap); clib_warning ("Duplicate free, client index %d", regpp - am->vl_clients); - oldheap = svm_push_data_heap (svm); + oldheap = svm_push_data_heap (am->vlib_rp); } } svm_client_scan_this_region_nolock (am->vlib_rp); - pthread_mutex_unlock (&svm->mutex); - svm_pop_heap (oldheap); + vl_msg_pop_heap (oldheap); for (i = 0; i < vec_len (dead_indices); i++) pool_put_index (am->vl_clients, dead_indices[i]); } } static inline int -void_mem_api_handle_msg_i (api_main_t * am, vlib_main_t * vm, - vlib_node_runtime_t * node, svm_queue_t * q) +void_mem_api_handle_msg_i (api_main_t * am, svm_region_t * vlib_rp, + vlib_main_t * vm, vlib_node_runtime_t * node, + u8 is_private) { + svm_queue_t *q; uword mp; + + q = ((vl_shmem_hdr_t *) (void *) vlib_rp->user_ctx)->vl_input_queue; + if (!svm_queue_sub2 (q, (u8 *) & mp)) { VL_MSG_API_UNPOISON ((void *) mp); - vl_msg_api_handler_with_vm_node (am, (void *) mp, vm, node); + vl_msg_api_handler_with_vm_node (am, vlib_rp, (void *) mp, vm, node, + is_private); return 0; } return -1; @@ -724,15 +705,15 @@ void_mem_api_handle_msg_i (api_main_t * am, vlib_main_t * vm, int vl_mem_api_handle_msg_main (vlib_main_t * vm, vlib_node_runtime_t * node) { - api_main_t *am = &api_main; - return void_mem_api_handle_msg_i (am, vm, node, - am->shmem_hdr->vl_input_queue); + api_main_t *am = vlibapi_get_main (); + return void_mem_api_handle_msg_i (am, am->vlib_rp, vm, node, + 0 /* is_private */ ); } int vl_mem_api_handle_rpc (vlib_main_t * vm, vlib_node_runtime_t * node) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); int i; uword *tmp, mp; @@ -764,7 +745,8 @@ vl_mem_api_handle_rpc (vlib_main_t * vm, vlib_node_runtime_t * node) for (i = 0; i < vec_len (vm->processing_rpc_requests); i++) { mp = vm->processing_rpc_requests[i]; - vl_msg_api_handler_with_vm_node (am, (void *) mp, vm, node); + vl_msg_api_handler_with_vm_node (am, am->vlib_rp, (void *) mp, vm, + node, 0 /* is_private */ ); } vl_msg_api_barrier_release (); } @@ -776,23 +758,9 @@ int vl_mem_api_handle_msg_private (vlib_main_t * vm, vlib_node_runtime_t * node, u32 reg_index) { - api_main_t *am = &api_main; - vl_shmem_hdr_t *save_shmem_hdr = am->shmem_hdr; - svm_region_t *vlib_rp, *save_vlib_rp = am->vlib_rp; - svm_queue_t *q; - int rv; - - vlib_rp = am->vlib_rp = am->vlib_private_rps[reg_index]; - - am->shmem_hdr = (void *) vlib_rp->user_ctx; - q = am->shmem_hdr->vl_input_queue; - - rv = void_mem_api_handle_msg_i (am, vm, node, q); - - am->shmem_hdr = save_shmem_hdr; - am->vlib_rp = save_vlib_rp; - - return rv; + api_main_t *am = vlibapi_get_main (); + return void_mem_api_handle_msg_i (am, am->vlib_private_rps[reg_index], vm, + node, 1 /* is_private */ ); } vl_api_registration_t * @@ -800,7 +768,7 @@ vl_mem_api_client_index_to_registration (u32 handle) { vl_api_registration_t **regpp; vl_api_registration_t *regp; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_shmem_hdr_t *shmem_hdr; u32 index; @@ -828,7 +796,7 @@ svm_queue_t * vl_api_client_index_to_input_queue (u32 index) { vl_api_registration_t *regp; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); /* Special case: vlib trying to send itself a message */ if (index == (u32) ~ 0) @@ -898,7 +866,7 @@ vl_api_ring_command (vlib_main_t * vm, { int i; vl_shmem_hdr_t *shmem_hdr; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); /* First, dump the primary region rings.. */ @@ -964,7 +932,7 @@ VLIB_CLI_COMMAND (cli_show_api_ring_command, static) = clib_error_t * vlibmemory_init (vlib_main_t * vm) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); svm_map_region_args_t _a, *a = &_a; u8 *remove_path1, *remove_path2; void vlibsocket_reference (void); @@ -1013,7 +981,7 @@ vlibmemory_init (vlib_main_t * vm) void vl_set_memory_region_name (const char *name) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); am->region_name = name; }