X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsegment_manager.c;h=2b8a7326ea763b89292b9697d4fc596cb73e26c4;hb=5a2ec8fc41d14ffc5275ab88761c1fb7e0420a33;hp=8dd72928ec433fafceb06a694fac90f5d8e67732;hpb=326b81e30e63a8296df51d85e6514356cd737225;p=vpp.git diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index 8dd72928ec4..2b8a7326ea7 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -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 * @@ -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; } @@ -376,7 +406,7 @@ segment_manager_del_sessions (segment_manager_t * sm) } 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;