session: push tx notifications only if needed 33/13433/3
authorFlorin Coras <fcoras@cisco.com>
Wed, 11 Jul 2018 12:25:06 +0000 (05:25 -0700)
committerDave Barach <openvpp@barachs.net>
Wed, 11 Jul 2018 23:10:09 +0000 (23:10 +0000)
VPP-1340

Change-Id: Ia3f2fc054dbfb2ba912a768c70466e7042024e32
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/svm/svm_fifo.h
src/vnet/session/session_node.c

index 90a49c0..0d5a08b 100644 (file)
@@ -113,6 +113,12 @@ svm_fifo_max_enqueue (svm_fifo_t * f)
   return f->nitems - svm_fifo_max_dequeue (f);
 }
 
+static inline int
+svm_fifo_has_event (svm_fifo_t * f)
+{
+  return f->has_event;
+}
+
 static inline u8
 svm_fifo_has_ooo_data (svm_fifo_t * f)
 {
index aec353d..85fd28d 100644 (file)
@@ -653,6 +653,7 @@ skip_dequeue:
     {
       stream_session_t *s;     /* $$$ prefetch 1 ahead maybe */
       session_fifo_event_t *e;
+      u32 to_dequeue;
 
       e = &fifo_events[i];
       switch (e->event_type)
@@ -671,6 +672,7 @@ skip_dequeue:
              clib_warning ("It's dead, Jim!");
              continue;
            }
+         to_dequeue = svm_fifo_max_dequeue (s->server_tx_fifo);
 
          /* Spray packets in per session type frames, since they go to
           * different nodes */
@@ -678,7 +680,10 @@ skip_dequeue:
                                                       &n_tx_packets);
          if (PREDICT_TRUE (rv == SESSION_TX_OK))
            {
-             session_dequeue_notify (s);
+             /* Notify app there's tx space if not polling */
+             if (PREDICT_FALSE (to_dequeue == s->server_tx_fifo->nitems
+                                && !svm_fifo_has_event (s->server_tx_fifo)))
+               session_dequeue_notify (s);
            }
          else if (PREDICT_FALSE (rv == SESSION_TX_NO_BUFFERS))
            {