X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=e70aa0017723cd84f244af062e15f65b007ea30e;hb=317b8e08367c769b90463613231b9fcfad486098;hp=037df995510676b9f1291d38257f309dc491b464;hpb=5e06257cb892b7dc784025fe7d84c50882425831;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 037df995510..e70aa001772 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -1496,14 +1496,14 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n, rx_fifo = is_ct ? s->ct_rx_fifo : s->rx_fifo; s->has_rx_evt = 0; - if (svm_fifo_is_empty (rx_fifo)) + if (svm_fifo_is_empty_cons (rx_fifo)) { if (is_nonblocking) { svm_fifo_unset_event (s->rx_fifo); return VPPCOM_EWOULDBLOCK; } - while (svm_fifo_is_empty (rx_fifo)) + while (svm_fifo_is_empty_cons (rx_fifo)) { if (vcl_session_is_closing (s)) return vcl_session_closing_error (s); @@ -1527,9 +1527,17 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n, else n_read = app_recv_stream_raw (rx_fifo, buf, n, 0, peek); - if (svm_fifo_is_empty (rx_fifo)) + if (svm_fifo_is_empty_cons (rx_fifo)) svm_fifo_unset_event (s->rx_fifo); + /* Cut-through sessions might request tx notifications on rx fifos */ + if (PREDICT_FALSE (rx_fifo->want_tx_ntf)) + { + app_send_io_evt_to_vpp (s->vpp_evt_q, s->rx_fifo->master_session_index, + SESSION_IO_EVT_RX, SVM_Q_WAIT); + svm_fifo_reset_tx_ntf (s->rx_fifo); + } + VDBG (2, "session %u[0x%llx]: read %d bytes from (%p)", s->session_index, s->vpp_handle, n_read, rx_fifo); @@ -1577,14 +1585,14 @@ vppcom_session_read_segments (uint32_t session_handle, if (is_ct) svm_fifo_unset_event (s->rx_fifo); - if (svm_fifo_is_empty (rx_fifo)) + if (svm_fifo_is_empty_cons (rx_fifo)) { if (is_nonblocking) { svm_fifo_unset_event (rx_fifo); return VPPCOM_EWOULDBLOCK; } - while (svm_fifo_is_empty (rx_fifo)) + while (svm_fifo_is_empty_cons (rx_fifo)) { if (vcl_session_is_closing (s)) return vcl_session_closing_error (s); @@ -1681,14 +1689,15 @@ vppcom_session_write_inline (uint32_t session_handle, void *buf, size_t n, is_ct = vcl_session_is_ct (s); tx_fifo = is_ct ? s->ct_tx_fifo : s->tx_fifo; is_nonblocking = VCL_SESS_ATTR_TEST (s->attr, VCL_SESS_ATTR_NONBLOCK); + mq = wrk->app_event_queue; - if (svm_fifo_is_full (tx_fifo)) + if (svm_fifo_is_full_prod (tx_fifo)) { if (is_nonblocking) { return VPPCOM_EWOULDBLOCK; } - while (svm_fifo_is_full (tx_fifo)) + while (svm_fifo_is_full_prod (tx_fifo)) { svm_fifo_add_want_tx_ntf (tx_fifo, SVM_FIFO_WANT_TX_NOTIF); if (vcl_session_is_closing (s)) @@ -2003,7 +2012,7 @@ vppcom_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map, continue; } - rv = svm_fifo_is_full (session->tx_fifo); + rv = svm_fifo_is_full_prod (session->tx_fifo); if (!rv) { clib_bitmap_set_no_check ((uword*)write_map, sid, 1);