if (wrk->mqs_epfd > 0)
close (wrk->mqs_epfd);
+ pool_free (wrk->sessions);
+ pool_free (wrk->mq_evt_conns);
hash_free (wrk->session_index_by_vpp_handles);
vec_free (wrk->mq_events);
vec_free (wrk->mq_msg_vector);
+ vec_free (wrk->unhandled_evts_vector);
+ vec_free (wrk->pending_session_wrk_updates);
+ clib_bitmap_free (wrk->rd_bitmap);
+ clib_bitmap_free (wrk->wr_bitmap);
+ clib_bitmap_free (wrk->ex_bitmap);
vcl_worker_free (wrk);
clib_spinlock_unlock (&vcm->workers_lock);
}
if (vcl_get_worker_index () != ~0)
return 0;
+ /* Grab lock before selecting mem thread index */
+ clib_spinlock_lock (&vcm->workers_lock);
+
/* Use separate heap map entry for worker */
clib_mem_set_thread_index ();
if (pool_elts (vcm->workers) == vcm->cfg.max_workers)
{
VDBG (0, "max-workers %u limit reached", vcm->cfg.max_workers);
- return 0;
+ wrk = 0;
+ goto done;
}
- clib_spinlock_lock (&vcm->workers_lock);
wrk = vcl_worker_alloc ();
vcl_set_worker_index (wrk->wrk_index);
wrk->thread_id = pthread_self ();
}
}
+ wrk->ep_lt_current = VCL_INVALID_SESSION_INDEX;
wrk->session_index_by_vpp_handles = hash_create (0, sizeof (uword));
clib_time_init (&wrk->clib_time);
vec_validate (wrk->mq_events, 64);
vec_reset_length (wrk->mq_msg_vector);
vec_validate (wrk->unhandled_evts_vector, 128);
vec_reset_length (wrk->unhandled_evts_vector);
- clib_spinlock_unlock (&vcm->workers_lock);
done:
+ clib_spinlock_unlock (&vcm->workers_lock);
return wrk;
}
else
return VPPCOM_EBADFD;
}
+ else if (s->session_state == VCL_STATE_UPDATED)
+ {
+ return 0;
+ }
else
{
return (s->session_state == VCL_STATE_DISCONNECT) ?
int
vcl_segment_attach_session (uword segment_handle, uword rxf_offset,
- uword txf_offset, uword mq_offset, u8 is_ct,
- vcl_session_t *s)
+ uword txf_offset, uword mq_offset, u32 mq_index,
+ u8 is_ct, vcl_session_t *s)
{
u32 fs_index, eqs_index;
svm_fifo_t *rxf, *txf;
if (!is_ct && mq_offset != (uword) ~0)
{
fs = fifo_segment_get_segment (&vcm->segment_main, eqs_index);
- s->vpp_evt_q =
- fifo_segment_msg_q_attach (fs, mq_offset, rxf->shr->slice_index);
+ s->vpp_evt_q = fifo_segment_msg_q_attach (fs, mq_offset, mq_index);
}
clib_rwlock_reader_unlock (&vcm->segment_table_lock);
return c;
}
+int
+vcl_session_share_fifos (vcl_session_t *s, svm_fifo_t *rxf, svm_fifo_t *txf)
+{
+ vcl_worker_t *wrk = vcl_worker_get_current ();
+ fifo_segment_t *fs;
+
+ clib_rwlock_reader_lock (&vcm->segment_table_lock);
+
+ fs = fifo_segment_get_segment (&vcm->segment_main, rxf->segment_index);
+ s->rx_fifo = fifo_segment_duplicate_fifo (fs, rxf);
+ s->tx_fifo = fifo_segment_duplicate_fifo (fs, txf);
+
+ clib_rwlock_reader_unlock (&vcm->segment_table_lock);
+
+ svm_fifo_add_subscriber (s->rx_fifo, wrk->vpp_wrk_index);
+ svm_fifo_add_subscriber (s->tx_fifo, wrk->vpp_wrk_index);
+
+ return 0;
+}
+
/*
* fd.io coding-style-patch-verification: ON
*