vcl/ldp: select cleanup/improvements

Change-Id: I640e69388f2ab0f66ad60c5165c749f5a5a9f525
Signed-off-by: Florin Coras <fcoras@cisco.com>
This commit is contained in:
Florin Coras
2019-01-07 17:49:17 -08:00
parent 98311da8b4
commit 294afe297c
4 changed files with 231 additions and 262 deletions

File diff suppressed because it is too large Load Diff

View File

@ -90,6 +90,11 @@ typedef struct
u32 et_mask;
} vppcom_epoll_t;
/* Select uses the vcl_si_set as if a clib_bitmap. Make sure they are the
* same size */
STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (vcl_si_set),
"vppcom bitmap size mismatch");
typedef struct
{
u8 is_ip4;

View File

@ -2043,18 +2043,17 @@ vppcom_session_write_ready (vcl_session_t * session)
/* Assumes caller has acquired spinlock: vcm->sessions_lockp */
if (PREDICT_FALSE (session->is_vep))
{
clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: "
"cannot write to an epoll session!",
getpid (), session->vpp_handle, session->session_index);
VDBG (0, "session %u [0x%llx]: cannot write to an epoll session!",
session->session_index, session->vpp_handle);
return VPPCOM_EBADFD;
}
if (PREDICT_FALSE (session->session_state & STATE_LISTEN))
{
clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: "
"cannot write to a listen session!",
getpid (), session->vpp_handle, session->session_index);
return VPPCOM_EBADFD;
if (session->tx_fifo)
return svm_fifo_max_enqueue (session->tx_fifo);
else
return VPPCOM_EBADFD;
}
if (PREDICT_FALSE (!(session->session_state & STATE_OPEN)))
@ -2063,19 +2062,13 @@ vppcom_session_write_ready (vcl_session_t * session)
int rv;
rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN);
clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: "
"session is not open! state 0x%x (%s), "
"returning %d (%s)", getpid (), session->vpp_handle,
session->session_index,
state, vppcom_session_state_str (state),
rv, vppcom_retval_str (rv));
VDBG (0, "session %u [0x%llx]: session is not open! state 0x%x (%s), "
"returning %d (%s)", session->session_index, session->vpp_handle,
state, vppcom_session_state_str (state), rv,
vppcom_retval_str (rv));
return rv;
}
VDBG (3, "VCL<%d>: vpp handle 0x%llx, sid %u: peek %s (%p), ready = %d",
getpid (), session->vpp_handle, session->session_index,
session->tx_fifo, svm_fifo_max_enqueue (session->tx_fifo));
return svm_fifo_max_enqueue (session->tx_fifo);
}
@ -2248,15 +2241,15 @@ vcl_select_handle_mq (vcl_worker_t * wrk, svm_msg_q_t * mq,
}
static int
vppcom_select_condvar (vcl_worker_t * wrk, unsigned long n_bits,
unsigned long *read_map, unsigned long *write_map,
unsigned long *except_map, double time_to_wait,
vppcom_select_condvar (vcl_worker_t * wrk, int n_bits,
vcl_si_set * read_map, vcl_si_set * write_map,
vcl_si_set * except_map, double time_to_wait,
u32 * bits_set)
{
double total_wait = 0, wait_slice;
vcl_cut_through_registration_t *cr;
time_to_wait = (time_to_wait == -1) ? 10e9 : time_to_wait;
time_to_wait = (time_to_wait == -1) ? 1e6 : time_to_wait;
wait_slice = wrk->cut_through_registrations ? 10e-6 : time_to_wait;
do
{
@ -2270,7 +2263,7 @@ vppcom_select_condvar (vcl_worker_t * wrk, unsigned long n_bits,
vcl_ct_registration_unlock (wrk);
vcl_select_handle_mq (wrk, wrk->app_event_queue, n_bits, read_map,
write_map, except_map, time_to_wait, bits_set);
write_map, except_map, wait_slice, bits_set);
total_wait += wait_slice;
if (*bits_set)
return *bits_set;
@ -2281,9 +2274,9 @@ vppcom_select_condvar (vcl_worker_t * wrk, unsigned long n_bits,
}
static int
vppcom_select_eventfd (vcl_worker_t * wrk, unsigned long n_bits,
unsigned long *read_map, unsigned long *write_map,
unsigned long *except_map, double time_to_wait,
vppcom_select_eventfd (vcl_worker_t * wrk, int n_bits,
vcl_si_set * read_map, vcl_si_set * write_map,
vcl_si_set * except_map, double time_to_wait,
u32 * bits_set)
{
vcl_mq_evt_conn_t *mqc;
@ -2306,44 +2299,34 @@ vppcom_select_eventfd (vcl_worker_t * wrk, unsigned long n_bits,
}
int
vppcom_select (unsigned long n_bits, unsigned long *read_map,
unsigned long *write_map, unsigned long *except_map,
double time_to_wait)
vppcom_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map,
vcl_si_set * except_map, double time_to_wait)
{
u32 sid, minbits = clib_max (n_bits, BITS (uword)), bits_set = 0;
vcl_worker_t *wrk = vcl_worker_get_current ();
vcl_session_t *session = 0;
int rv, i;
STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (unsigned long),
"vppcom bitmap size mismatch");
STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (fd_mask),
"vppcom bitmap size mismatch");
STATIC_ASSERT (sizeof (clib_bitmap_t) == sizeof (uword),
"vppcom bitmap size mismatch");
if (n_bits && read_map)
{
clib_bitmap_validate (wrk->rd_bitmap, minbits);
clib_memcpy_fast (wrk->rd_bitmap, read_map,
vec_len (wrk->rd_bitmap) * sizeof (unsigned long));
memset (read_map, 0, vec_len (wrk->rd_bitmap) * sizeof (unsigned long));
vec_len (wrk->rd_bitmap) * sizeof (vcl_si_set));
memset (read_map, 0, vec_len (wrk->rd_bitmap) * sizeof (vcl_si_set));
}
if (n_bits && write_map)
{
clib_bitmap_validate (wrk->wr_bitmap, minbits);
clib_memcpy_fast (wrk->wr_bitmap, write_map,
vec_len (wrk->wr_bitmap) * sizeof (unsigned long));
memset (write_map, 0,
vec_len (wrk->wr_bitmap) * sizeof (unsigned long));
vec_len (wrk->wr_bitmap) * sizeof (vcl_si_set));
memset (write_map, 0, vec_len (wrk->wr_bitmap) * sizeof (vcl_si_set));
}
if (n_bits && except_map)
{
clib_bitmap_validate (wrk->ex_bitmap, minbits);
clib_memcpy_fast (wrk->ex_bitmap, except_map,
vec_len (wrk->ex_bitmap) * sizeof (unsigned long));
memset (except_map, 0,
vec_len (wrk->ex_bitmap) * sizeof (unsigned long));
vec_len (wrk->ex_bitmap) * sizeof (vcl_si_set));
memset (except_map, 0, vec_len (wrk->ex_bitmap) * sizeof (vcl_si_set));
}
if (!n_bits)
@ -2367,6 +2350,8 @@ vppcom_select (unsigned long n_bits, unsigned long *read_map,
clib_bitmap_set_no_check ((uword*)write_map, sid, 1);
bits_set++;
}
else
svm_fifo_set_want_tx_evt (session->tx_fifo, 1);
}));
check_rd:

View File

@ -173,6 +173,8 @@ typedef struct vppcom_data_segment_
typedef vppcom_data_segment_t vppcom_data_segments_t[2];
typedef unsigned long vcl_si_set;
/*
* VPPCOM Public API Functions
*/
@ -259,10 +261,9 @@ extern int vppcom_session_write (uint32_t session_handle, void *buf,
extern int vppcom_session_write_msg (uint32_t session_handle, void *buf,
size_t n);
extern int vppcom_select (unsigned long n_bits,
unsigned long *read_map,
unsigned long *write_map,
unsigned long *except_map, double wait_for_time);
extern int vppcom_select (int n_bits, vcl_si_set * read_map,
vcl_si_set * write_map, vcl_si_set * except_map,
double wait_for_time);
extern int vppcom_epoll_create (void);
extern int vppcom_epoll_ctl (uint32_t vep_handle, int op,