vcl/session: tx notifications for cut-thru sessions
[vpp.git] / src / vcl / vppcom.c
index 037df99..e70aa00 100644 (file)
@@ -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);