Skip to content

Commit

Permalink
vcl: always fill buffer or drain rx fifo
Browse files Browse the repository at this point in the history
Type: improvement

Signed-off-by: Florin Coras <[email protected]>
Change-Id: Ibbe438aa6f2fe6d9f55c56ca6d3aec1a29b32cad
  • Loading branch information
florincoras authored and Dave Barach committed Sep 14, 2020
1 parent a26b0d1 commit 4a2c794
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions src/vcl/vppcom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1892,7 +1892,7 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n,
u8 peek)
{
vcl_worker_t *wrk = vcl_worker_get_current ();
int n_read = 0, is_nonblocking;
int rv, n_read = 0, is_nonblocking;
vcl_session_t *s = 0;
svm_fifo_t *rx_fifo;
svm_msg_q_msg_t msg;
Expand Down Expand Up @@ -1949,23 +1949,35 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n,
}
}

read_again:

if (s->is_dgram)
n_read = app_recv_dgram_raw (rx_fifo, buf, n, &s->transport, 0, peek);
rv = app_recv_dgram_raw (rx_fifo, buf, n, &s->transport, 0, peek);
else
n_read = app_recv_stream_raw (rx_fifo, buf, n, 0, peek);
rv = app_recv_stream_raw (rx_fifo, buf, n, 0, peek);

ASSERT (rv >= 0);
n_read += rv;

if (svm_fifo_is_empty_cons (rx_fifo))
{
svm_fifo_unset_event (s->rx_fifo);
if (!svm_fifo_is_empty_cons (rx_fifo)
&& svm_fifo_set_event (s->rx_fifo) && is_nonblocking)
{
session_event_t *e;
vec_add2 (wrk->unhandled_evts_vector, e, 1);
e->event_type = SESSION_IO_EVT_RX;
e->session_index = s->session_index;
}
}
else if (PREDICT_FALSE (rv < n))
{
/* More data enqueued while reading. Try to drain it
* or fill the buffer */
buf += rv;
n -= rv;
goto read_again;
}

if (PREDICT_FALSE (svm_fifo_needs_deq_ntf (rx_fifo, n_read)))
{
Expand Down

0 comments on commit 4a2c794

Please sign in to comment.