aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/hs_apps/proxy.c4
-rw-r--r--src/plugins/hs_apps/sapi/vpp_echo.c6
-rw-r--r--src/plugins/hs_apps/sapi/vpp_echo_bapi.c4
-rw-r--r--src/plugins/unittest/session_test.c2
-rw-r--r--src/svm/fifo_segment.c14
-rw-r--r--src/svm/fifo_types.h30
-rw-r--r--src/svm/svm_fifo.c4
-rw-r--r--src/vcl/vcl_private.c4
-rw-r--r--src/vcl/vppcom.c10
-rw-r--r--src/vnet/session/application_interface.h8
-rw-r--r--src/vnet/session/application_local.c4
-rw-r--r--src/vnet/session/application_worker.c8
-rw-r--r--src/vnet/session/segment_manager.c8
-rw-r--r--src/vnet/session/session.c2
-rw-r--r--src/vnet/session/session_api.c9
-rw-r--r--src/vnet/session/session_debug.c2
-rw-r--r--src/vnet/session/session_node.c4
17 files changed, 77 insertions, 46 deletions
diff --git a/src/plugins/hs_apps/proxy.c b/src/plugins/hs_apps/proxy.c
index 7407bcb9f0d..f6b7f52d80c 100644
--- a/src/plugins/hs_apps/proxy.c
+++ b/src/plugins/hs_apps/proxy.c
@@ -830,7 +830,7 @@ active_open_alloc_session_fifos (session_t *s)
* will receive data, etc.
*/
txf->shr->master_session_index = s->session_index;
- txf->master_thread_index = s->thread_index;
+ txf->vpp_sh = s->handle;
/*
* Account for the active-open session's use of the fifos
@@ -1101,7 +1101,7 @@ active_open_rx_callback (session_t * s)
if (svm_fifo_set_event (proxy_tx_fifo))
{
u8 thread_index = proxy_tx_fifo->master_thread_index;
- u32 session_index = proxy_tx_fifo->shr->master_session_index;
+ u32 session_index = proxy_tx_fifo->vpp_session_index;
return session_send_io_evt_to_thread_custom (&session_index,
thread_index,
SESSION_IO_EVT_TX);
diff --git a/src/plugins/hs_apps/sapi/vpp_echo.c b/src/plugins/hs_apps/sapi/vpp_echo.c
index 08fd4e175e9..9ae95e6e8e9 100644
--- a/src/plugins/hs_apps/sapi/vpp_echo.c
+++ b/src/plugins/hs_apps/sapi/vpp_echo.c
@@ -69,9 +69,9 @@ echo_session_dequeue_notify (echo_session_t * s)
int rv;
if (!svm_fifo_set_event (s->rx_fifo))
return;
- if ((rv = app_send_io_evt_to_vpp (s->vpp_evt_q,
- s->rx_fifo->shr->master_session_index,
- SESSION_IO_EVT_RX, SVM_Q_WAIT)))
+ if ((rv =
+ app_send_io_evt_to_vpp (s->vpp_evt_q, s->rx_fifo->vpp_session_index,
+ SESSION_IO_EVT_RX, SVM_Q_WAIT)))
ECHO_FAIL (ECHO_FAIL_SEND_IO_EVT, "app_send_io_evt_to_vpp errored %d",
rv);
svm_fifo_clear_deq_ntf (s->rx_fifo);
diff --git a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c
index 868cc3a0591..12be20503a3 100644
--- a/src/plugins/hs_apps/sapi/vpp_echo_bapi.c
+++ b/src/plugins/hs_apps/sapi/vpp_echo_bapi.c
@@ -332,6 +332,10 @@ echo_attach_session (uword segment_handle, uword rxf_offset, uword txf_offset,
s->tx_fifo = fifo_segment_alloc_fifo_w_offset (fs, txf_offset);
s->rx_fifo->segment_index = fs_index;
s->tx_fifo->segment_index = fs_index;
+ s->rx_fifo->vpp_session_index = s->rx_fifo->shr->master_session_index;
+ s->tx_fifo->vpp_session_index = s->tx_fifo->shr->master_session_index;
+ s->rx_fifo->app_session_index = s->session_index;
+ s->tx_fifo->app_session_index = s->session_index;
s->rx_fifo->shr->client_session_index = s->session_index;
s->tx_fifo->shr->client_session_index = s->session_index;
diff --git a/src/plugins/unittest/session_test.c b/src/plugins/unittest/session_test.c
index fe4664bda4a..993f1be41a9 100644
--- a/src/plugins/unittest/session_test.c
+++ b/src/plugins/unittest/session_test.c
@@ -1864,7 +1864,7 @@ test_app_send_io_evt_rx (app_worker_t *app_wrk, session_t *s)
if (svm_fifo_has_event (s->rx_fifo))
return 0;
- app_session = s->rx_fifo->shr->client_session_index;
+ app_session = s->rx_fifo->app_session_index;
mq = app_wrk->event_queue;
rv = test_mq_try_lock_and_alloc_msg (mq, SESSION_MQ_IO_EVT_RING, mq_msg);
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c
index d5f62913082..86f4ff2d0d2 100644
--- a/src/svm/fifo_segment.c
+++ b/src/svm/fifo_segment.c
@@ -969,6 +969,7 @@ fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
if (CLIB_DEBUG)
{
sf->master_session_index = ~0;
+ f->vpp_session_index = ~0;
f->master_thread_index = ~0;
}
@@ -1002,12 +1003,12 @@ fifo_segment_detach_fifo (fifo_segment_t *fs, svm_fifo_t **f)
pfss_fifo_del_active_list (pfss, of);
/* Collect chunks that were provided in return for those detached */
- fsh_slice_collect_chunks (fs->h, fss, of->chunks_at_attach);
- of->chunks_at_attach = 0;
+ fsh_slice_collect_chunks (fs->h, fss, svm_fifo_chunks_at_attach (of));
+ svm_fifo_chunks_at_attach (of) = 0;
/* Collect hdr that was provided in return for the detached */
- fss_fifo_free_list_push (fs->h, fss, of->hdr_at_attach);
- of->hdr_at_attach = 0;
+ fss_fifo_free_list_push (fs->h, fss, svm_fifo_hdr_at_attach (of));
+ svm_fifo_hdr_at_attach (of) = 0;
clib_mem_bulk_free (pfss->fifos, *f);
*f = 0;
@@ -1034,10 +1035,11 @@ fifo_segment_attach_fifo (fifo_segment_t *fs, svm_fifo_t **f, u32 slice_index)
/* Allocate shared hdr and chunks to be collected at detach in return
* for those that are being attached now */
of = *f;
- of->hdr_at_attach = fsh_try_alloc_fifo_hdr (fs->h, fss);
+ svm_fifo_hdr_at_attach (of) = fsh_try_alloc_fifo_hdr (fs->h, fss);
c = fs_chunk_ptr (fs->h, nf->shr->start_chunk);
- of->chunks_at_attach = pc = fsh_try_alloc_chunk (fs->h, fss, c->length);
+ svm_fifo_chunks_at_attach (of) = pc =
+ fsh_try_alloc_chunk (fs->h, fss, c->length);
while ((c = fs_chunk_ptr (fs->h, c->next)))
{
diff --git a/src/svm/fifo_types.h b/src/svm/fifo_types.h
index 742351b1764..e4b72eaf1ab 100644
--- a/src/svm/fifo_types.h
+++ b/src/svm/fifo_types.h
@@ -101,23 +101,39 @@ typedef struct _svm_fifo
u32 ooos_newest; /**< Last segment to have been updated */
u8 flags; /**< fifo flags */
- u8 master_thread_index; /**< session layer thread index */
- u8 client_thread_index; /**< app worker index */
i8 refcnt; /**< reference count */
- u32 segment_manager; /**< session layer segment manager index */
- u32 segment_index; /**< segment index in segment manager */
+ u8 client_thread_index; /**< app worker index */
+ u32 app_session_index; /**< app session index */
+ union
+ {
+ struct
+ {
+ u32 vpp_session_index; /**< session layer session index */
+ u32 master_thread_index; /**< session layer thread index */
+ };
+ u64 vpp_sh;
+ };
+ u32 segment_manager; /**< session layer segment manager index */
+ u32 segment_index; /**< segment index in segment manager */
struct _svm_fifo *next; /**< prev in active chain */
struct _svm_fifo *prev; /**< prev in active chain */
- svm_fifo_chunk_t *chunks_at_attach; /**< chunks to be accounted at detach */
- svm_fifo_shared_t *hdr_at_attach; /**< hdr to be freed at detach */
-
#if SVM_FIFO_TRACE
svm_fifo_trace_elem_t *trace;
#endif
} svm_fifo_t;
+/* To minimize size of svm_fifo_t reuse ooo pointers for tracking chunks and
+ * hdr at attach/detach. Fifo being migrated should not receive new data */
+#define svm_fifo_chunks_at_attach(f) f->ooo_deq
+#define svm_fifo_hdr_at_attach(f) \
+ ((union { \
+ svm_fifo_shared_t *hdr; \
+ svm_fifo_chunk_t *ooo_enq; \
+ } *) &f->ooo_enq) \
+ ->hdr
+
typedef struct fifo_segment_slice_
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline);
diff --git a/src/svm/svm_fifo.c b/src/svm/svm_fifo.c
index 49b3d1728f3..6107ea1a5c8 100644
--- a/src/svm/svm_fifo.c
+++ b/src/svm/svm_fifo.c
@@ -1650,8 +1650,8 @@ format_svm_fifo (u8 * s, va_list * args)
if (verbose > 1)
s = format (s, "%Uvpp session %d thread %d app session %d thread %d\n",
- format_white_space, indent, f->shr->master_session_index,
- f->master_thread_index, f->shr->client_session_index,
+ format_white_space, indent, f->vpp_session_index,
+ f->master_thread_index, f->app_session_index,
f->client_thread_index);
if (verbose)
diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c
index d3ad2331827..d9814394f0d 100644
--- a/src/vcl/vcl_private.c
+++ b/src/vcl/vcl_private.c
@@ -600,8 +600,12 @@ vcl_segment_attach_session (uword segment_handle, uword rxf_offset,
if (!is_ct)
{
+ rxf->vpp_session_index = rxf->shr->master_session_index;
+ txf->vpp_session_index = txf->shr->master_session_index;
rxf->shr->client_session_index = s->session_index;
txf->shr->client_session_index = s->session_index;
+ rxf->app_session_index = s->session_index;
+ txf->app_session_index = s->session_index;
rxf->client_thread_index = vcl_get_worker_index ();
txf->client_thread_index = vcl_get_worker_index ();
s->rx_fifo = rxf;
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index e1eba2993ca..19d58c349b7 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -659,8 +659,7 @@ vcl_session_migrated_handler (vcl_worker_t * wrk, void *data)
/* Generate new tx event if we have outstanding data */
if (svm_fifo_has_event (s->tx_fifo))
- app_send_io_evt_to_vpp (s->vpp_evt_q,
- s->tx_fifo->shr->master_session_index,
+ app_send_io_evt_to_vpp (s->vpp_evt_q, s->tx_fifo->vpp_session_index,
SESSION_IO_EVT_TX, SVM_Q_WAIT);
VDBG (0, "Migrated 0x%lx to thread %u 0x%lx", mp->handle,
@@ -2201,8 +2200,7 @@ read_again:
if (PREDICT_FALSE (svm_fifo_needs_deq_ntf (rx_fifo, n_read)))
{
svm_fifo_clear_deq_ntf (rx_fifo);
- app_send_io_evt_to_vpp (s->vpp_evt_q,
- s->rx_fifo->shr->master_session_index,
+ app_send_io_evt_to_vpp (s->vpp_evt_q, s->rx_fifo->vpp_session_index,
SESSION_IO_EVT_RX, SVM_Q_WAIT);
}
@@ -2407,8 +2405,8 @@ vppcom_session_write_inline (vcl_worker_t *wrk, vcl_session_t *s, void *buf,
}
if (svm_fifo_set_event (s->tx_fifo))
- app_send_io_evt_to_vpp (
- s->vpp_evt_q, s->tx_fifo->shr->master_session_index, et, SVM_Q_WAIT);
+ app_send_io_evt_to_vpp (s->vpp_evt_q, s->tx_fifo->vpp_session_index, et,
+ SVM_Q_WAIT);
/* The underlying fifo segment can run out of memory */
if (PREDICT_FALSE (n_write < 0))
diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h
index d5656ff8341..21ed97998f2 100644
--- a/src/vnet/session/application_interface.h
+++ b/src/vnet/session/application_interface.h
@@ -688,8 +688,8 @@ app_send_dgram_raw_gso (svm_fifo_t *f, app_session_transport_t *at,
if (do_evt)
{
if (svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f->shr->master_session_index,
- evt_type, noblock);
+ app_send_io_evt_to_vpp (vpp_evt_q, f->vpp_session_index, evt_type,
+ noblock);
}
return len;
}
@@ -712,8 +712,8 @@ app_send_stream_raw (svm_fifo_t * f, svm_msg_q_t * vpp_evt_q, u8 * data,
if (do_evt)
{
if (rv > 0 && svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f->shr->master_session_index,
- evt_type, noblock);
+ app_send_io_evt_to_vpp (vpp_evt_q, f->vpp_session_index, evt_type,
+ noblock);
}
return rv;
}
diff --git a/src/vnet/session/application_local.c b/src/vnet/session/application_local.c
index 0800ce2b041..18ea77dc8a8 100644
--- a/src/vnet/session/application_local.c
+++ b/src/vnet/session/application_local.c
@@ -647,8 +647,8 @@ ct_init_accepted_session (app_worker_t *server_wrk, ct_connection_t *ct,
ls->rx_fifo->shr->master_session_index = ls->session_index;
ls->tx_fifo->shr->master_session_index = ls->session_index;
- ls->rx_fifo->master_thread_index = ls->thread_index;
- ls->tx_fifo->master_thread_index = ls->thread_index;
+ ls->rx_fifo->vpp_sh = ls->handle;
+ ls->tx_fifo->vpp_sh = ls->handle;
seg_handle = segment_manager_segment_handle (sm, fs);
segment_manager_segment_reader_unlock (sm);
diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c
index cae340cd64e..ad0b18e8d75 100644
--- a/src/vnet/session/application_worker.c
+++ b/src/vnet/session/application_worker.c
@@ -175,10 +175,10 @@ app_worker_alloc_session_fifos (segment_manager_t * sm, session_t * s)
return rv;
rx_fifo->shr->master_session_index = s->session_index;
- rx_fifo->master_thread_index = s->thread_index;
+ rx_fifo->vpp_sh = s->handle;
tx_fifo->shr->master_session_index = s->session_index;
- tx_fifo->master_thread_index = s->thread_index;
+ tx_fifo->vpp_sh = s->handle;
s->rx_fifo = rx_fifo;
s->tx_fifo = tx_fifo;
@@ -210,10 +210,10 @@ app_worker_alloc_wrk_cl_session (app_worker_t *app_wrk, session_t *ls)
&tx_fifo);
rx_fifo->shr->master_session_index = s->session_index;
- rx_fifo->master_thread_index = s->thread_index;
+ rx_fifo->vpp_sh = s->handle;
tx_fifo->shr->master_session_index = s->session_index;
- tx_fifo->master_thread_index = s->thread_index;
+ tx_fifo->vpp_sh = s->handle;
s->rx_fifo = rx_fifo;
s->tx_fifo = tx_fifo;
diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c
index 2b44d92e0b5..8c8b904c33d 100644
--- a/src/vnet/session/segment_manager.c
+++ b/src/vnet/session/segment_manager.c
@@ -625,7 +625,7 @@ segment_manager_del_sessions (segment_manager_t * sm)
*/
while (f)
{
- session = session_get_if_valid (f->shr->master_session_index,
+ session = session_get_if_valid (f->vpp_session_index,
f->master_thread_index);
if (session)
vec_add1 (handles, session_handle (session));
@@ -672,7 +672,7 @@ segment_manager_del_sessions_filter (segment_manager_t *sm,
f = fifo_segment_get_slice_fifo_list (fs, slice_index);
while (f)
{
- session = session_get_if_valid (f->shr->master_session_index,
+ session = session_get_if_valid (f->vpp_session_index,
f->master_thread_index);
if (session)
{
@@ -920,7 +920,7 @@ segment_manager_attach_fifo (segment_manager_t *sm, svm_fifo_t **f,
segment_manager_segment_reader_unlock (sm);
(*f)->shr->master_session_index = s->session_index;
- (*f)->master_thread_index = s->thread_index;
+ (*f)->vpp_sh = s->handle;
}
u32
@@ -1195,7 +1195,7 @@ segment_manager_format_sessions (segment_manager_t * sm, int verbose)
u32 session_index, thread_index;
session_t *session;
- session_index = f->shr->master_session_index;
+ session_index = f->vpp_session_index;
thread_index = f->master_thread_index;
session = session_get (session_index, thread_index);
diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c
index cc0e89fd1e2..1b6e8ce6c6e 100644
--- a/src/vnet/session/session.c
+++ b/src/vnet/session/session.c
@@ -86,7 +86,7 @@ session_send_evt_to_thread (void *data, void *args, u32 thread_index,
int
session_send_io_evt_to_thread (svm_fifo_t * f, session_evt_type_t evt_type)
{
- return session_send_evt_to_thread (&f->shr->master_session_index, 0,
+ return session_send_evt_to_thread (&f->vpp_session_index, 0,
f->master_thread_index, evt_type);
}
diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c
index c6df47b412b..5ac21c4eb85 100644
--- a/src/vnet/session/session_api.c
+++ b/src/vnet/session/session_api.c
@@ -426,9 +426,12 @@ mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context,
}
/* Setup client session index in advance, in case data arrives
- * before the app processes message and updates it */
+ * before the app processes message and updates it
+ * Maybe this needs to be done via a reply message from app */
s->rx_fifo->shr->client_session_index = api_context;
s->tx_fifo->shr->client_session_index = api_context;
+ s->rx_fifo->app_session_index = api_context;
+ s->tx_fifo->app_session_index = api_context;
snd_msg:
@@ -637,7 +640,7 @@ mq_send_io_rx_event (session_t *s)
mq_evt = svm_msg_q_msg_data (mq, &mq_msg);
mq_evt->event_type = SESSION_IO_EVT_RX;
- mq_evt->session_index = s->rx_fifo->shr->client_session_index;
+ mq_evt->session_index = s->rx_fifo->app_session_index;
(void) svm_fifo_set_event (s->rx_fifo);
@@ -658,7 +661,7 @@ mq_send_io_tx_event (session_t *s)
mq_evt = svm_msg_q_msg_data (mq, &mq_msg);
mq_evt->event_type = SESSION_IO_EVT_TX;
- mq_evt->session_index = s->tx_fifo->shr->client_session_index;
+ mq_evt->session_index = s->tx_fifo->app_session_index;
svm_msg_q_add_raw (mq, &mq_msg);
diff --git a/src/vnet/session/session_debug.c b/src/vnet/session/session_debug.c
index 2a50adac5dd..158751c4eed 100644
--- a/src/vnet/session/session_debug.c
+++ b/src/vnet/session/session_debug.c
@@ -278,7 +278,7 @@ session_node_cmp_event (session_event_t * e, svm_fifo_t * f)
case SESSION_IO_EVT_BUILTIN_RX:
case SESSION_IO_EVT_TX_MAIN:
case SESSION_IO_EVT_TX_FLUSH:
- if (e->session_index == f->shr->master_session_index)
+ if (e->session_index == f->vpp_session_index)
return 1;
break;
case SESSION_CTRL_EVT_CLOSE:
diff --git a/src/vnet/session/session_node.c b/src/vnet/session/session_node.c
index 4d86d409e98..1d4f45e073b 100644
--- a/src/vnet/session/session_node.c
+++ b/src/vnet/session/session_node.c
@@ -474,6 +474,10 @@ session_mq_accepted_reply_handler (session_worker_t *wrk,
return;
}
+ /* TODO(fcoras) This needs to be part of the reply message */
+ s->rx_fifo->app_session_index = s->rx_fifo->shr->client_session_index;
+ s->tx_fifo->app_session_index = s->tx_fifo->shr->client_session_index;
+
/* Special handling for cut-through sessions */
if (!session_has_transport (s))
{