X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsegment_manager.c;h=a4438c7aeeab0b60116721d0b2b08b19bece9e1d;hb=288eaab5964b9211350acad8d742fae4789577fe;hp=bf62040271f09b9b36492c0ea7be4e4d511c36db;hpb=568ebc76b594f8f29bb131b252031d72c055e0b0;p=vpp.git diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index bf62040271f..a4438c7aeea 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Cisco and/or its affiliates. + * Copyright (c) 2017-2019 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -82,7 +82,7 @@ segment_manager_del_segment (segment_manager_t * sm, ssvm_delete (&fs->ssvm); if (CLIB_DEBUG) - memset (fs, 0xfb, sizeof (*fs)); + clib_memset (fs, 0xfb, sizeof (*fs)); pool_put (sm->segments, fs); } @@ -117,6 +117,36 @@ segment_manager_get_segment (segment_manager_t * sm, u32 segment_index) return pool_elt_at_index (sm->segments, segment_index); } +u64 +segment_manager_segment_handle (segment_manager_t * sm, + svm_fifo_segment_private_t * segment) +{ + u32 segment_index = segment_manager_segment_index (sm, segment); + return (((u64) segment_manager_index (sm) << 32) | segment_index); +} + +void +segment_manager_parse_segment_handle (u64 segment_handle, u32 * sm_index, + u32 * segment_index) +{ + *sm_index = segment_handle >> 32; + *segment_index = segment_handle & 0xFFFFFFFF; +} + +svm_fifo_segment_private_t * +segment_manager_get_segment_w_handle (u64 segment_handle) +{ + u32 sm_index, segment_index; + segment_manager_t *sm; + + segment_manager_parse_segment_handle (segment_handle, &sm_index, + &segment_index); + sm = segment_manager_get (sm_index); + if (!sm || pool_is_free_index (sm->segments, segment_index)) + return 0; + return pool_elt_at_index (sm->segments, segment_index); +} + /** * Reads a segment from the segment manager's pool and acquires reader lock * @@ -156,7 +186,7 @@ segment_manager_add_segment (segment_manager_t * sm, u32 segment_size) segment_manager_main_t *smm = &segment_manager_main; u32 rnd_margin = 128 << 10, seg_index, page_size; segment_manager_properties_t *props; - uword baseva = (u64) ~ 0, alloc_size; + uword baseva = (uword) ~ 0ULL, alloc_size; svm_fifo_segment_private_t *seg; u8 *seg_name; int rv; @@ -182,7 +212,7 @@ segment_manager_add_segment (segment_manager_t * sm, u32 segment_size) { pool_get (sm->segments, seg); } - memset (seg, 0, sizeof (*seg)); + clib_memset (seg, 0, sizeof (*seg)); /* * Initialize ssvm segment and svm fifo private header @@ -238,7 +268,7 @@ segment_manager_new () segment_manager_main_t *smm = &segment_manager_main; segment_manager_t *sm; pool_get (smm->segment_managers, sm); - memset (sm, 0, sizeof (*sm)); + clib_memset (sm, 0, sizeof (*sm)); clib_rwlock_init (&sm->segments_rwlock); return sm; } @@ -349,7 +379,7 @@ void segment_manager_del_sessions (segment_manager_t * sm) { svm_fifo_segment_private_t *fifo_segment; - stream_session_t *session; + session_t *session; svm_fifo_t *fifo; ASSERT (pool_elts (sm->segments) != 0); @@ -366,17 +396,17 @@ segment_manager_del_sessions (segment_manager_t * sm) */ while (fifo) { - if (fifo->master_thread_index == 255) + if (fifo->ct_session_index != SVM_FIFO_INVALID_SESSION_INDEX) { svm_fifo_t *next = fifo->next; application_local_session_disconnect_w_index (sm->app_wrk_index, - fifo->master_session_index); + fifo->ct_session_index); fifo = next; continue; } session = session_get (fifo->master_session_index, fifo->master_thread_index); - stream_session_disconnect (session); + session_close (session); fifo = fifo->next; } @@ -419,7 +449,7 @@ segment_manager_del (segment_manager_t * sm) clib_rwlock_free (&sm->segments_rwlock); if (CLIB_DEBUG) - memset (sm, 0xfe, sizeof (*sm)); + clib_memset (sm, 0xfe, sizeof (*sm)); pool_put (smm->segment_managers, sm); } @@ -484,6 +514,7 @@ segment_manager_alloc_session_fifos (segment_manager_t * sm, int alloc_fail = 1, rv = 0, new_fs_index; segment_manager_properties_t *props; u8 added_a_segment = 0; + u64 segment_handle; u32 sm_index; props = segment_manager_properties_get (sm); @@ -513,13 +544,18 @@ alloc_check: ASSERT (rx_fifo && tx_fifo); sm_index = segment_manager_index (sm); + *fifo_segment_index = segment_manager_segment_index (sm, fifo_segment); (*tx_fifo)->segment_manager = sm_index; (*rx_fifo)->segment_manager = sm_index; - *fifo_segment_index = segment_manager_segment_index (sm, fifo_segment); + (*tx_fifo)->segment_index = *fifo_segment_index; + (*rx_fifo)->segment_index = *fifo_segment_index; if (added_a_segment) - rv = app_worker_add_segment_notify (sm->app_wrk_index, - &fifo_segment->ssvm); + { + segment_handle = segment_manager_segment_handle (sm, fifo_segment); + rv = app_worker_add_segment_notify (sm->app_wrk_index, + segment_handle); + } /* Drop the lock after app is notified */ segment_manager_segment_reader_unlock (sm); return rv; @@ -563,6 +599,9 @@ segment_manager_dealloc_fifos (u32 segment_index, svm_fifo_t * rx_fifo, svm_fifo_segment_private_t *fifo_segment; segment_manager_t *sm; + if (!rx_fifo || !tx_fifo) + return; + /* It's possible to have no segment manager if the session was removed * as result of a detach. */ if (!(sm = segment_manager_get_if_valid (rx_fifo->segment_manager))) @@ -699,8 +738,8 @@ segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input, svm_fifo_segment_private_t *seg; segment_manager_t *sm; u8 show_segments = 0, verbose = 0; - uword address; - u64 size; + char *address; + size_t size; u32 active_fifos; u32 free_fifos;